diff --git a/bin/archive b/bin/archive
index 17cf116..a0b7a0b 100755
--- a/bin/archive
+++ b/bin/archive
@@ -15,7 +15,7 @@ puts "references:"
urls.each do |url|
page_content = `curl -s #{url}`
- text_content = `lynx -dump --display_charset=utf-8 #{url}`
+ text_content = `w3m -dump -T text/html -o display_link_number=1 #{url}`
begin
title = page_content
diff --git a/static/archive/aaronmbushnell-com-x5e6nn.txt b/static/archive/aaronmbushnell-com-x5e6nn.txt
index fd28cea..45b133a 100644
--- a/static/archive/aaronmbushnell-com-x5e6nn.txt
+++ b/static/archive/aaronmbushnell-com-x5e6nn.txt
@@ -1,170 +1,174 @@
- #[1]home [2]RSS
+[1] Aaron Bushnell
- [3]Aaron Bushnell
- (BUTTON)
+Hi, I'm Aaron!
- Hi, I'm Aaron!
+Born and raised in the midwest and notorious [3]golden retriever hoarder.
- Born and raised in the midwest and notorious [4]golden retriever
- hoarder.
- * Featherhour
- * Mastodon
- * GitHub
- * Twitch
- * Spotify
- * Twitter
+ • [4]
+ Featherhour
+ • [5]
+ Mastodon
+ • [6]
+ GitHub
+ • [7]
+ Twitch
+ • [8]
+ Spotify
+ • [9]
+ Twitter
- You are beautiful. ❤️
+You are beautiful. ❤️
- [5]Aaron Bushnell
+[10] Aaron Bushnell
- Hi, I'm Aaron!
+Hi, I'm Aaron!
- Born and raised in the midwest and notorious [6]golden retriever
- hoarder.
- * Featherhour
- * Mastodon
- * GitHub
- * Twitch
- * Spotify
- * Twitter
+Born and raised in the midwest and notorious [11]golden retriever hoarder.
- You are beautiful. ❤️
+ • [12]
+ Featherhour
+ • [13]
+ Mastodon
+ • [14]
+ GitHub
+ • [15]
+ Twitch
+ • [16]
+ Spotify
+ • [17]
+ Twitter
- [7]← View all posts
- August 28, 2023
+You are beautiful. ❤️
+
+[18]← View all posts
+August 28, 2023
Keep your stack short
- Not long ago [8]I wrote about using Gatsby.js on a Craft CMS project.
- If you want to learn more about that particular pairing you may want to
- read that post. But, for the sake of this one, I'll briefly summarize
- the tech stack:
+Not long ago [19]I wrote about using Gatsby.js on a Craft CMS project. If you
+want to learn more about that particular pairing you may want to read that
+post. But, for the sake of this one, I'll briefly summarize the tech stack:
- [9]Craft CMS handles the backend (content). [10]Gatsby.js, [11]GraphQL,
- and [12]React handles frontend. The on-paper benefits sound like a
- great approach for building a website:
- * Craft CMS: The best CMS out there (in my opinion)
- * React: One templating language for static-generated content and
- client-side interactivity
- * GraphQL: A centralized dataset accessible from a single API
- * Performance: Serving a compiled, static version of the site is
- extremely fast
+[20]Craft CMS handles the backend (content). [21]Gatsby.js, [22]GraphQL, and
+[23]React handles frontend. The on-paper benefits sound like a great approach
+for building a website:
- If this were a web framework's website you'd see a column of ✅s next to
- another framework's pitiful column of ❌s.
+ • Craft CMS: The best CMS out there (in my opinion)
+ • React: One templating language for static-generated content and client-side
+ interactivity
+ • GraphQL: A centralized dataset accessible from a single API
+ • Performance: Serving a compiled, static version of the site is extremely
+ fast
+
+If this were a web framework's website you'd see a column of ✅s next to another
+framework's pitiful column of ❌s.
But, there's always a catch
- There's no such thing as a free lunch and that goes double for
- programming.
+There's no such thing as a free lunch and that goes double for programming.
- If you've ever set up a system like this it's tempting to think
- that—once it's established—the hardest part is over. But, it's not.
+If you've ever set up a system like this it's tempting to think that—once it's
+established—the hardest part is over. But, it's not.
- The hardest part isn't setting it up. It's coming back to it a year
- later.
+The hardest part isn't setting it up. It's coming back to it a year later.
- A year later you're more likely to be mired in:
- * Time-consuming training and documentation for team members
- * Out-of-date dependencies
- * Updates that cause breaking changes across your stack
- * Workflows that make trivial updates time-consuming
+A year later you're more likely to be mired in:
- You wind up with a great deal of complexity that prevents you from
- adding the features your client needs ASAP. While your stack is
- conceptually well-separated and tidy, the separation itself becomes
- your greatest liability to be productive.
+ • Time-consuming training and documentation for team members
+ • Out-of-date dependencies
+ • Updates that cause breaking changes across your stack
+ • Workflows that make trivial updates time-consuming
+
+You wind up with a great deal of complexity that prevents you from adding the
+features your client needs ASAP. While your stack is conceptually
+well-separated and tidy, the separation itself becomes your greatest liability
+to be productive.
Low abstraction trends
- Maybe you've heard, but [13]there's a post or two about [14]Tailwind
- and its controversial approach.
+Maybe you've heard, but [24]there's a post or two about [25]Tailwind and its
+controversial approach.
- I'm not going to proselytize a framework or tool. But there's an
- obvious influx in tools like Tailwind that aim to reduce overhead and
- abstractions.
+I'm not going to proselytize a framework or tool. But there's an obvious influx
+in tools like Tailwind that aim to reduce overhead and abstractions.
+
+Tailwind does this by encouraging you to style your components directly in your
+templates:
- Tailwind does this by encouraging you to style your components directly
- in your templates:
- React (by way of JSX) allows you to put your structure and interactions
- into a single file. (And, if you inline your styles, you can collocate
- everything).
+React (by way of JSX) allows you to put your structure and interactions into a
+single file. (And, if you inline your styles, you can collocate everything).
+
alert('I think you are great!')}>
What do you think about me?
- Developers find value in these types of low-overhead tools because:
- 1. They can collocate a component's structure, functionality, and
- styling into a single file
- 2. Detecting "leakage" can be easier because changes to structure,
- functionality, and styling can occur in this single file
+Developers find value in these types of low-overhead tools because:
+
+ 1. They can collocate a component's structure, functionality, and styling into
+ a single file
+ 2. Detecting "leakage" can be easier because changes to structure,
+ functionality, and styling can occur in this single file
Shortening the stack
- Revisiting our Gatsby.js example, there's a similarly large distance
- between the content being stored and the views being presented. It's
- separated by tools, by protocol, and even by language. All of these
- bridges require connectors—any of which can fail for any number of
- reasons and require intervention.
+Revisiting our Gatsby.js example, there's a similarly large distance between
+the content being stored and the views being presented. It's separated by
+tools, by protocol, and even by language. All of these bridges require
+connectors—any of which can fail for any number of reasons and require
+intervention.
- But, if we were to reduce the stack from Craft CMS, Gatsby.js, GraphQL,
- and React to just Craft CMS and [15]Twig (Craft's templating language)
- it eliminates a massive set of complexity and overhead.
+But, if we were to reduce the stack from Craft CMS, Gatsby.js, GraphQL, and
+React to just Craft CMS and [26]Twig (Craft's templating language) it
+eliminates a massive set of complexity and overhead.
- Not only does it reduce a large number of dependencies, but it
- eliminates all of the connecting protocols and an entirely different
- language to keep the stack working. It means fewer bridges to cross,
- fewer competing dependencies, and a dramatically simpler stack to
- revisit a year later.
+Not only does it reduce a large number of dependencies, but it eliminates all
+of the connecting protocols and an entirely different language to keep the
+stack working. It means fewer bridges to cross, fewer competing dependencies,
+and a dramatically simpler stack to revisit a year later.
Wrapping up
- I do want to be clear in stating that this isn't an indictment against
- Gatsby.js, Craft, or a pairing between the two. Rather, I hope it
- causes you to consider all technical challenges not as something that
- needs to be solved once, but sustained indefinitely.
+I do want to be clear in stating that this isn't an indictment against
+Gatsby.js, Craft, or a pairing between the two. Rather, I hope it causes you to
+consider all technical challenges not as something that needs to be solved
+once, but sustained indefinitely.
- When you're building something it's not quite appropriate to ask "will
- this be hard to set up?". You're smart and I believe you can set it up!
+When you're building something it's not quite appropriate to ask "will this be
+hard to set up?". You're smart and I believe you can set it up!
- Instead, ask yourself: "Will this be harder a year later?"
+Instead, ask yourself: "Will this be harder a year later?"
-References
- Visible links:
- 1. https://aaronmbushnell.com/
- 2. https://aaronmbushnell.com/feed.xml
- 3. https://aaronmbushnell.com/
- 4. https://aaronmbushnell.com/images/goldens.png
- 5. https://aaronmbushnell.com/
- 6. https://aaronmbushnell.com/images/goldens.png
- 7. https://aaronmbushnell.com/
- 8. https://aaronmbushnell.com/running-gatsby-js-sites-with-craft-cms
- 9. https://craftcms.com/
- 10. https://www.gatsbyjs.com/
- 11. https://graphql.org/
- 12. https://react.dev/
- 13. https://www.google.com/search?q=site:medium.com+tailwind
- 14. https://tailwindcss.com/
- 15. https://twig.symfony.com/
+References:
- Hidden links:
- 17. https://featherhour.com/
- 18. https://mastodon.social/@aaronbushnell
- 19. https://github.com/aaronbushnell
- 20. https://www.twitch.tv/aaronbushnell
- 21. https://open.spotify.com/user/aaronmbushnell
- 22. https://twitter.com/aaronbushnell
- 23. https://featherhour.com/
- 24. https://mastodon.social/@aaronbushnell
- 25. https://github.com/aaronbushnell
- 26. https://www.twitch.tv/aaronbushnell
- 27. https://open.spotify.com/user/aaronmbushnell
- 28. https://twitter.com/aaronbushnell
+[1] https://aaronmbushnell.com/
+[3] https://aaronmbushnell.com/images/goldens.png
+[4] https://featherhour.com/
+[5] https://mastodon.social/@aaronbushnell
+[6] https://github.com/aaronbushnell
+[7] https://www.twitch.tv/aaronbushnell
+[8] https://open.spotify.com/user/aaronmbushnell
+[9] https://twitter.com/aaronbushnell
+[10] https://aaronmbushnell.com/
+[11] https://aaronmbushnell.com/images/goldens.png
+[12] https://featherhour.com/
+[13] https://mastodon.social/@aaronbushnell
+[14] https://github.com/aaronbushnell
+[15] https://www.twitch.tv/aaronbushnell
+[16] https://open.spotify.com/user/aaronmbushnell
+[17] https://twitter.com/aaronbushnell
+[18] https://aaronmbushnell.com/
+[19] https://aaronmbushnell.com/running-gatsby-js-sites-with-craft-cms
+[20] https://craftcms.com/
+[21] https://www.gatsbyjs.com/
+[22] https://graphql.org/
+[23] https://react.dev/
+[24] https://www.google.com/search?q=site%3Amedium.com+tailwind
+[25] https://tailwindcss.com/
+[26] https://twig.symfony.com/
diff --git a/static/archive/allaboutcoding-ghinda-com-jnjy0d.txt b/static/archive/allaboutcoding-ghinda-com-jnjy0d.txt
index 8b7b7e8..3d3374d 100644
--- a/static/archive/allaboutcoding-ghinda-com-jnjy0d.txt
+++ b/static/archive/allaboutcoding-ghinda-com-jnjy0d.txt
@@ -1,122 +1,158 @@
+[2]
- (BUTTON)
-
- Lucian Ghinda
-
+[4]
+[]Lucian Ghinda
All about coding
- (BUTTON) (BUTTON)
- Follow
+Follow
-[1]All about coding
+[7]All about coding
- Follow
- Ruby open source: feedbin Ruby open source: feedbin
+Follow
+[8][9][10][11][12][13][14][15]
+Ruby open source: feedbinRuby open source: feedbin
Ruby open source: feedbin
- [2]Lucian Ghinda's photo Lucian Ghinda's photo
- [3]Lucian Ghinda
- ·[4]Nov 17, 2023·
+[16][]Lucian Ghinda's photoLucian Ghinda's photo
+[17]Lucian Ghinda
+·[18]Nov 17, 2023·
- 11 min read
+11 min read
Table of contents
- * The product
- * Open source
-
- * License
-
- Technical review
- * Ruby and Rails version
- * Architecture
- * Stats
- * Style Guide
- * Storage, Persistence and in-memory storage
- * Gems used
- * Code & Design Patterns
-
- * Code Organisation
- * Routes
- * Controllers
- * Models
- * Jobs
- * Presenters
- * ApplicationComponents
- * ComponentsPreview
-
- Testing
- * Custom assertions
-
- Conclusion
+ • [19]
+ The product
+ • [20]
+ Open source
+ □ [21]
+ License
+ • [22]
+ Technical review
+ □ [23]
+ Ruby and Rails version
+ □ [24]
+ Architecture
+ □ [25]
+ Stats
+ □ [26]
+ Style Guide
+ □ [27]
+ Storage, Persistence and in-memory storage
+ □ [28]
+ Gems used
+ □ [29]
+ Code & Design Patterns
+ ☆ [30]
+ Code Organisation
+ ☆ [31]
+ Routes
+ ☆ [32]
+ Controllers
+ ☆ [33]
+ Models
+ ☆ [34]
+ Jobs
+ ☆ [35]
+ Presenters
+ ☆ [36]
+ ApplicationComponents
+ ☆ [37]
+ ComponentsPreview
+ • [38]
+ Testing
+ □ [39]
+ Custom assertions
+ • [40]
+ Conclusion
The product
- [5]https://feedbin.com
+[41]https://feedbin.com
- "Feedbin is the best way to enjoy content on the Web. By combining
- RSS, and newsletters, you can get all the good parts of the Web in
- one convenient location"
+ "Feedbin is the best way to enjoy content on the Web. By combining RSS, and
+ newsletters, you can get all the good parts of the Web in one convenient
+ location"
+
+[42][dcaac2f3-3]
Open source
- The open-source repository can be found at
- [6]https://github.com/feedbin/feedbin
+The open-source repository can be found at [43]https://github.com/feedbin/
+feedbin
License
- The [7]license they use is MIT:
+The [44]license they use is MIT:
+
+[45][26c3731c-c]
Technical review
Ruby and Rails version
- They are currently using:
- * Ruby version 3.2.2
- * They used a fork of Rails at [8]https://github.com/feedbin/rails
- forked from [9]https://github.com/Shopify/rails. They are using a
- branch called [10]7-1-stable-invalid-cache-entries - It seems to be
- Rails 7.1 and about 1 month behind the Shopify/rails which is
- usually pretty up to date with main Rails
+They are currently using:
+
+ • Ruby version 3.2.2
+
+ • They used a fork of Rails at [46]https://github.com/feedbin/rails forked
+ from [47]https://github.com/Shopify/rails. They are using a branch called
+ [48]7-1-stable-invalid-cache-entries - It seems to be Rails 7.1 and about 1
+ month behind the Shopify/rails which is usually pretty up to date with main
+ Rails
Architecture
- Code Architecture:
- * They are using the standard Rails organisation of MVC.
+Code Architecture:
- Database:
- * The DB is PostgreSQL
+ • They are using the standard Rails organisation of MVC.
- Jobs queue:
- * Sidekiq
+Database:
- On the front-end side:
- * They use .html.erb
- * They are using Phlex for [11]components
- * They are using [12]Jquery for the JS library
- * They have some custom JS code written in [13]CoffeeScript
- * They are using Hotwire via [14]importmaps
- * They are using [15]Tailwind
+ • The DB is PostgreSQL
+
+Jobs queue:
+
+ • Sidekiq
+
+On the front-end side:
+
+ • They use .html.erb
+
+ • They are using Phlex for [49]components
+
+ • They are using [50]Jquery for the JS library
+
+ • They have some custom JS code written in [51]CoffeeScript
+
+ • They are using Hotwire via [52]importmaps
+
+ • They are using [53]Tailwind
Stats
- Running /bin/rails stats will output the following:
+Running /bin/rails stats will output the following:
- Running VSCodeCounter will give the following stats:
+[12169b38-4]
+
+Running VSCodeCounter will give the following stats:
+
+[99f9ce55-5]
Style Guide
- For Ruby:
- * They are using [16]standardrb as the Style Guide with no
- customisations.
+For Ruby:
+
+ • They are using [54]standardrb as the Style Guide with no customisations.
Storage, Persistence and in-memory storage
- The DB is PostgreSQL.
+The DB is PostgreSQL.
+
+They are not using the schema.rb but the [55]structure.sql format for DB schema
+dump is configured via application.rb:
- They are not using the schema.rb but the [17]structure.sql format for
- DB schema dump is configured via application.rb:
module Feedbin
class Application < Rails::Application
# other configs
@@ -125,28 +161,29 @@ module Feedbin
end
end
- Enabled PSQL extensions:
- * hstore - "data type for storing sets of (key, value) pairs"
- * pg_stat_statements - "track planning and execution statistics of
- all SQL statements executed"
- * uuid-ossp - "generate universally unique identifiers (UUIDs)"
+Enabled PSQL extensions:
+
+ • hstore - "data type for storing sets of (key, value) pairs"
+
+ • pg_stat_statements - "track planning and execution statistics of all SQL
+ statements executed"
+
+ • uuid-ossp - "generate universally unique identifiers (UUIDs)"
CREATE EXTENSION IF NOT EXISTS hstore WITH SCHEMA public;
-COMMENT ON EXTENSION hstore IS 'data type for storing sets of (key, value) pairs
-';
+COMMENT ON EXTENSION hstore IS 'data type for storing sets of (key, value) pairs';
CREATE EXTENSION IF NOT EXISTS pg_stat_statements WITH SCHEMA public;
-COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statist
-ics of all SQL statements executed';
+COMMENT ON EXTENSION pg_stat_statements IS 'track planning and execution statistics of all SQL statements executed';
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
-COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UU
-IDs)';
+COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';
- Redis is configured to be used with Sidekiq.
+Redis is configured to be used with Sidekiq.
+
+This is what the [56]redis initializer looks like:
- This is what the [18]redis initializer looks like:
# https://github.com/feedbin/feedbin/blob/main/config/initializers/redis.rb#L1
defaults = {connect_timeout: 5, timeout: 5}
@@ -160,18 +197,19 @@ $redis = {}.tap do |hash|
hash[:refresher] = ConnectionPool.new(size: 10) { Redis.new(options2) }
end
- Further, there is a [19]RedisLock configured like this:
+Further, there is a [57]RedisLock configured like this:
+
# https://github.com/feedbin/feedbin/blob/main/app/models/redis_lock.rb#L1
class RedisLock
def self.acquire(lock_name, expiration_in_seconds = 55)
- Sidekiq.redis { _1.set(lock_name, "locked", ex: expiration_in_seconds, nx: t
-rue) }
+ Sidekiq.redis { _1.set(lock_name, "locked", ex: expiration_in_seconds, nx: true) }
end
end
- Further down this is used in a [20]clock.rb (that defines scheduled
- tasks to run):
+Further down this is used in a [58]clock.rb (that defines scheduled tasks to
+run):
+
# https://github.com/feedbin/feedbin/blob/main/lib/clock.rb#L8
every(10.seconds, "clockwork.very_frequent") do
@@ -214,47 +252,57 @@ end
Gems used
- Here are some of the gems used:
- * [21]sax-machine - "A declarative sax parsing library backed by
- Nokogiri"
- * [22]feedjira - "Feedjira is a Ruby library designed to parse feeds"
- * [23]html-pipeline - "HTML processing filters and utilities. This
- module is a small framework for defining CSS-based content filters
- and applying them to user provided content"
- * [24]apnotic - "A Ruby APNs HTTP/2 gem able to provide instant
- feedback"
- * [25]autoprefixer-rails - "Autoprefixer is a tool to parse CSS and
- add vendor prefixes to CSS rules using values from the Can I Use
- database. This gem provides Ruby and Ruby on Rails integration with
- this JavaScript tool"
- * [26]clockwork - "Clockwork is a cron replacement. It runs as a
- lightweight, long-running Ruby process which sits alongside your
- web processes (Mongrel/Thin) and your worker processes
- (DJ/Resque/Minion/Stalker) to schedule recurring work at particular
- times or dates"
- * [27]down - "Streaming downloads using net/http, http.rb, HTTPX or
- wget"
- * [28]phlex-rails - "Phlex is a framework that lets you compose web
- views in pure Ruby"
- * [29]premailer-rails - "This gem is a drop in solution for styling
- HTML emails with CSS without having to do the hard work yourself"
- * [30]raindrops - "raindrops is a real-time stats toolkit to show
- statistics for Rack HTTP servers. It is designed for preforking
- servers such as unicorn, but should support any Rack HTTP server on
- platforms supporting POSIX shared memory"
- * [31]strong_migrations - "Catch unsafe migrations in development"
- * [32]web-push - "This gem makes it possible to send push messages to
- web browsers from Ruby backends using the Web Push Protocol"
- * [33]stripe-ruby-mock - "A drop-in library to test stripe without
- hitting their servers"
- * [34]rails-controller-testing - "Brings back assigns and
- assert_template to your Rails tests"
+Here are some of the gems used:
- There are many other gems used, I only selected few here. Browse the
- [35]Gemfile to discover more.
+ • [59]sax-machine - "A declarative sax parsing library backed by Nokogiri"
+
+ • [60]feedjira - "Feedjira is a Ruby library designed to parse feeds"
+
+ • [61]html-pipeline - "HTML processing filters and utilities. This module is
+ a small framework for defining CSS-based content filters and applying them
+ to user provided content"
+
+ • [62]apnotic - "A Ruby APNs HTTP/2 gem able to provide instant feedback"
+
+ • [63]autoprefixer-rails - "Autoprefixer is a tool to parse CSS and add
+ vendor prefixes to CSS rules using values from the Can I Use database. This
+ gem provides Ruby and Ruby on Rails integration with this JavaScript tool"
+
+ • [64]clockwork - "Clockwork is a cron replacement. It runs as a lightweight,
+ long-running Ruby process which sits alongside your web processes (Mongrel/
+ Thin) and your worker processes (DJ/Resque/Minion/Stalker) to schedule
+ recurring work at particular times or dates"
+
+ • [65]down - "Streaming downloads using net/http, http.rb, HTTPX or wget"
+
+ • [66]phlex-rails - "Phlex is a framework that lets you compose web views in
+ pure Ruby"
+
+ • [67]premailer-rails - "This gem is a drop in solution for styling HTML
+ emails with CSS without having to do the hard work yourself"
+
+ • [68]raindrops - "raindrops is a real-time stats toolkit to show statistics
+ for Rack HTTP servers. It is designed for preforking servers such as
+ unicorn, but should support any Rack HTTP server on platforms supporting
+ POSIX shared memory"
+
+ • [69]strong_migrations - "Catch unsafe migrations in development"
+
+ • [70]web-push - "This gem makes it possible to send push messages to web
+ browsers from Ruby backends using the Web Push Protocol"
+
+ • [71]stripe-ruby-mock - "A drop-in library to test stripe without hitting
+ their servers"
+
+ • [72]rails-controller-testing - "Brings back assigns and assert_template to
+ your Rails tests"
+
+There are many other gems used, I only selected few here. Browse the [73]
+Gemfile to discover more.
+
+What could be mentioned is that they use their fork for some of the gems
+included in the file:
- What could be mentioned is that they use their fork for some of the
- gems included in the file:
# https://github.com/feedbin/feedbin/blob/main/Gemfile
# other gems
@@ -263,26 +311,19 @@ gem "rails", github: "feedbin/rails", branch: "7-1-stable-invalid-cache-entries"
# some other gems
-gem "http", github: "feedbin/http", branch: "feedb
-in"
-gem "carrierwave", github: "feedbin/carrierwave", branch: "feedb
-in"
-gem "sax-machine", github: "feedbin/sax-machine", branch: "feedb
-in"
+gem "http", github: "feedbin/http", branch: "feedbin"
+gem "carrierwave", github: "feedbin/carrierwave", branch: "feedbin"
+gem "sax-machine", github: "feedbin/sax-machine", branch: "feedbin"
gem "feedjira", github: "feedbin/feedjira", branch: "f2"
-gem "feedkit", github: "feedbin/feedkit", branch: "maste
-r"
-gem "html-pipeline", github: "feedbin/html-pipeline", branch: "feedb
-in"
+gem "feedkit", github: "feedbin/feedkit", branch: "master"
+gem "html-pipeline", github: "feedbin/html-pipeline", branch: "feedbin"
gem "html_diff", github: "feedbin/html_diff", ref: "013e1bb"
-gem "twitter", github: "feedbin/twitter", branch: "feedb
-in"
+gem "twitter", github: "feedbin/twitter", branch: "feedbin"
-# other gems
+# other gems
group :development, :test do
- gem "stripe-ruby-mock", github: "feedbin/stripe-ruby-mock", branch: "feedbin",
- require: "stripe_mock"
+ gem "stripe-ruby-mock", github: "feedbin/stripe-ruby-mock", branch: "feedbin", require: "stripe_mock"
# other gems
end
@@ -292,44 +333,45 @@ Code & Design Patterns
Code Organisation
- Under /app there are 3 folders different from the ones that Rails comes
- with:
- * presenters
- * uploaders
- * validators
+Under /app there are 3 folders different from the ones that Rails comes with:
- The lib folder includes very few extra objects. Most of them seems to
- be related to communicating with external services.
+ • presenters
- Maybe worth mentioning from lib folder is the
- [36]ConditionalSassCompressor
-# https://github.com/feedbin/feedbin/blob/main/lib/conditional_sass_compressor.r
-b#L1
+ • uploaders
+
+ • validators
+
+The lib folder includes very few extra objects. Most of them seems to be
+related to communicating with external services.
+
+Maybe worth mentioning from lib folder is the [74]ConditionalSassCompressor
+
+# https://github.com/feedbin/feedbin/blob/main/lib/conditional_sass_compressor.rb#L1
class ConditionalSassCompressor
def compress(string)
return string if string =~ /tailwindcss/
- options = { syntax: :scss, cache: false, read_cache: false, style: :compress
-ed}
+ options = { syntax: :scss, cache: false, read_cache: false, style: :compressed}
begin
Sprockets::Autoload::SassC::Engine.new(string, options).render
rescue => e
- puts "Could not compress '#{string[0..65]}'...: #{e.message}, skipping com
-pression"
+ puts "Could not compress '#{string[0..65]}'...: #{e.message}, skipping compression"
string
end
end
end
- This is used to configure:
+This is used to configure:
+
# https://github.com/feedbin/feedbin/blob/main/config/application.rb#L47
config.assets.css_compressor = ConditionalSassCompressor.new
Routes
- There is a combination of RESTful routes and non-restful routes.
+There is a combination of RESTful routes and non-restful routes.
+
+Here is an example from entries in the [75]routes.rb :
- Here is an example from entries in the [37]routes.rb :
# https://github.com/feedbin/feedbin/blob/main/config/routes.rb#L133
resources :entries, only: [:show, :index, :destroy] do
@@ -358,20 +400,22 @@ Routes
Controllers
- The controllers are mostly what I would call vanilla Rails controllers.
+The controllers are mostly what I would call vanilla Rails controllers.
- Three notes about them:
- * Some of them are responding with JS usually using USJ or JQuery to
- change elements from the page.
- * They contain non-Rails standard actions (actions that are not show,
- index, new, create ...)
- * There is a namespaced api folder that contains APIs used by mobile
- apps
+Three notes about them:
- Here is one simple example for DELETE /entries/:id , the controller
- looks like this:
-# https://github.com/feedbin/feedbin/blob/main/app/controllers/entries_controlle
-r.rb#L238
+ • Some of them are responding with JS usually using USJ or JQuery to change
+ elements from the page.
+
+ • They contain non-Rails standard actions (actions that are not show, index,
+ new, create ...)
+
+ • There is a namespaced api folder that contains APIs used by mobile apps
+
+Here is one simple example for DELETE /entries/:id , the controller looks like
+this:
+
+# https://github.com/feedbin/feedbin/blob/main/app/controllers/entries_controller.rb#L238
def destroy
@user = current_user
@entry = @user.entries.find(params[:id])
@@ -380,24 +424,23 @@ r.rb#L238
end
end
- And here is the view [38]destroy.js.erb :
+And here is the view [76]destroy.js.erb :
+
$('[data-behavior~=entries_target] [data-entry-id=<%= @entry.id %>]').remove();
-feedbin.Counts.get().removeEntry(<%= @entry.id %>, <%= @entry.feed_id %>, 'unrea
-d')
-feedbin.Counts.get().removeEntry(<%= @entry.id %>, <%= @entry.feed_id %>, 'starr
-ed')
+feedbin.Counts.get().removeEntry(<%= @entry.id %>, <%= @entry.feed_id %>, 'unread')
+feedbin.Counts.get().removeEntry(<%= @entry.id %>, <%= @entry.feed_id %>, 'starred')
feedbin.applyCounts(true)
feedbin.clearEntry();
feedbin.fullScreen(false)
- The main pattern adopted to controllers is to have some logic in them
- and delegate to jobs some part of the processing.
+The main pattern adopted to controllers is to have some logic in them and
+delegate to jobs some part of the processing.
- The repo contains mostly straight-forward controllers like this one:
-# https://github.com/feedbin/feedbin/blob/main/app/controllers/pages_internal_co
-ntroller.rb#L1
+The repo contains mostly straight-forward controllers like this one:
+
+# https://github.com/feedbin/feedbin/blob/main/app/controllers/pages_internal_controller.rb#L1
class PagesInternalController < ApplicationController
def create
@@ -406,9 +449,9 @@ class PagesInternalController < ApplicationController
end
end
- But also few controllers that include some logic:
-# https://github.com/feedbin/feedbin/blob/main/app/controllers/api/podcasts/v1/f
-eeds_controller.rb#L8
+But also few controllers that include some logic:
+
+# https://github.com/feedbin/feedbin/blob/main/app/controllers/api/podcasts/v1/feeds_controller.rb#L8
def show
url = hex_decode(params[:id])
@@ -437,21 +480,22 @@ rescue => exception
end
end
- Even with this structure, I find all controllers easy to read and I
- think they can be easier to change.
+Even with this structure, I find all controllers easy to read and I think they
+can be easier to change.
Models
- The app/models folders contain both ActiveRecord and normal Ruby
- objects. With few exceptions, they are not namespaced.
+The app/models folders contain both ActiveRecord and normal Ruby objects. With
+few exceptions, they are not namespaced.
Jobs
- The jobs folder contains Sidekiq jobs which are used to do processing
- on various objects. They are usually called from controllers and most
- of them are async.
+The jobs folder contains Sidekiq jobs which are used to do processing on
+various objects. They are usually called from controllers and most of them are
+async.
+
+Here is one job that is caching views:
- Here is one job that is caching views:
# https://github.com/feedbin/feedbin/blob/main/app/jobs/cache_entry_views.rb#L1
class CacheEntryViews
@@ -491,12 +535,12 @@ end
Presenters
- There is a [39]BasePresenter and all other presenters are extending it
- via inheritance:
+There is a [77]BasePresenter and all other presenters are extending it via
+inheritance:
- This controller defines a private method called presents:
-# https://github.com/feedbin/feedbin/blob/main/app/presenters/base_presenter.rb#
-L1
+This controller defines a private method called presents:
+
+# https://github.com/feedbin/feedbin/blob/main/app/presenters/base_presenter.rb#L1
class BasePresenter
def initialize(object, locals, template)
@@ -516,9 +560,9 @@ class BasePresenter
end
end
- and it is used like this for example:
-# https://github.com/feedbin/feedbin/blob/main/app/presenters/user_presenter.rb#
-L2
+and it is used like this for example:
+
+# https://github.com/feedbin/feedbin/blob/main/app/presenters/user_presenter.rb#L2
class UserPresenter < BasePresenter
presents :user
@@ -533,8 +577,9 @@ class UserPresenter < BasePresenter
# ... other code
end
- To use the presenters, there is a helper defined in ApplicationHelper
- will instantiate the proper helper based on the object class:
+To use the presenters, there is a helper defined in ApplicationHelper will
+instantiate the proper helper based on the object class:
+
module ApplicationHelper
def present(object, locals = nil, klass = nil)
klass ||= "#{object.class}Presenter".constantize
@@ -546,23 +591,21 @@ module ApplicationHelper
# more code ...
end
- and it is used [40]like this in views:
+and it is used [78]like this in views:
+
<% present @user do |user_presenter| %>
- <% @class = "settings-body settings-#{params[:action]} theme-#{user_presente
-r.theme}"%>
+ <% @class = "settings-body settings-#{params[:action]} theme-#{user_presenter.theme}"%>
<% end %>
ApplicationComponents
- Components are based on Phlex and they inherit from
- [41]ApplicationComponent
+Components are based on Phlex and they inherit from [79]ApplicationComponent
- It defines a method to add Stimulus controller in components like this:
-# https://github.com/feedbin/feedbin/blob/main/app/views/components/application_
-component.rb#L25
+It defines a method to add Stimulus controller in components like this:
- def stimulus(controller:, actions: {}, values: {}, outlets: {}, classes: {}, d
-ata: {})
+# https://github.com/feedbin/feedbin/blob/main/app/views/components/application_component.rb#L25
+
+ def stimulus(controller:, actions: {}, values: {}, outlets: {}, classes: {}, data: {})
stimulus_controller = controller.to_s.dasherize
action = actions.map do |event, function|
@@ -581,18 +624,17 @@ ata: {})
[controller, key, "class"].join("_").to_sym
end
- { controller: stimulus_controller, action: }.merge!({ **values, **outlets, *
-*classes, **data})
+ { controller: stimulus_controller, action: }.merge!({ **values, **outlets, **classes, **data})
end
- Where we can also see a bit of hash literal omission at {controller:
- stimulus_controller, action: }
+Where we can also see a bit of hash literal omission at {controller:
+stimulus_controller, action: }
- But more interesting that this method that helps defining a Stimulus
- controller, is the method used to define a Stimulus item that uses
- binding to get variables from the object where it is used:
-# https://github.com/feedbin/feedbin/blob/main/app/views/components/application_
-component.rb#L47
+But more interesting that this method that helps defining a Stimulus
+controller, is the method used to define a Stimulus item that uses binding to
+get variables from the object where it is used:
+
+# https://github.com/feedbin/feedbin/blob/main/app/views/components/application_component.rb#L47
def stimulus_item(target: nil, actions: {}, params: {}, data: {}, for:)
stimulus_controller = binding.local_variable_get(:for).to_s.dasherize
@@ -612,54 +654,53 @@ component.rb#L47
end
if target
- defaults[:"#{binding.local_variable_get(:for)}_target"] = target.to_s.came
-lize(:lower)
+ defaults[:"#{binding.local_variable_get(:for)}_target"] = target.to_s.camelize(:lower)
end
defaults
end
- The part with binding does the following:
- * stimulus_controller =
- binding.local_variable_get(:for).to_s.dasherize This line retrieves
- the value of the local variable for, converts it to a string, and
- then applies the dasherize method (presumably to format it for use
- in a specific context, like a CSS class or an identifier in HTML).
- * Apparently binding.local_variable_get should not be needed as the
- variable is passed a keyword parameter to the method. But the name
- of the variable is for which is a reserved word and thus if the
- code would have been stimulus_controller = for.to_s_dasherize that
- would have raised syntax error, unexpected '.' (SyntaxError)
+The part with binding does the following:
- This is a way to have keyword arguments named as reserved words and
- still be able to use them.
+ • stimulus_controller = binding.local_variable_get(:for).to_s.dasherize This
+ line retrieves the value of the local variable for, converts it to a
+ string, and then applies the dasherize method (presumably to format it for
+ use in a specific context, like a CSS class or an identifier in HTML).
+
+ • Apparently binding.local_variable_get should not be needed as the variable
+ is passed a keyword parameter to the method. But the name of the variable
+ is for which is a reserved word and thus if the code would have been
+ stimulus_controller = for.to_s_dasherize that would have raised syntax
+ error, unexpected '.' (SyntaxError)
+
+This is a way to have keyword arguments named as reserved words and still be
+able to use them.
ComponentsPreview
- All components can be previewed via Lookbook and they can be found in
- test/components
+All components can be previewed via Lookbook and they can be found in test/
+components
Testing
- For testing it uses Minitest, the default testing framework from Rails.
- It uses fixtures to set up the test db.
+For testing it uses Minitest, the default testing framework from Rails. It uses
+fixtures to set up the test db.
- Tests are simple and direct, containing all preconditions and
- postconditions in each test. This is great for following what each test
- is doing.
+Tests are simple and direct, containing all preconditions and postconditions in
+each test. This is great for following what each test is doing.
- There are controller tests, model tests, job tests and some system
- tests. There are more controller tests than system tests making the
- test suite run quite fast. Also the jobs are covered pretty good with
- testing as there is a log of logic in the jobs.
+There are controller tests, model tests, job tests and some system tests. There
+are more controller tests than system tests making the test suite run quite
+fast. Also the jobs are covered pretty good with testing as there is a log of
+logic in the jobs.
Custom assertions
- There are some custom assertions created specifically to work with
- collections: assert_has_keys will check if all keys are included in the
- hash and assert_equal_ids will check if the two collections provided
- have the same ids (one being a collection of objects and the other one
- being a hash).
+There are some custom assertions created specifically to work with collections:
+assert_has_keys will check if all keys are included in the hash and
+assert_equal_ids will check if the two collections provided have the same ids
+(one being a collection of objects and the other one being a hash).
+
# https://github.com/feedbin/feedbin/blob/main/test/support/assertions.rb#L3
def assert_has_keys(keys, hash)
@@ -674,134 +715,132 @@ Custom assertions
Conclusion
- In conclusion, Feedbin is an open-source project that combines RSS
- feeds and newsletters into a convenient platform.
+In conclusion, Feedbin is an open-source project that combines RSS feeds and
+newsletters into a convenient platform.
- It utilizes Ruby on Rails, PostgreSQL, Sidekiq, and various other
- technologies to provide a robust and efficient service.
+It utilizes Ruby on Rails, PostgreSQL, Sidekiq, and various other technologies
+to provide a robust and efficient service.
- The code is well-organized and simple to follow the logic and what is
- happening. I think it will make it easy for anyone to contribute to
- this repo. If you want to run this yourself locally you should take a
- look at the [42]feedbin-docker.
- __________________________________________________________________
+The code is well-organized and simple to follow the logic and what is
+happening. I think it will make it easy for anyone to contribute to this repo.
+If you want to run this yourself locally you should take a look at the [80]
+feedbin-docker.
- Enjoyed this article?
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 👉 Join my [43]Short Ruby News newsletter for weekly Ruby updates from
- the community and visit [44]rubyandrails.info, a directory with
- learning content about Ruby.
+Enjoyed this article?
- 👐 Subscribe to my Ruby and Ruby on rails courses over email at
- [45]learn.shortruby.com - effortless learning anytime, anywhere
+👉 Join my [81]Short Ruby News newsletter for weekly Ruby updates from the
+community and visit [82][83]rubyandrails.info, a directory with learning
+content about Ruby.
- 🤝 Let's connect on [46]Ruby.social or [47]Linkedin or [48]Twitter where
- I post mainly about Ruby and Rails.
+👐 Subscribe to my Ruby and Ruby on rails courses over email at [84]
+learn.shortruby.com - effortless learning anytime, anywhere
- 🎥 Follow me on [49]my YouTube channel for short videos about Ruby
+🤝 Let's connect on [85][86]Ruby.social or [87]Linkedin or [88]Twitter where I
+post mainly about Ruby and Rails.
+
+🎥 Follow me on [89]my YouTube channel for short videos about Ruby
Did you find this article valuable?
- Support Lucian Ghinda by becoming a sponsor. Any amount is appreciated!
- (BUTTON) Sponsor
- [50]See recent sponsors | [51]Learn more about Hashnode Sponsors
+Support Lucian Ghinda by becoming a sponsor. Any amount is appreciated!
- [52]Ruby[53]Ruby on Rails[54]Open Source[55]coding[56]Programming Blogs
+Sponsor
+[91]See recent sponsors | [92]Learn more about Hashnode Sponsors
+[93]Ruby[94]Ruby on Rails[95]Open Source[96]coding[97]Programming Blogs
-References
+References:
- Visible links:
- 1. https://allaboutcoding.ghinda.com/?source=top_nav_blog_home
- 2. https://hashnode.com/@lucianghinda
- 3. https://hashnode.com/@lucianghinda
- 4. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin
- 5. https://feedbin.com/
- 6. https://github.com/feedbin/feedbin/blob/main/LICENSE.md
- 7. https://github.com/feedbin/feedbin/blob/main/LICENSE.md
- 8. https://github.com/feedbin/rails
- 9. https://github.com/Shopify/rails
- 10. https://github.com/feedbin/rails/tree/7-1-stable-invalid-cache-entries
- 11. https://github.com/feedbin/feedbin/tree/main/app/views/components
- 12. https://github.com/feedbin/feedbin/blob/main/Gemfile#L38
- 13. https://github.com/feedbin/feedbin/tree/main/app/assets/javascripts/web
- 14. https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/config/importmap.rb#L1
- 15. https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/Gemfile#L66
- 16. https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/Gemfile#L94
- 17. https://github.com/feedbin/feedbin/blob/main/db/structure.sql
- 18. https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/config/initializers/redis.rb#L1
- 19. https://github.com/feedbin/feedbin/blob/main/app/models/redis_lock.rb#L1
- 20. https://github.com/feedbin/feedbin/blob/main/lib/clock.rb#L8
- 21. https://github.com/pauldix/sax-machine
- 22. https://github.com/feedjira/feedjira
- 23. https://github.com/feedbin/html-pipeline
- 24. https://github.com/ostinelli/apnotic
- 25. https://github.com/ai/autoprefixer-rails
- 26. https://github.com/Rykian/clockwork
- 27. https://github.com/janko/down
- 28. https://github.com/phlex-ruby/phlex-rails
- 29. https://github.com/fphilipe/premailer-rails
- 30. https://rubygems.org/gems/raindrops
- 31. https://github.com/ankane/strong_migrations
- 32. https://github.com/pushpad/web-push
- 33. https://github.com/stripe-ruby-mock/stripe-ruby-mock
- 34. https://github.com/rails/rails-controller-testing
- 35. https://github.com/feedbin/feedbin/blob/main/Gemfile
- 36. https://github.com/feedbin/feedbin/blob/main/lib/conditional_sass_compressor.rb#L1
- 37. https://github.com/feedbin/feedbin/blob/main/config/routes.rb#L133
- 38. https://github.com/feedbin/feedbin/blob/main/app/views/entries/destroy.js.erb#L1
- 39. https://github.com/feedbin/feedbin/blob/main/app/presenters/base_presenter.rb#L1
- 40. https://github.com/feedbin/feedbin/blob/main/app/views/layouts/settings.html.erb#L1
- 41. https://github.com/feedbin/feedbin/blob/main/app/views/components/application_component.rb#L3
- 42. https://github.com/angristan/feedbin-docker
- 43. https://shortruby.com/
- 44. http://rubyandrails.info/
- 45. https://learn.shortruby.com/
- 46. http://Ruby.social/
- 47. https://linkedin.com/in/lucianghinda
- 48. https://x.com/lucianghinda
- 49. https://www.youtube.com/@shortruby
- 50. https://allaboutcoding.ghinda.com/sponsor
- 51. https://hashnode.com/sponsors
- 52. https://allaboutcoding.ghinda.com/tag/ruby?source=tags_bottom_blogs
- 53. https://allaboutcoding.ghinda.com/tag/ruby-on-rails?source=tags_bottom_blogs
- 54. https://allaboutcoding.ghinda.com/tag/opensource?source=tags_bottom_blogs
- 55. https://allaboutcoding.ghinda.com/tag/coding?source=tags_bottom_blogs
- 56. https://allaboutcoding.ghinda.com/tag/programming-blogs?source=tags_bottom_blogs
-
- Hidden links:
- 58. https://allaboutcoding.ghinda.com/
- 59. https://allaboutcoding.ghinda.com/?source=top_nav_blog_home
- 60. https://twitter.com/lucianghinda
- 61. https://github.com/lucianghinda
- 62. https://shortruby.com/
- 63. https://hashnode.com/@lucianghinda
- 64. https://app.daily.dev/lucianghinda
- 65. https://linkedin.com/in/lucianghinda
- 66. https://ruby.social/@lucian
- 67. https://allaboutcoding.ghinda.com/rss.xml
- 68. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-the-product
- 69. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-open-source
- 70. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-license
- 71. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-technical-review
- 72. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-ruby-and-rails-version
- 73. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-architecture
- 74. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-stats
- 75. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-style-guide
- 76. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-storage-persistence-and-in-memory-storage
- 77. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-gems-used
- 78. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-code-amp-design-patterns
- 79. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-code-organisation
- 80. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-routes
- 81. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-controllers
- 82. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-models
- 83. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-jobs
- 84. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-presenters
- 85. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-applicationcomponents
- 86. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-componentspreview
- 87. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-testing
- 88. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-custom-assertions
- 89. https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-conclusion
- 90. https://feedbin.com/about
- 91. https://github.com/feedbin/feedbin/blob/main/LICENSE.md
- 92. http://rubyandrails.info/
- 93. https://ruby.social/@lucian
+[2] https://allaboutcoding.ghinda.com/
+[4] https://allaboutcoding.ghinda.com/?source=top_nav_blog_home
+[7] https://allaboutcoding.ghinda.com/?source=top_nav_blog_home
+[8] https://twitter.com/lucianghinda
+[9] https://github.com/lucianghinda
+[10] https://shortruby.com/
+[11] https://hashnode.com/@lucianghinda
+[12] https://app.daily.dev/lucianghinda
+[13] https://linkedin.com/in/lucianghinda
+[14] https://ruby.social/@lucian
+[15] https://allaboutcoding.ghinda.com/rss.xml
+[16] https://hashnode.com/@lucianghinda
+[17] https://hashnode.com/@lucianghinda
+[18] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin
+[19] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-the-product
+[20] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-open-source
+[21] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-license
+[22] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-technical-review
+[23] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-ruby-and-rails-version
+[24] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-architecture
+[25] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-stats
+[26] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-style-guide
+[27] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-storage-persistence-and-in-memory-storage
+[28] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-gems-used
+[29] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-code-amp-design-patterns
+[30] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-code-organisation
+[31] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-routes
+[32] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-controllers
+[33] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-models
+[34] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-jobs
+[35] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-presenters
+[36] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-applicationcomponents
+[37] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-componentspreview
+[38] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-testing
+[39] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-custom-assertions
+[40] https://allaboutcoding.ghinda.com/ruby-open-source-feedbin#heading-conclusion
+[41] https://feedbin.com/
+[42] https://feedbin.com/about
+[43] https://github.com/feedbin/feedbin/blob/main/LICENSE.md
+[44] https://github.com/feedbin/feedbin/blob/main/LICENSE.md
+[45] https://github.com/feedbin/feedbin/blob/main/LICENSE.md
+[46] https://github.com/feedbin/rails
+[47] https://github.com/Shopify/rails
+[48] https://github.com/feedbin/rails/tree/7-1-stable-invalid-cache-entries
+[49] https://github.com/feedbin/feedbin/tree/main/app/views/components
+[50] https://github.com/feedbin/feedbin/blob/main/Gemfile#L38
+[51] https://github.com/feedbin/feedbin/tree/main/app/assets/javascripts/web
+[52] https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/config/importmap.rb#L1
+[53] https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/Gemfile#L66
+[54] https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/Gemfile#L94
+[55] https://github.com/feedbin/feedbin/blob/main/db/structure.sql
+[56] https://github.com/feedbin/feedbin/blob/abf1ad883dab8a3464fe12e4653de6323296175b/config/initializers/redis.rb#L1
+[57] https://github.com/feedbin/feedbin/blob/main/app/models/redis_lock.rb#L1
+[58] https://github.com/feedbin/feedbin/blob/main/lib/clock.rb#L8
+[59] https://github.com/pauldix/sax-machine
+[60] https://github.com/feedjira/feedjira
+[61] https://github.com/feedbin/html-pipeline
+[62] https://github.com/ostinelli/apnotic
+[63] https://github.com/ai/autoprefixer-rails
+[64] https://github.com/Rykian/clockwork
+[65] https://github.com/janko/down
+[66] https://github.com/phlex-ruby/phlex-rails
+[67] https://github.com/fphilipe/premailer-rails
+[68] https://rubygems.org/gems/raindrops
+[69] https://github.com/ankane/strong_migrations
+[70] https://github.com/pushpad/web-push
+[71] https://github.com/stripe-ruby-mock/stripe-ruby-mock
+[72] https://github.com/rails/rails-controller-testing
+[73] https://github.com/feedbin/feedbin/blob/main/Gemfile
+[74] https://github.com/feedbin/feedbin/blob/main/lib/conditional_sass_compressor.rb#L1
+[75] https://github.com/feedbin/feedbin/blob/main/config/routes.rb#L133
+[76] https://github.com/feedbin/feedbin/blob/main/app/views/entries/destroy.js.erb#L1
+[77] https://github.com/feedbin/feedbin/blob/main/app/presenters/base_presenter.rb#L1
+[78] https://github.com/feedbin/feedbin/blob/main/app/views/layouts/settings.html.erb#L1
+[79] https://github.com/feedbin/feedbin/blob/main/app/views/components/application_component.rb#L3
+[80] https://github.com/angristan/feedbin-docker
+[81] https://shortruby.com/
+[82] http://rubyandrails.info/
+[83] http://rubyandrails.info/
+[84] https://learn.shortruby.com/
+[85] https://ruby.social/@lucian
+[86] http://ruby.social/
+[87] https://linkedin.com/in/lucianghinda
+[88] https://x.com/lucianghinda
+[89] https://www.youtube.com/@shortruby
+[91] https://allaboutcoding.ghinda.com/sponsor
+[92] https://hashnode.com/sponsors
+[93] https://allaboutcoding.ghinda.com/tag/ruby?source=tags_bottom_blogs
+[94] https://allaboutcoding.ghinda.com/tag/ruby-on-rails?source=tags_bottom_blogs
+[95] https://allaboutcoding.ghinda.com/tag/opensource?source=tags_bottom_blogs
+[96] https://allaboutcoding.ghinda.com/tag/coding?source=tags_bottom_blogs
+[97] https://allaboutcoding.ghinda.com/tag/programming-blogs?source=tags_bottom_blogs
diff --git a/static/archive/analogoffice-net-xmnih2.txt b/static/archive/analogoffice-net-xmnih2.txt
index ca66a52..5749825 100644
--- a/static/archive/analogoffice-net-xmnih2.txt
+++ b/static/archive/analogoffice-net-xmnih2.txt
@@ -1,209 +1,207 @@
- [1]Analog Office
- * [2]Home
- * [3]Subscribe
- * [4]Archive
- * [5]Photos
- * [6]About
- * [7]Bookshelf
- * [8]Contact
- * [9]Ask a Question
- * [10]Office Holders
- * [11]Search
+[1]Analog Office
- The Life-Changing Magic of Keeping a File Index
+ • [2]Home
+ • [3]Subscribe
+ • [4]Archive
+ • [5]Photos
+ • [6]About
+ • [7]Bookshelf
+ • [8]Contact
+ • [9]Ask a Question
+ • [10]Office Holders
+ • [11]Search
- Filing systems for personal, household files don’t get much love from
- people who write about household organizing. Most books dealing with
- household organization brush it off in a page or two, and it often
- comes down to something like this:
+The Life-Changing Magic of Keeping a File Index
- “Throw out all your papers! Go electronic! With the six papers that are
- left over, file them alphabetically!”
+Filing systems for personal, household files don’t get much love from people
+who write about household organizing. Most books dealing with household
+organization brush it off in a page or two, and it often comes down to
+something like this:
- Marie Kondo, in her first book, advised people to dump most of their
- papers. (GASP!)
+“Throw out all your papers! Go electronic! With the six papers that are left
+over, file them alphabetically!”
- Certainly, if you don’t keep papers, you won’t need an excellent filing
- system.
+Marie Kondo, in her first book, advised people to dump most of their papers.
+(GASP!)
- But what if you do want to keep a lot of papers, AND find them quickly?
+Certainly, if you don’t keep papers, you won’t need an excellent filing system.
- Some people collect Lego sets, or porcelain tea cups. I create and
- collect documents, both paper and electronic. And I know I am not alone
- in this.
+But what if you do want to keep a lot of papers, AND find them quickly?
- I like being able to pull out papers like my handout for folding and
- cutting a six-pointed paper snowflake (I forget how to do this every
- year); or the brochure that came with my split mechanical gaming
- keyboard* that tells me how to reset the programming, after I mistype
- and inadvertently create a macro; or the gift passes to a cool local
- museum when friends visit.
+Some people collect Lego sets, or porcelain tea cups. I create and collect
+documents, both paper and electronic. And I know I am not alone in this.
- And I like being able to do that QUICKLY: go to my file cabinet, pull
- out the gift passes, done. No rummaging through piles or having to pay
- entrance fees for our guests because I couldn’t find the passes.
+I like being able to pull out papers like my handout for folding and cutting a
+six-pointed paper snowflake (I forget how to do this every year); or the
+brochure that came with my split mechanical gaming keyboard* that tells me how
+to reset the programming, after I mistype and inadvertently create a macro; or
+the gift passes to a cool local museum when friends visit.
- This is where decent filing systems come in.
+And I like being able to do that QUICKLY: go to my file cabinet, pull out the
+gift passes, done. No rummaging through piles or having to pay entrance fees
+for our guests because I couldn’t find the passes.
- I’ll be writing more about some ways to file paper reference materials
- (this IS after all, the Analog Office) but today I want to focus on:
- * the need
- * the genius
- * the beauty, and
- * the brilliance of a digital document that most people at home don’t
- keep: a file index.
+This is where decent filing systems come in.
- A file index is your [12]Where Is It? document for your files.
+I’ll be writing more about some ways to file paper reference materials (this IS
+after all, the Analog Office) but today I want to focus on:
- It’s like a table of contents for your filing system.
+ • the need
+ • the genius
+ • the beauty, and
+ • the brilliance of a digital document that most people at home don’t keep: a
+ file index.
+
+A file index is your [12]Where Is It? document for your files.
+
+It’s like a table of contents for your filing system.
Choose: Invest Predictable, Regular, Short Periods of Time?
Or, Lose: Long, Stressful, Unpredictable Periods of Time (And Money)?
- When you can’t find a paper, you lose an unpredictable amount of time
- running around and looking through piles, and you also lose sometimes
- significant amounts of money, because some papers are stand-ins for
- money (guest passes at the museum); or cost you time and money to
- replace (deeds, titles).
+When you can’t find a paper, you lose an unpredictable amount of time running
+around and looking through piles, and you also lose sometimes significant
+amounts of money, because some papers are stand-ins for money (guest passes at
+the museum); or cost you time and money to replace (deeds, titles).
- A file index will take a little time to set up, and small amounts of
- predictable time to maintain. So it is a trade-off.
+A file index will take a little time to set up, and small amounts of
+predictable time to maintain. So it is a trade-off.
- But I would rather spend a little time to have zero anxiety about
- finding my papers when I want and need them.
+But I would rather spend a little time to have zero anxiety about finding my
+papers when I want and need them.
- So I spend small, predictable amounts of time entering information into
- my filing index.
+So I spend small, predictable amounts of time entering information into my
+filing index.
Why Filing Indexes Work So Well
- Say you have a paper policy from Zenith Auto Insurance, and say you
- want to file this alphabetically.
+Say you have a paper policy from Zenith Auto Insurance, and say you want to
+file this alphabetically.
- Where does it go? What comes to mind for you, if you were looking for
- it? Where would you put it?
+Where does it go? What comes to mind for you, if you were looking for it? Where
+would you put it?
- File it under “Z” for Zenith? Or, “A” for Auto? Or maybe, “I” for
- Insurance?
+File it under “Z” for Zenith? Or, “A” for Auto? Or maybe, “I” for Insurance?
- But maybe you think of it as car insurance.
+But maybe you think of it as car insurance.
- How about “C” for Car insurance?
+How about “C” for Car insurance?
- If you file it under “I” for insurance, do you keep your health
- insurance information in there too? Renter’s or homeowners insurance,
- does that go there too?
+If you file it under “I” for insurance, do you keep your health insurance
+information in there too? Renter’s or homeowners insurance, does that go there
+too?
- You could; you could have a folder for, “Insurance, Car” and another
- folder for “Insurance, Health,” and another for, “Insurance, Renters.”
- Or, you could put health insurance under “H” or even “M” (medical!)…
- and so on, and so on… aaaargh….!
+You could; you could have a folder for, “Insurance, Car” and another folder for
+“Insurance, Health,” and another for, “Insurance, Renters.” Or, you could put
+health insurance under “H” or even “M” (medical!)… and so on, and so on…
+aaaargh….!
- Enter the file index.
+Enter the file index.
- File indexes can be – and indeed of course used to be – analog, but I
- recommend using a digital format because:
+File indexes can be – and indeed of course used to be – analog, but I recommend
+using a digital format because:
- ✨ You want it to be searchable. ✨🎉
+✨ You want it to be searchable. ✨🎉
- It’s also a good idea to figure out how you will make your file index
- accessible to others.
+It’s also a good idea to figure out how you will make your file index
+accessible to others.
- Because I want my husband to be able to find important household files,
- I print the file index out whenever I update it, so he can have a way
- to find things in case he can’t get into my computer. You could also
- share the document and keep it all online, or print out instructions
- for how to access it in case someone else needs to.
+Because I want my husband to be able to find important household files, I print
+the file index out whenever I update it, so he can have a way to find things in
+case he can’t get into my computer. You could also share the document and keep
+it all online, or print out instructions for how to access it in case someone
+else needs to.
Make Your Own File Index
- For your file index, you can use a spreadsheet, a notes program, a
- single document – as long as it is searchable, and you have a way to
- share access if these are household files that someone else may need.
+For your file index, you can use a spreadsheet, a notes program, a single
+document – as long as it is searchable, and you have a way to share access if
+these are household files that someone else may need.
- It doesn’t matter where the insurance paper goes. It could be under any
- letter you want.
+It doesn’t matter where the insurance paper goes. It could be under any letter
+you want.
- It matters that you record your decision on a document that maps out
- where you put your files.
+It matters that you record your decision on a document that maps out where you
+put your files.
- Let’s say you decide that your Zenith Auto Insurance Policy goes under
- “C” for “Car Insurance.”
+Let’s say you decide that your Zenith Auto Insurance Policy goes under “C” for
+“Car Insurance.”
- So you record on the file index:
+So you record on the file index:
Location; Topic or General Description; Keywords
- * “Location” = the section of the physical file system you need to
- look in. What is it filed under? That’s your location. For an
- alphabetical file system, it will be a letter.
- * “Topic or General Description” = what you call the document; the
- first phrase that comes to mind when you are looking for the
- document: if you think of it as your car insurance policy, write
- “car insurance policy” here
- * Keywords = MAGIC!! when combined with ✨ search functions 🎉
+ • “Location” = the section of the physical file system you need to look in.
+ What is it filed under? That’s your location. For an alphabetical file
+ system, it will be a letter.
- Filing can be frustrating because often we think of multiple terms for
- our files. (This happens a lot in homes, less for businesses with
- structured file naming conventions.)
+ • “Topic or General Description” = what you call the document; the first
+ phrase that comes to mind when you are looking for the document: if you
+ think of it as your car insurance policy, write “car insurance policy” here
- I might think of it as the “car insurance policy,” my husband might
- look for “Zenith.”
+ • Keywords = MAGIC!! when combined with ✨ search functions 🎉
- So with keywords, you list any words that you might think of when
- looking for the document, that are not already named in your topic
- section, above. For this one, you might list: “Zenith, auto, policy,
- policies, automobile, registration, proof of insurance.”
+Filing can be frustrating because often we think of multiple terms for our
+files. (This happens a lot in homes, less for businesses with structured file
+naming conventions.)
- an example of a file index made from a spreadsheet, showing sample
- entries using columns for location, topic, and keyword, and a fourth
- column for digital file locations
+I might think of it as the “car insurance policy,” my husband might look for
+“Zenith.”
- Next level: after keywords, if you have a digital file that corresponds
- to the paper one, put in the location for the digital file.
+So with keywords, you list any words that you might think of when looking for
+the document, that are not already named in your topic section, above. For this
+one, you might list: “Zenith, auto, policy, policies, automobile, registration,
+proof of insurance.”
- Find it all, with file indexes.
- __________________________________________________________________
+an example of a file index made from a spreadsheet, showing sample entries
+using columns for location, topic, and keyword, and a fourth column for digital
+file locations
- Copy and share – [13]the link is here. Never miss a post from the
- Analog Office! [14]Subscribe here to get blog posts via email.
+Next level: after keywords, if you have a digital file that corresponds to the
+paper one, put in the location for the digital file.
- Wondering how to manage your paper-based or hybrid paper-digital
- systems? [15]Ask me a question.
- __________________________________________________________________
+Find it all, with file indexes.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+Copy and share – [13]the link is here. Never miss a post from the Analog
+Office! [14]Subscribe here to get blog posts via email.
+
+Wondering how to manage your paper-based or hybrid paper-digital systems? [15]
+Ask me a question.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
NOTES
- * I’m not a gamer, but my son recommended this split keyboard to me,
- and it is AWESOME. Shifting rainbow color backlighting, Cherry MX
- mechanical key switches (whatever that means, I’m reading from the
- brochure that I quickly and easily pulled from my files), but the best
- thing is that I no longer have wrist pain. Plus, the cat can hang out
- in the middle.
+* I’m not a gamer, but my son recommended this split keyboard to me, and it is
+AWESOME. Shifting rainbow color backlighting, Cherry MX mechanical key switches
+(whatever that means, I’m reading from the brochure that I quickly and easily
+pulled from my files), but the best thing is that I no longer have wrist pain.
+Plus, the cat can hang out in the middle.
- cat stepping in the middle of a split keyboard
- *****
- Written on 31 May 2023
+cat stepping in the middle of a split keyboard
- © 2024 Anna Havron. All rights reserved. Website hosted by
- [16]micro.blog
+*****
+Written on 31 May 2023
+ © 2024 Anna Havron. All rights reserved. Website hosted by [16]micro.blog
-References
+References:
- 1. https://analogoffice.net/
- 2. https://analogoffice.net/
- 3. https://analogoffice.net/subscribe/
- 4. https://analogoffice.net/archive/
- 5. https://analogoffice.net/photos/
- 6. https://analogoffice.net/about/
- 7. https://analogoffice.net/books/
- 8. https://analogoffice.net/contact/
- 9. https://analogoffice.net/advice/
- 10. https://analogoffice.net/office-holders/
- 11. https://analogoffice.net/search/
- 12. https://analogoffice.net/2023/01/16/keep-a-where.html
- 13. https://analogoffice.net/2023/05/31/the-lifechanging-magic.html
- 14. https://analogoffice.net/subscribe/
- 15. https://analogoffice.net/advice/
- 16. https://micro.blog/
+[1] https://analogoffice.net/
+[2] https://analogoffice.net/
+[3] https://analogoffice.net/subscribe/
+[4] https://analogoffice.net/archive/
+[5] https://analogoffice.net/photos/
+[6] https://analogoffice.net/about/
+[7] https://analogoffice.net/books/
+[8] https://analogoffice.net/contact/
+[9] https://analogoffice.net/advice/
+[10] https://analogoffice.net/office-holders/
+[11] https://analogoffice.net/search/
+[12] https://analogoffice.net/2023/01/16/keep-a-where.html
+[13] https://analogoffice.net/2023/05/31/the-lifechanging-magic.html
+[14] https://analogoffice.net/subscribe/
+[15] https://analogoffice.net/advice/
+[16] https://micro.blog/
diff --git a/static/archive/baty-net-bplhdp.txt b/static/archive/baty-net-bplhdp.txt
index c2897a7..aacea3f 100644
--- a/static/archive/baty-net-bplhdp.txt
+++ b/static/archive/baty-net-bplhdp.txt
@@ -1,74 +1,67 @@
- [1]Baty.net
- (BUTTON)
+[1][apple-touc]Baty.net
- * [2]Archive
- * [3]About
- * [4]Tags
- * [5]Uses
- * [6]Search
+ • [3]Archive
+ • [4]About
+ • [5]Tags
+ • [6]Uses
+ • [7]Search
- Ending my OpenBSD experiment (Almost)
+Ending my OpenBSD experiment (Almost)
- January 4, 2024 · 197 words
+January 4, 2024 · 197 words
- I did [7]this fun thing from Derek Sivers because I wanted to play with
- [8]OpenBSD and with [9]Vultr for hosting.
+I did [8]this fun thing from Derek Sivers because I wanted to play with [9]
+OpenBSD and with [10]Vultr for hosting.
- Well, I played with it. It was fun. I got to see how [10]Dovecot works
- and I learned how to configure Relayd and the OpenBSD httpd server.
+Well, I played with it. It was fun. I got to see how [11]Dovecot works and I
+learned how to configure Relayd and the OpenBSD httpd server.
- I think I’d end up liking it. BSD feels lighter and simpler and
- therefore probably more secure than the Ubuntu servers I’m running.
+I think I’d end up liking it. BSD feels lighter and simpler and therefore
+probably more secure than the Ubuntu servers I’m running.
- However, I don’t need another server to manage. I don’t need to run my
- own mail server or CalDAV server. My VPS at Digital Ocean has been
- running (::knocks wood::) smoothly for years and I’ve got the
- configuration down.
+However, I don’t need another server to manage. I don’t need to run my own mail
+server or CalDAV server. My VPS at Digital Ocean has been running (::knocks
+wood::) smoothly for years and I’ve got the configuration down.
- I’ll be deleting the OpenBSD server once I’ve moved the few sites I’d
- migrated there back to Digital Ocean.
+I’ll be deleting the OpenBSD server once I’ve moved the few sites I’d migrated
+there back to Digital Ocean.
- Remember, [11]Reduce and Simplify.
+Remember, [12]Reduce and Simplify.
- I may try again later with stock OpenBSD and Caddy, without all of the
- Sivers’ stuff.
+I may try again later with stock OpenBSD and Caddy, without all of the Sivers’
+stuff.
- 2 hours later: I was right. I spun up a fresh OpenBSD server at Vultr
- and configured it myself. No services running but relayd->httpd and so
- far the only site it’s running is [12]jackbaty.com. I like the idea of
- BSD so much that I couldn’t give up quite yet.
+2 hours later: I was right. I spun up a fresh OpenBSD server at Vultr and
+configured it myself. No services running but relayd->httpd and so far the only
+site it’s running is [13]jackbaty.com. I like the idea of BSD so much that I
+couldn’t give up quite yet.
- * [13]OpenBSD
+ • [14]OpenBSD
- [14]« Prev
- Obsidian is not at all joyful to use [15]Next »
- The care and feeding of my system
+[15]« Prev
+Obsidian is not at all joyful to use [16]Next »
+The care and feeding of my system
+[17]✍️ Reply by email
+© Jack Baty | Powered by [18]Hugo & [19]PaperMod[20]
- [16]✍️ Reply by email
+References:
- © Jack Baty | Powered by [17]Hugo & [18]PaperMod
-
-References
-
- Visible links:
- 1. https://baty.net/
- 2. https://baty.net/archives
- 3. https://baty.net/about/
- 4. https://baty.net/tags/
- 5. https://baty.net/uses/
- 6. https://baty.net/search/
- 7. https://baty.net/journal/2023/12/29/running-an-openbsd-server
- 8. https://www.openbsdfoundation.org/
- 9. https://www.vultr.com/
- 10. https://dovecot.org/
- 11. https://baty.net/journal/2023/12/31/reduce-and-simplify
- 12. https://jackbaty.com/
- 13. https://baty.net/tags/openbsd/
- 14. https://baty.net/journal/2024/01/04/obsidian-is-not-at-all-joyful-to-use/
- 15. https://baty.net/2024/01/the-care-and-feeding-of-my-system/
- 16. mailto:jack@baty.net?subject=[baty.net] Re: Ending my OpenBSD experiment (Almost)
- 17. https://gohugo.io/
- 18. https://github.com/adityatelange/hugo-PaperMod/
-
- Hidden links:
- 20. https://baty.net/2024/01/ending-my-openbsd-experiment/#top
+[1] https://baty.net/
+[3] https://baty.net/archives
+[4] https://baty.net/about/
+[5] https://baty.net/tags/
+[6] https://baty.net/uses/
+[7] https://baty.net/search/
+[8] https://baty.net/journal/2023/12/29/running-an-openbsd-server
+[9] https://www.openbsdfoundation.org/
+[10] https://www.vultr.com/
+[11] https://dovecot.org/
+[12] https://baty.net/journal/2023/12/31/reduce-and-simplify
+[13] https://jackbaty.com/
+[14] https://baty.net/tags/openbsd/
+[15] https://baty.net/journal/2024/01/04/obsidian-is-not-at-all-joyful-to-use/
+[16] https://baty.net/2024/01/the-care-and-feeding-of-my-system/
+[17] mailto:jack@baty.net?subject=[baty.net]%20Re:%20Ending%20my%20OpenBSD%20experiment%20%28Almost%29
+[18] https://gohugo.io/
+[19] https://github.com/adityatelange/hugo-PaperMod/
+[20] https://baty.net/2024/01/ending-my-openbsd-experiment/#top
diff --git a/static/archive/benhoyt-com-vfdv1s.txt b/static/archive/benhoyt-com-vfdv1s.txt
index 539904b..ef60df3 100644
--- a/static/archive/benhoyt-com-vfdv1s.txt
+++ b/static/archive/benhoyt-com-vfdv1s.txt
@@ -1,369 +1,343 @@
- [1]Ben Hoyt
- * [2]Home
- * [3]Resume/CV
- * [4]Projects
- * [5]Tech Writing
- * [6]Non-Tech
- * [7]Email
+[1]Ben Hoyt
- * [8]benhoyt.com
- * [9]benhoyt@gmail.com
+ • [2]Home
+ • [3]Resume/CV
+ • [4]Projects
+ • [5]Tech Writing
+ • [6]Non-Tech
+ • [7]Email
+
+ • [8]benhoyt.com
+ • [9]benhoyt@gmail.com
The small web is beautiful
- March 2021
+March 2021
- Summary: I believe that small websites are compelling aesthetically,
- but are also important to help us resist selling our souls to large
- tech companies. In this essay I present a vision for the “small web”
- as well as the small software and architectures that power it. Also,
- a bonus rant about microservices.
+ Summary: I believe that small websites are compelling aesthetically, but
+ are also important to help us resist selling our souls to large tech
+ companies. In this essay I present a vision for the “small web” as well as
+ the small software and architectures that power it. Also, a bonus rant
+ about microservices.
- Go to: [10]Software | [11]Web | [12]Server-side | [13]Static sites |
- [14]Dependencies | [15]Analytics | [16]Microservices
+ Go to: [10]Software | [11]Web | [12]Server-side | [13]Static sites | [14]
+ Dependencies | [15]Analytics | [16]Microservices
- About fifteen years ago, I read E. F. Schumacher’s Small is Beautiful
- and, despite not being interested in economics, I was moved by its
- message. Perhaps even more, I loved the terse poetry of the book’s
- title – it resonated with my frugal upbringing and my own aesthetic.
+About fifteen years ago, I read E. F. Schumacher’s Small is Beautiful and,
+despite not being interested in economics, I was moved by its message. Perhaps
+even more, I loved the terse poetry of the book’s title – it resonated with my
+frugal upbringing and my own aesthetic.
- I think it’s time for a version of that book about technology, with a
- chapter on web development: The Small Web is Beautiful: A Study of Web
- Development as if People Mattered. Until someone writes that, this
- essay will have to do.
+I think it’s time for a version of that book about technology, with a chapter
+on web development: The Small Web is Beautiful: A Study of Web Development as
+if People Mattered. Until someone writes that, this essay will have to do.
- There are two aspects of this: first, small teams and companies. I’m
- not going to talk much about that here, but [17]Basecamp and many
- others have. What I’m going to focus on in this essay is small websites
- and architectures.
+There are two aspects of this: first, small teams and companies. I’m not going
+to talk much about that here, but [17]Basecamp and many others have. What I’m
+going to focus on in this essay is small websites and architectures.
- I’m not the first to talk about the “small web”, but, somewhat
- surprisingly, only a few people have discussed it using that term. Here
- are the main web pages I can find that do:
- * [18]Rediscovering the Small Web by Parimal Satyal: a fabulous
- article about the joy of small, independent (and sometimes retro)
- websites in contrast to the “commercial web”.
- * [19]What is the Small Web?, by Aral Balkan of the Small Technology
- Foundation: more of a manifesto against the surveillance of Big
- Tech than something concrete, but still interesting.
+I’m not the first to talk about the “small web”, but, somewhat surprisingly,
+only a few people have discussed it using that term. Here are the main web
+pages I can find that do:
- Why aim small in this era of fast computers with plenty of RAM? A
- number of reasons, but the ones that are most important to me are:
- * Fewer moving parts. It’s easier to create more robust systems and
- to fix things when they do go wrong.
- * Small software is faster. Fewer bits to download and clog your
- computer’s memory.
- * Reduced power consumption. This is important on a “save the planet”
- scale, but also on the very local scale of increasing the battery
- life of your phone and laptop.
- * The light, frugal aesthetic. That’s personal, I know, but as you’ll
- see, I’m not alone.
+ • [18]Rediscovering the Small Web by Parimal Satyal: a fabulous article about
+ the joy of small, independent (and sometimes retro) websites in contrast to
+ the “commercial web”.
+ • [19]What is the Small Web?, by Aral Balkan of the Small Technology
+ Foundation: more of a manifesto against the surveillance of Big Tech than
+ something concrete, but still interesting.
- So let’s dive in. I want to cover a bunch of different angles, each
- with its own subheading.
+Why aim small in this era of fast computers with plenty of RAM? A number of
+reasons, but the ones that are most important to me are:
+
+ • Fewer moving parts. It’s easier to create more robust systems and to fix
+ things when they do go wrong.
+ • Small software is faster. Fewer bits to download and clog your computer’s
+ memory.
+ • Reduced power consumption. This is important on a “save the planet” scale,
+ but also on the very local scale of increasing the battery life of your
+ phone and laptop.
+ • The light, frugal aesthetic. That’s personal, I know, but as you’ll see,
+ I’m not alone.
+
+So let’s dive in. I want to cover a bunch of different angles, each with its
+own subheading.
Small software
- If we’re going to talk about a small web, we need to start with small
- software.
+If we’re going to talk about a small web, we need to start with small software.
- As a teen, I learned to program using x86 assembly and [20]Forth –
- perhaps odd choices, but my dad was heavily into Forth, and I loved how
- the language was so simple I could write [21]my own bootstrapped
- compiler.
+As a teen, I learned to program using x86 assembly and [20]Forth – perhaps odd
+choices, but my dad was heavily into Forth, and I loved how the language was so
+simple I could write [21]my own bootstrapped compiler.
- In terms of career, I started as an embedded programmer – not as in
- “embedded Linux” but as in microcontrollers where 16KB of RAM was
- generous. My current laptop has 16GB of RAM, and that’s not a lot by
- today’s standards. We were building IP-networked products with one
- millionth the amount of RAM. Those kinds of micros are as cheap as
- chips (ahem), and still widely used for small electronic devices,
- sensors, internet-of-things products, and so on.
+In terms of career, I started as an embedded programmer – not as in “embedded
+Linux” but as in microcontrollers where 16KB of RAM was generous. My current
+laptop has 16GB of RAM, and that’s not a lot by today’s standards. We were
+building IP-networked products with one millionth the amount of RAM. Those
+kinds of micros are as cheap as chips (ahem), and still widely used for small
+electronic devices, sensors, internet-of-things products, and so on.
- You have to think about every byte, compile with size optimizations
- enabled, and reuse buffers. It’s a very different thing from modern web
- development, where a JavaScript app compiles “down” to a 1MB bundle, or
- a single Python object header is 16 bytes before you’ve even got any
- data, or a Go hello-world binary is 2MB even before you’ve added any
- real code.
+You have to think about every byte, compile with size optimizations enabled,
+and reuse buffers. It’s a very different thing from modern web development,
+where a JavaScript app compiles “down” to a 1MB bundle, or a single Python
+object header is 16 bytes before you’ve even got any data, or a Go hello-world
+binary is 2MB even before you’ve added any real code.
- How do you create small programs? I think the main thing is that you
- have to care about size, and most of us don’t think we have time for
- that. Apart from embedded development, there’s an entire programming
- subculture called the [22]demoscene that cares about this. They have
- competitions for the smallest 4KB demos: who can pack the most
- graphical punch into 4096 bytes of executable. That’s smaller than many
- favicons! ([23]Elevated and [24]cdak are two of the highest-rated 4K
- demos.) Many demosceners go on to become game developers.
+How do you create small programs? I think the main thing is that you have to
+care about size, and most of us don’t think we have time for that. Apart from
+embedded development, there’s an entire programming subculture called the [22]
+demoscene that cares about this. They have competitions for the smallest 4KB
+demos: who can pack the most graphical punch into 4096 bytes of executable.
+That’s smaller than many favicons! ([23]Elevated and [24]cdak are two of the
+highest-rated 4K demos.) Many demosceners go on to become game developers.
- It’s not just about executable size … when you’re developing your next
- command line tool, if you use Go or Rust or even C, your program will
- be much faster, smaller, and use less memory than a Python or Java
- equivalent. And easier to install. If you don’t understand why, please
- do learn. (It’s out of scope for this essay, but to summarize: Go,
- Rust, and C compile to ready-to-execute machine code, don’t carry
- around a virtual machine, and don’t have memory overhead for objects
- like integers.)
+It’s not just about executable size … when you’re developing your next command
+line tool, if you use Go or Rust or even C, your program will be much faster,
+smaller, and use less memory than a Python or Java equivalent. And easier to
+install. If you don’t understand why, please do learn. (It’s out of scope for
+this essay, but to summarize: Go, Rust, and C compile to ready-to-execute
+machine code, don’t carry around a virtual machine, and don’t have memory
+overhead for objects like integers.)
- But why not apply some of the same principles to web development? In
- the web world, I think the main trick is to be careful what
- dependencies you include, and also what dependencies they pull in. In
- short, know node_modules – or maybe better, no node_modules. More about
- this [25]below.
+But why not apply some of the same principles to web development? In the web
+world, I think the main trick is to be careful what dependencies you include,
+and also what dependencies they pull in. In short, know node_modules – or maybe
+better, no node_modules. More about this [25]below.
- Niklaus Wirth of Pascal fame wrote a famous paper in 1995 called [26]A
- Plea for Lean Software [PDF]. His take is that “a primary cause for the
- complexity is that software vendors uncritically adopt almost any
- feature that users want”, and “when a system’s power is measured by the
- number of its features, quantity becomes more important than quality”.
- He goes on to describe Oberon, a computer language (which reminds me of
- Go in several ways) and an operating system that he believes helps
- solve the complexity problem. Definitely wirth a read!
+Niklaus Wirth of Pascal fame wrote a famous paper in 1995 called [26]A Plea for
+Lean Software [PDF]. His take is that “a primary cause for the complexity is
+that software vendors uncritically adopt almost any feature that users want”,
+and “when a system’s power is measured by the number of its features, quantity
+becomes more important than quality”. He goes on to describe Oberon, a computer
+language (which reminds me of Go in several ways) and an operating system that
+he believes helps solve the complexity problem. Definitely wirth a read!
- I’ve been mulling over this for a number of years – back in 2008 I
- wrote a sarcastic dig at how bloated Adobe Reader had become: [27]Thank
- you, Adobe Reader 9! It was a 33MB download and required 220MB of hard
- drive space even in 2008 (it’s now a 150MB download, and I don’t know
- how much hard drive space it requires, because I don’t install it these
- days).
+I’ve been mulling over this for a number of years – back in 2008 I wrote a
+sarcastic dig at how bloated Adobe Reader had become: [27]Thank you, Adobe
+Reader 9! It was a 33MB download and required 220MB of hard drive space even in
+2008 (it’s now a 150MB download, and I don’t know how much hard drive space it
+requires, because I don’t install it these days).
- But instead of just complaining, how do we actually solve this problem?
- Concretely, I think we need to start doing the following:
- * Care about size: this sounds obvious, but things only change when
- people think they’re important.
- * Measure: both your executable’s size, and your program’s memory
- usage. You may want to measure over time, and make it a blocking
- issue if the measurements grow more than x% in a release. Or you
- could hold a memory-reduction sprint every so often.
- * Language: choose a backend language that has a chance, for example
- Rust, C or C++, or for servers, Go. These languages aren’t right
- for everything (like data transformation scripts), but they produce
- small executables, and they’re good for CLIs and desktop apps.
- * Remove: cut down your feature set. Aim for a small number of
- high-quality features. My car can’t fly or float, and that’s okay –
- it drives well.
- * Say no to new features: unless they really fit your philosophy, or
- add more than they cost over the lifetime of your project.
- * Dependencies: understand the size and complexity of each dependency
- you pull in. Use only built-in libraries if you can.
+But instead of just complaining, how do we actually solve this problem?
+Concretely, I think we need to start doing the following:
+
+ • Care about size: this sounds obvious, but things only change when people
+ think they’re important.
+ • Measure: both your executable’s size, and your program’s memory usage. You
+ may want to measure over time, and make it a blocking issue if the
+ measurements grow more than x% in a release. Or you could hold a
+ memory-reduction sprint every so often.
+ • Language: choose a backend language that has a chance, for example Rust, C
+ or C++, or for servers, Go. These languages aren’t right for everything
+ (like data transformation scripts), but they produce small executables, and
+ they’re good for CLIs and desktop apps.
+ • Remove: cut down your feature set. Aim for a small number of high-quality
+ features. My car can’t fly or float, and that’s okay – it drives well.
+ • Say no to new features: unless they really fit your philosophy, or add more
+ than they cost over the lifetime of your project.
+ • Dependencies: understand the size and complexity of each dependency you
+ pull in. Use only built-in libraries if you can.
Small websites
- I’m glad there’s a growing number of people interested in small
- websites.
+I’m glad there’s a growing number of people interested in small websites.
- A few months ago there was a sequence of posts to Hacker News about
- various “clubs” you could post your small website on: the [28]1MB Club
- ([29]comments), [30]512KB Club ([31]comments), [32]250KB Club
- ([33]comments), and even the [34]10KB Club ([35]comments). I think
- those are a fun indicator of renewed interested in minimalism, but I
- will say that raw size isn’t enough – a 2KB site with no real content
- isn’t much good, and a page with 512KB of very slow JavaScript is worse
- than a snappy site with 4MB of well-chosen images.
+A few months ago there was a sequence of posts to Hacker News about various
+“clubs” you could post your small website on: the [28]1MB Club ([29]comments),
+[30]512KB Club ([31]comments), [32]250KB Club ([33]comments), and even the [34]
+10KB Club ([35]comments). I think those are a fun indicator of renewed
+interested in minimalism, but I will say that raw size isn’t enough – a 2KB
+site with no real content isn’t much good, and a page with 512KB of very slow
+JavaScript is worse than a snappy site with 4MB of well-chosen images.
- Some of my favourite small websites are:
+Some of my favourite small websites are:
- [36]Hacker News: I personally like the minimalist, almost brutalist
- design, but I love its lightness even more. I just downloaded the home
- page, and loading all resources transfers only 21KB (61KB
- uncompressed). Even pages with huge comment threads only transfer about
- 100KB of compressed data, and load quickly. Reddit has become such a
- bloated mess in comparison. Hacker News, never change!
+[36]Hacker News: I personally like the minimalist, almost brutalist design, but
+I love its lightness even more. I just downloaded the home page, and loading
+all resources transfers only 21KB (61KB uncompressed). Even pages with huge
+comment threads only transfer about 100KB of compressed data, and load quickly.
+Reddit has become such a bloated mess in comparison. Hacker News, never change!
- [37]Lobsters: a similar news-and-voting site, with slightly more
- “modern” styling. It uses some JavaScript and profile icons, but it’s
- still clean and fast, and the total transfer size for the homepage is
- only 102KB. You just don’t need megabytes to make a good website.
+[37]Lobsters: a similar news-and-voting site, with slightly more “modern”
+styling. It uses some JavaScript and profile icons, but it’s still clean and
+fast, and the total transfer size for the homepage is only 102KB. You just
+don’t need megabytes to make a good website.
- [38]Sourcehut: I like the concept behind Drew DeVault’s business, but I
- love how small and anti-fluff the website is. He has set up a mini-site
- called the [39]Software Forge Performance Index that tracks size and
- browser performance of the prominent source code websites – Sourcehut
- is far and away the lightest and fastest. Even his homepage is only
- 81KB, including several screenshot thumbnails.
+[38]Sourcehut: I like the concept behind Drew DeVault’s business, but I love
+how small and anti-fluff the website is. He has set up a mini-site called the
+[39]Software Forge Performance Index that tracks size and browser performance
+of the prominent source code websites – Sourcehut is far and away the lightest
+and fastest. Even his homepage is only 81KB, including several screenshot
+thumbnails.
- [40]SQLite: not only is SQLite a small, powerful SQL database engine,
- the website is fantastically small and content-rich. Even their
- 7000-word [41]page about testing is only 70KB. How do they do this?
- It’s not magic: focus on high-quality textual content, minimal CSS, no
- JavaScript, and very few images (a small logo and some SVGs).
+[40]SQLite: not only is SQLite a small, powerful SQL database engine, the
+website is fantastically small and content-rich. Even their 7000-word [41]page
+about testing is only 70KB. How do they do this? It’s not magic: focus on
+high-quality textual content, minimal CSS, no JavaScript, and very few images
+(a small logo and some SVGs).
- [42]LWN: I’m a little biased, because I’ve written [43]articles for
- them, but they’re an excellent website for Linux and programming news.
- Extremely high-quality technical content (and a high bar for authors).
- They’re definitely niche, and have a “we focus on quality content, not
- updating our CSS every year” kind of look – they’ve been putting out
- great content for 23 years! Their homepage only downloads 44KB (90KB
- uncompressed).
+[42]LWN: I’m a little biased, because I’ve written [43]articles for them, but
+they’re an excellent website for Linux and programming news. Extremely
+high-quality technical content (and a high bar for authors). They’re definitely
+niche, and have a “we focus on quality content, not updating our CSS every
+year” kind of look – they’ve been putting out great content for 23 years! Their
+homepage only downloads 44KB (90KB uncompressed).
- [44]Dan Luu’s blog: this is one of the more hardcore examples. His
- inline CSS is only about 200 bytes (the pages are basically unstyled),
- and his HTML source code doesn’t use any linefeed characters. Kind of a
- fun point, although then he goes on to load 20KB of Google Analytics
- JavaScript…
+[44]Dan Luu’s blog: this is one of the more hardcore examples. His inline CSS
+is only about 200 bytes (the pages are basically unstyled), and his HTML source
+code doesn’t use any linefeed characters. Kind of a fun point, although then he
+goes on to load 20KB of Google Analytics JavaScript…
- As a friend pointed out, those websites have something of an
- “anti-aesthetic aesthetic”. I confess to not minding that at all, but
- on the other hand, small doesn’t have to mean ugly. More and more
- personal blogs and websites have adopted a small web approach but are
- more typographically appealing:
- * [45]Armin Ronacher’s Thoughts and Writings
- * [46]Chris Wellons’ “Null program” blog
- * [47]Eric Radman’s BSD and SQL blog
- * [48]Hugo Tunius’ programming blog
- * [49]James Hague’s “Programming in the Twenty-First Century”
- * [50]Julia Evans’ programming blog
+As a friend pointed out, those websites have something of an “anti-aesthetic
+aesthetic”. I confess to not minding that at all, but on the other hand, small
+doesn’t have to mean ugly. More and more personal blogs and websites have
+adopted a small web approach but are more typographically appealing:
- There are many, many more. Programmer Sijmen Mulder created a nice list
- of [51]text-only websites – not quite the same thing as small, but it
- definitely overlaps!
+ • [45]Armin Ronacher’s Thoughts and Writings
+ • [46]Chris Wellons’ “Null program” blog
+ • [47]Eric Radman’s BSD and SQL blog
+ • [48]Hugo Tunius’ programming blog
+ • [49]James Hague’s “Programming in the Twenty-First Century”
+ • [50]Julia Evans’ programming blog
- However, it’s not just about raw size, but about an “ethos of small”.
- It’s caring about the users of your site: that your pages download
- fast, are easy to read, have interesting content, and don’t load scads
- of JavaScript for Google or Facebook’s trackers. Building a website
- from scratch is not everyone’s cup of tea, but for those of us who do
- it, maybe we can promote templates and tools that produce small sites
- that encourage quality over quantity.
+There are many, many more. Programmer Sijmen Mulder created a nice list of [51]
+text-only websites – not quite the same thing as small, but it definitely
+overlaps!
- For this website, I lovingly crafted each byte of HTML and CSS by hand,
- like a hipster creating a craft beer. Seriously though, if your focus
- is good content, it’s not hard to create a simple template from scratch
- with just a few lines of HTML and CSS. It will be small and fast, and
- it’ll be yours.
+However, it’s not just about raw size, but about an “ethos of small”. It’s
+caring about the users of your site: that your pages download fast, are easy to
+read, have interesting content, and don’t load scads of JavaScript for Google
+or Facebook’s trackers. Building a website from scratch is not everyone’s cup
+of tea, but for those of us who do it, maybe we can promote templates and tools
+that produce small sites that encourage quality over quantity.
- Loading this essay transfers about 23KB (56KB uncompressed), including
- the favicon and analytics script. It’s small, fast, and readable on
- desktop or mobile. I don’t think it’s too bad looking, but I’m
- primarily aiming for a minimalist design focussed on the content.
+For this website, I lovingly crafted each byte of HTML and CSS by hand, like a
+hipster creating a craft beer. Seriously though, if your focus is good content,
+it’s not hard to create a simple template from scratch with just a few lines of
+HTML and CSS. It will be small and fast, and it’ll be yours.
- In addition to making sure your HTML and CSS are small, be sure to
- compress your images properly. Two basic things here: don’t upload
- ultra-high resolution images straight from your camera, and use a
- reasonable amount of JPEG compression for photos (and PNG for
- screenshots or vector art). Even for large images, you can usually use
- 75% or 80% compression and still have an image without JPEG noise. For
- example, the large 1920x775 image on the top of my [52]side business’s
- homepage is only 300KB.
+Loading this essay transfers about 23KB (56KB uncompressed), including the
+favicon and analytics script. It’s small, fast, and readable on desktop or
+mobile. I don’t think it’s too bad looking, but I’m primarily aiming for a
+minimalist design focussed on the content.
- Speaking of hero images, you don’t need big irrelevant images at the
- top of your blog posts. They just add hundreds of kilobytes (even
- megabytes) to your page weight, and don’t provide value. And please
- don’t scatter your article with animated GIFs: if there’s something
- animated on the screen, I can hardly concentrate enough to read the
- text – and I’m [53]not the [54]only one. Include relevant, non-stock
- images that provide value equal to their weight in bytes. Bare text is
- okay, too, like a magazine article.
+In addition to making sure your HTML and CSS are small, be sure to compress
+your images properly. Two basic things here: don’t upload ultra-high resolution
+images straight from your camera, and use a reasonable amount of JPEG
+compression for photos (and PNG for screenshots or vector art). Even for large
+images, you can usually use 75% or 80% compression and still have an image
+without JPEG noise. For example, the large 1920x775 image on the top of my [52]
+side business’s homepage is only 300KB.
- [55]IndieWeb.org is a great resource here, though they use the term
- “indie” rather than “small”. This movement looks more organic than the
- [56]Small Technology Foundation (which has even been [57]critiqued as
- “digital green-washing”), and their wiki has a lot more real content.
- IndieWeb also promotes local [58]Homebrew Website Clubs and
- [59]IndieWebCamp meetups.
+Speaking of hero images, you don’t need big irrelevant images at the top of
+your blog posts. They just add hundreds of kilobytes (even megabytes) to your
+page weight, and don’t provide value. And please don’t scatter your article
+with animated GIFs: if there’s something animated on the screen, I can hardly
+concentrate enough to read the text – and I’m [53]not the [54]only one. Include
+relevant, non-stock images that provide value equal to their weight in bytes.
+Bare text is okay, too, like a magazine article.
+
+[55]IndieWeb.org is a great resource here, though they use the term “indie”
+rather than “small”. This movement looks more organic than the [56]Small
+Technology Foundation (which has even been [57]critiqued as “digital
+green-washing”), and their wiki has a lot more real content. IndieWeb also
+promotes local [58]Homebrew Website Clubs and [59]IndieWebCamp meetups.
Emphasize server-side, not JavaScript
- JavaScript is a mixed blessing for the web, and more often than not a
- bane for small websites: it adds to the download size and time, it can
- be a performance killer, it’s bad for accessibility, and if you don’t
- hold it right, it’s [60]bad for search engines. Plus, if your website
- is content-heavy, it probably isn’t adding much.
+JavaScript is a mixed blessing for the web, and more often than not a bane for
+small websites: it adds to the download size and time, it can be a performance
+killer, it’s bad for accessibility, and if you don’t hold it right, it’s [60]
+bad for search engines. Plus, if your website is content-heavy, it probably
+isn’t adding much.
- Don’t get me wrong: JavaScript is sometimes unavoidable, and is great
- where it’s great. If you’re developing a browser-based application like
- Gmail or Google Maps, you should almost certainly be using JavaScript.
- But for your next blog, brochure website, or project documentation
- site, please consider plain HTML and CSS.
+Don’t get me wrong: JavaScript is sometimes unavoidable, and is great where
+it’s great. If you’re developing a browser-based application like Gmail or
+Google Maps, you should almost certainly be using JavaScript. But for your next
+blog, brochure website, or project documentation site, please consider plain
+HTML and CSS.
- If your site – like a lot of sites – is somewhere in between and
- contains some light interaction, consider using JavaScript only for the
- parts of the page that need it. There’s no need to overhaul your whole
- site using React and Redux just to add a form. Letting your server
- generate HTML is still an effective way to create fast websites.
+If your site – like a lot of sites – is somewhere in between and contains some
+light interaction, consider using JavaScript only for the parts of the page
+that need it. There’s no need to overhaul your whole site using React and Redux
+just to add a form. Letting your server generate HTML is still an effective way
+to create fast websites.
- [61]Stack Overflow is a case in point. From day one, they’ve made
- [62]performance a feature by rendering their pages on the server, and
- by measuring and reducing render time. I’m sure the Stack Overflow code
- has changed quite a lot since the Jeff Atwood days – it now makes a ton
- of extra requests for advertising purposes – but the content still
- loads fast.
+[61]Stack Overflow is a case in point. From day one, they’ve made [62]
+performance a feature by rendering their pages on the server, and by measuring
+and reducing render time. I’m sure the Stack Overflow code has changed quite a
+lot since the Jeff Atwood days – it now makes a ton of extra requests for
+advertising purposes – but the content still loads fast.
- [63]Hacker News (there’s that site again) is a server-side classic.
- With only [64]one tiny JavaScript file for voting, the HTML generated
- on the server does the rest. And [65]apparently it still runs on a
- single machine.
+[63]Hacker News (there’s that site again) is a server-side classic. With only
+[64]one tiny JavaScript file for voting, the HTML generated on the server does
+the rest. And [65]apparently it still runs on a single machine.
- Around fifteen years ago there was this great idea called
- [66]progressive enhancement. The idea was to serve usable HTML content
- to everyone, but users with JavaScript enabled or fast internet
- connections would get an enhanced version with a more streamlined user
- interface. In fact, Hacker News itself uses progressive enhancement:
- even in 2021, you can still turn off JavaScript and use the voting
- buttons. It’s a bit clunkier because voting now requires a page reload,
- but it works fine.
+Around fifteen years ago there was this great idea called [66]progressive
+enhancement. The idea was to serve usable HTML content to everyone, but users
+with JavaScript enabled or fast internet connections would get an enhanced
+version with a more streamlined user interface. In fact, Hacker News itself
+uses progressive enhancement: even in 2021, you can still turn off JavaScript
+and use the voting buttons. It’s a bit clunkier because voting now requires a
+page reload, but it works fine.
- Is progressive enhancement still relevant in 2021? Arguably not, though
- some die-hards still turn JavaScript off, or at least enable it only
- for sites they trust. However, I think it’s the mentality that’s most
- important: it shows the developer cares about performance, size, and
- alternative users. If Hacker News voting didn’t work without
- JavaScript, I don’t think that would be a big problem – but it shows a
- certain kind of nerdish care that it does work. Plus, the JavaScript
- they do have is only 2KB (5KB uncompressed).
+Is progressive enhancement still relevant in 2021? Arguably not, though some
+die-hards still turn JavaScript off, or at least enable it only for sites they
+trust. However, I think it’s the mentality that’s most important: it shows the
+developer cares about performance, size, and alternative users. If Hacker News
+voting didn’t work without JavaScript, I don’t think that would be a big
+problem – but it shows a certain kind of nerdish care that it does work. Plus,
+the JavaScript they do have is only 2KB (5KB uncompressed).
- Compare that to the 8MB (14MB uncompressed) that the [67]Reddit
- homepage loads. And this across 201 requests – I kid you not! – most of
- which is JavaScript to power all the ads and tracking. Lovely…
+Compare that to the 8MB (14MB uncompressed) that the [67]Reddit homepage loads.
+And this across 201 requests – I kid you not! – most of which is JavaScript to
+power all the ads and tracking. Lovely…
- You don’t need a “framework” to develop this way, of course, but there
- are some tools that make this style of server-side development easier.
- [68]Turbolinks from the Basecamp folks was an early one, and it’s now
- been superseded by [69]Turbo, which is apparently used to power their
- email service [70]Hey. I haven’t used these personally, but the ideas
- are clever (and surprisingly old-skool): use standard links and form
- submissions, [71]serve plain HTML, but speed it up with WebSockets and
- JavaScript if available. Just today, in fact, someone posted a new
- article on Hacker News which claims [72]“The Future of Web Software Is
- HTML-over-WebSockets”. If Hey is anything to go by, this technique is
- fast!
+You don’t need a “framework” to develop this way, of course, but there are some
+tools that make this style of server-side development easier. [68]Turbolinks
+from the Basecamp folks was an early one, and it’s now been superseded by [69]
+Turbo, which is apparently used to power their email service [70]Hey. I haven’t
+used these personally, but the ideas are clever (and surprisingly old-skool):
+use standard links and form submissions, [71]serve plain HTML, but speed it up
+with WebSockets and JavaScript if available. Just today, in fact, someone
+posted a new article on Hacker News which claims [72]“The Future of Web
+Software Is HTML-over-WebSockets”. If Hey is anything to go by, this technique
+is fast!
- On the other hand, sometimes you can reduce overall complexity by using
- JavaScript for the whole page if you’re going to need it anyway. For
- example, the registry pages on my wedding registry website are rendered
- on the client (they actually [73]use Elm, which compiles to
- JavaScript). I do need the interactivity of JavaScript (it’s more
- “single page application” than mere content), but I don’t need
- server-side rendering or good SEO for these pages. The homepage is a
- simple server-rendered template, but the registry pages are fully
- client-rendered.
+On the other hand, sometimes you can reduce overall complexity by using
+JavaScript for the whole page if you’re going to need it anyway. For example,
+the registry pages on my wedding registry website are rendered on the client
+(they actually [73]use Elm, which compiles to JavaScript). I do need the
+interactivity of JavaScript (it’s more “single page application” than mere
+content), but I don’t need server-side rendering or good SEO for these pages.
+The homepage is a simple server-rendered template, but the registry pages are
+fully client-rendered.
Static sites and site generators
- Another thing there’s been renewed interest in recently is static
- websites (these used to be called just “websites”). You upload some
- static HTML (and CSS and JavaScript) to a static file server, and
- that’s it.
+Another thing there’s been renewed interest in recently is static websites
+(these used to be called just “websites”). You upload some static HTML (and CSS
+and JavaScript) to a static file server, and that’s it.
- Improving on that, there are many “static site generators” available.
- These are tools that generate a static site from simple templates, so
- that you don’t have to copy your site’s header and footer into every
- HTML file by hand. When you add an article or make a change, run the
- script to re-generate. If you’re hosting a simple site or blog or even
- a news site, this is a great way to go. It’s content, after all, not an
- interactive application.
+Improving on that, there are many “static site generators” available. These are
+tools that generate a static site from simple templates, so that you don’t have
+to copy your site’s header and footer into every HTML file by hand. When you
+add an article or make a change, run the script to re-generate. If you’re
+hosting a simple site or blog or even a news site, this is a great way to go.
+It’s content, after all, not an interactive application.
- I use [74]GitHub Pages on this site just because it’s a free host that
- supports SSL, and automatically builds your site using the [75]Jekyll
- static site generator whenever you push a change. I have a standard
- header and include the same CSS across all pages easily, though you can
- have multiple templates or “layouts” if you want. Because most people
- only view one or two articles on my site, I include my CSS inline. With
- HTTP/2, this doesn’t make much difference, but Lighthouse showed around
- 200ms with inline CSS, 300ms with external CSS.
+I use [74]GitHub Pages on this site just because it’s a free host that supports
+SSL, and automatically builds your site using the [75]Jekyll static site
+generator whenever you push a change. I have a standard header and include the
+same CSS across all pages easily, though you can have multiple templates or
+“layouts” if you want. Because most people only view one or two articles on my
+site, I include my CSS inline. With HTTP/2, this doesn’t make much difference,
+but Lighthouse showed around 200ms with inline CSS, 300ms with external CSS.
+
+Here’s an example of what a simple Jekyll page looks like (the start of this
+essay, in fact):
- Here’s an example of what a simple Jekyll page looks like (the start of
- this essay, in fact):
---
layout: default
title: "The small web is beautiful"
@@ -372,48 +346,46 @@ Static sites and site generators
---
Markdown text here.
- I’ve also used [76]Hugo, which is a really fast static site generator
- written in Go – it generates even large sites with thousands of pages
- in a few seconds. And there are [77]many other options available.
+I’ve also used [76]Hugo, which is a really fast static site generator written
+in Go – it generates even large sites with thousands of pages in a few seconds.
+And there are [77]many other options available.
Fewer dependencies
- There’s nothing that blows up the size of your software (or JavaScript
- bundle) like third party dependencies. I always find a web project’s
- node_modules directory hard to look at – just the sheer volume of stuff
- in there makes me sad.
+There’s nothing that blows up the size of your software (or JavaScript bundle)
+like third party dependencies. I always find a web project’s node_modules
+directory hard to look at – just the sheer volume of stuff in there makes me
+sad.
- Different languages seem to have different “dependency cultures”.
- JavaScript, of course, is notorious for an “if it can be a library, it
- should be” attitude, resulting in the [78]left-pad disaster as well as
- other minuscule libraries like the 3-line [79]isarray. There are also
- big, heavy packages like [80]Moment.js, which takes [81]160KB even when
- minified. There are ways to shrink it down if you don’t need all
- locales, but it’s not the default, so most people don’t (you’re
- probably better off choosing a more modular approach like
- [82]date-fns).
+Different languages seem to have different “dependency cultures”. JavaScript,
+of course, is notorious for an “if it can be a library, it should be” attitude,
+resulting in the [78]left-pad disaster as well as other minuscule libraries
+like the 3-line [79]isarray. There are also big, heavy packages like [80]
+Moment.js, which takes [81]160KB even when minified. There are ways to shrink
+it down if you don’t need all locales, but it’s not the default, so most people
+don’t (you’re probably better off choosing a more modular approach like [82]
+date-fns).
- Go now has good dependency management with the recent [83]modules
- tooling, but it also has a culture of “use the standard library if you
- can”. Russ Cox wrote an excellent essay about the downsides of not
- being careful with your dependencies: [84]Our Software Dependency
- Problem. Go co-creator Rob Pike even made this one of his [85]Go
- proverbs: “A little copying is better than a little dependency.” You
- can probably guess by now, but I like this minimalist approach: apart
- from reducing the number of points of failure, it makes programs
- smaller.
+Go now has good dependency management with the recent [83]modules tooling, but
+it also has a culture of “use the standard library if you can”. Russ Cox wrote
+an excellent essay about the downsides of not being careful with your
+dependencies: [84]Our Software Dependency Problem. Go co-creator Rob Pike even
+made this one of his [85]Go proverbs: “A little copying is better than a little
+dependency.” You can probably guess by now, but I like this minimalist
+approach: apart from reducing the number of points of failure, it makes
+programs smaller.
- Python, Ruby, Java, and C# seem to be somewhere in between: people use
- a fair number of dependencies, but from what I’ve seen there’s more
- care taken and it doesn’t get as out of hand as node_modules.
- Admittedly it is a little unfair, as Python (and those other languages)
- have standard libraries that have more in them than JavaScript’s.
+Python, Ruby, Java, and C# seem to be somewhere in between: people use a fair
+number of dependencies, but from what I’ve seen there’s more care taken and it
+doesn’t get as out of hand as node_modules. Admittedly it is a little unfair,
+as Python (and those other languages) have standard libraries that have more in
+them than JavaScript’s.
+
+The website [86]YouMightNotNeedjQuery.com shows how many of the tasks you think
+you might need a library for are actually quite simple to do with plain
+JavaScript. For example, in one of my projects I use a function like the
+following to make an API request with plain old XMLHttpRequest:
- The website [86]YouMightNotNeedjQuery.com shows how many of the tasks
- you think you might need a library for are actually quite simple to do
- with plain JavaScript. For example, in one of my projects I use a
- function like the following to make an API request with plain old
- XMLHttpRequest:
function postJson(url, data, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
@@ -426,303 +398,293 @@ function postJson(url, data, callback) {
xhr.send(JSON.stringify(data));
}
- The moral of the story: think twice before adding dependencies. You’ll
- keep your websites and programs smaller and more reliable, and you’ll
- thank Russ Cox later.
+The moral of the story: think twice before adding dependencies. You’ll keep
+your websites and programs smaller and more reliable, and you’ll thank Russ Cox
+later.
Small analytics
- Most website owners want some form of analytics to see how many
- visitors are coming to their site, and from where. The go-to tool is
- Google Analytics: it’s easy to set up and the UI is pretty
- comprehensive. But there’s a cost: it adds a significant amount of
- weight to your page (19KB of JavaScript, 46KB uncompressed), and it
- sends a lot of user data for Google to collect.
+Most website owners want some form of analytics to see how many visitors are
+coming to their site, and from where. The go-to tool is Google Analytics: it’s
+easy to set up and the UI is pretty comprehensive. But there’s a cost: it adds
+a significant amount of weight to your page (19KB of JavaScript, 46KB
+uncompressed), and it sends a lot of user data for Google to collect.
- Once again, there’s been renewed interest in smaller, more
- privacy-friendly analytics systems in recent times. Just this morning I
- read a provocative article that was highly-voted on Hacker News called
- [87]“Google Analytics: Stop feeding the beast”.
+Once again, there’s been renewed interest in smaller, more privacy-friendly
+analytics systems in recent times. Just this morning I read a provocative
+article that was highly-voted on Hacker News called [87]“Google Analytics: Stop
+feeding the beast”.
- Last year I wrote two articles for LWN on the subject, so I won’t say
- too much more here:
- * [88]Lightweight alternatives to Google Analytics: replacing it with
- lightweight open source and privacy-conscious alternatives,
- specifically [89]GoatCounter and [90]Plausible.
- * [91]More alternatives to Google Analytics: some heavier
- alternatives, and a brief look at log-based analytics tools.
+Last year I wrote two articles for LWN on the subject, so I won’t say too much
+more here:
- For this website I use GoatCounter, which is available as a low-cost
- hosted service (free for non-commercial use) or as a self-hosted tool.
- I really like what Martin is doing here, and how small and simple the
- tool is: no bells and whistles, just the basic traffic numbers that
- most people want.
+ • [88]Lightweight alternatives to Google Analytics: replacing it with
+ lightweight open source and privacy-conscious alternatives, specifically
+ [89]GoatCounter and [90]Plausible.
+ • [91]More alternatives to Google Analytics: some heavier alternatives, and a
+ brief look at log-based analytics tools.
+
+For this website I use GoatCounter, which is available as a low-cost hosted
+service (free for non-commercial use) or as a self-hosted tool. I really like
+what Martin is doing here, and how small and simple the tool is: no bells and
+whistles, just the basic traffic numbers that most people want.
Small architectures (not microservices)
- Small websites are great for users, but small architectures are great
- for developers. A small, simple codebase is easy to maintain, and will
- have fewer bugs than a large, sprawling system with lots of interaction
- points.
+Small websites are great for users, but small architectures are great for
+developers. A small, simple codebase is easy to maintain, and will have fewer
+bugs than a large, sprawling system with lots of interaction points.
- I contend that the “microservices everywhere” buzz is a big problem.
- Microservices may be used successfully at Google and Amazon, but most
- companies don’t need to build that way. They introduce complexity in
- the code, API definitions, networking, deployment, server
- infrastructure, monitoring, database transactions – just about every
- aspect of a system is made more complex. Why is that?
- * Code: you have lots of little repositories, possibly in different
- languages, and each has to have some way to talk to the other
- services (JSON over HTTP, gRPC, etc). With a monolithic system,
- it’s all in one language (much better for a small team), calling
- other modules is just a function call, and system-wide refactoring
- is comparatively easy (especially in a statically typed language
- like Go or Java).
- * API definitions: with many services talking to each other, suddenly
- you need standardized interfaces for how they communicate. You
- spend a lot of time setting up gRPC or JSON schema definitions. In
- a single codebase, a function signature is the API definition.
- * Networking: with microservices, a function call is a network call,
- and you spend time setting up your network infrastructure, thinking
- about timeouts and retries, and maybe even designing inter-service
- authentication. In monolithic systems, you only worry about
- networking when talking to your database, cloud provider, and
- users.
- * Deployment: at a previous company I worked at, once we started
- building with microservices, suddenly we needed fancy deployment
- tooling and a dedicated infrastructure team to manage it all. You
- can get by with a lot less if you’re only deploying a few services.
- * Server infrastructure: you’ll probably need to set up new
- infrastructure – lots of small virtual machines, or a
- Kubernetes-based system. Kubernetes in itself is a complex
- distributed application (even [92]Google admits it’s too complex),
- and it takes a lot of work – or a lot of money – to run properly.
- * Monitoring: to debug issues, you’ll need costly
- distributed-monitoring software like Datadog to see what’s going
- on. When an outage occurs, you’ll scramble to determine which
- service is responsible, which team to page, and so on. Compare that
- with a simple stack trace or single-service issue.
- * Database transactions: these are difficult to impossible in a
- microservices architecture. You may be able to design your way out
- of them, but that’s not easy either. With a monolith, just type
- BEGIN ... COMMIT, or however your database library spells it.
+I contend that the “microservices everywhere” buzz is a big problem.
+Microservices may be used successfully at Google and Amazon, but most companies
+don’t need to build that way. They introduce complexity in the code, API
+definitions, networking, deployment, server infrastructure, monitoring,
+database transactions – just about every aspect of a system is made more
+complex. Why is that?
- It’s been said before, but microservices solve a people problem, not a
- technical one. But beware of [93]Conway’s Law: your architecture will
- mimic your company structure. Or the reverse – you’ll have to hire and
- reorg so that your company structure matches the architecture that
- microservices require: lots of engineers on lots of small teams, with
- each team managing a couple of microservices.
+ • Code: you have lots of little repositories, possibly in different
+ languages, and each has to have some way to talk to the other services
+ (JSON over HTTP, gRPC, etc). With a monolithic system, it’s all in one
+ language (much better for a small team), calling other modules is just a
+ function call, and system-wide refactoring is comparatively easy
+ (especially in a statically typed language like Go or Java).
+ • API definitions: with many services talking to each other, suddenly you
+ need standardized interfaces for how they communicate. You spend a lot of
+ time setting up gRPC or JSON schema definitions. In a single codebase, a
+ function signature is the API definition.
+ • Networking: with microservices, a function call is a network call, and you
+ spend time setting up your network infrastructure, thinking about timeouts
+ and retries, and maybe even designing inter-service authentication. In
+ monolithic systems, you only worry about networking when talking to your
+ database, cloud provider, and users.
+ • Deployment: at a previous company I worked at, once we started building
+ with microservices, suddenly we needed fancy deployment tooling and a
+ dedicated infrastructure team to manage it all. You can get by with a lot
+ less if you’re only deploying a few services.
+ • Server infrastructure: you’ll probably need to set up new infrastructure –
+ lots of small virtual machines, or a Kubernetes-based system. Kubernetes in
+ itself is a complex distributed application (even [92]Google admits it’s
+ too complex), and it takes a lot of work – or a lot of money – to run
+ properly.
+ • Monitoring: to debug issues, you’ll need costly distributed-monitoring
+ software like Datadog to see what’s going on. When an outage occurs, you’ll
+ scramble to determine which service is responsible, which team to page, and
+ so on. Compare that with a simple stack trace or single-service issue.
+ • Database transactions: these are difficult to impossible in a microservices
+ architecture. You may be able to design your way out of them, but that’s
+ not easy either. With a monolith, just type BEGIN ... COMMIT, or however
+ your database library spells it.
- That doesn’t mean microservices are always the wrong choice: they may
- be necessary in huge engineering organizations. However, if you’re
- working at such a company, you’ve probably already been using
- microservices for years. If you’re not “Google size”, you should think
- twice before copying their development practices.
+It’s been said before, but microservices solve a people problem, not a
+technical one. But beware of [93]Conway’s Law: your architecture will mimic
+your company structure. Or the reverse – you’ll have to hire and reorg so that
+your company structure matches the architecture that microservices require:
+lots of engineers on lots of small teams, with each team managing a couple of
+microservices.
- What’s the alternative? The term “monolith” has a bad rap, but I agree
- with David at Basecamp that [94]monoliths can be majestic. Basecamp is
- a large, monolithic application, and they run it with just a dozen
- programmers. David is quick to point out that “the Majestic Monolith
- doesn’t pretend to provide a failsafe architectural road to glory”. You
- still have to think, design, and write good code.
+That doesn’t mean microservices are always the wrong choice: they may be
+necessary in huge engineering organizations. However, if you’re working at such
+a company, you’ve probably already been using microservices for years. If
+you’re not “Google size”, you should think twice before copying their
+development practices.
- Thankfully, people are bouncing back from the cargo culting. Just do a
- search for [95]“why not microservices” and you’ll find lots of good
- articles on the subject. One of the recent ones I’ve read is from
- Tailscale: [96]Modules, monoliths, and microservices.
+What’s the alternative? The term “monolith” has a bad rap, but I agree with
+David at Basecamp that [94]monoliths can be majestic. Basecamp is a large,
+monolithic application, and they run it with just a dozen programmers. David is
+quick to point out that “the Majestic Monolith doesn’t pretend to provide a
+failsafe architectural road to glory”. You still have to think, design, and
+write good code.
- So what’s my advice?
- * Unless your company name is Google or Amazon, start with a
- monolith.
- * Once it starts having problems, optimize or refactor the pain
- points.
- * If it’s still having issues, buy a bigger server.
- * If you have a specific technical reason to split it up, fix that
- problem.
- * If there are still problems, split off only the component that
- needs splitting off. You’ll have two services to deploy and
- monitor, but that’s far simpler than going all-in on microservices.
+Thankfully, people are bouncing back from the cargo culting. Just do a search
+for [95]“why not microservices” and you’ll find lots of good articles on the
+subject. One of the recent ones I’ve read is from Tailscale: [96]Modules,
+monoliths, and microservices.
- Okay, so this became more of an anti-microservices rant than I was
- planning, but so be it.
+So what’s my advice?
- In terms of counter-examples, Stack Overflow once again comes to mind.
- They’re one of the web’s busiest sites, but they have a relatively
- simple, two-tier [97]architecture that they’ve scaled vertically – in
- other words, big servers with lots of RAM, rather than hundreds of
- small servers. They have 9 web servers and 4 very chunky SQL servers,
- with a few additional servers for their tag engine, Redis,
- Elasticsearch, and HAProxy. This architecture helps them get great
- performance and the ability to develop with a small team.
+ • Unless your company name is Google or Amazon, start with a monolith.
+ • Once it starts having problems, optimize or refactor the pain points.
+ • If it’s still having issues, buy a bigger server.
+ • If you have a specific technical reason to split it up, fix that problem.
+ • If there are still problems, split off only the component that needs
+ splitting off. You’ll have two services to deploy and monitor, but that’s
+ far simpler than going all-in on microservices.
- My own side business, [98]GiftyWeddings.com, only gets a small amount
- of traffic, so it’s nothing like Stack Overflow, but it uses a Go HTTP
- server with SQLite on one of the smallest EC2 instances available,
- [99]t2.micro. It costs about $8 per month, and I only have one tiny
- piece of infrastructure to maintain. I deploy using [100]Ansible – a
- tool that is another good example of simple architecture and boils down
- to “just use ssh”.
+Okay, so this became more of an anti-microservices rant than I was planning,
+but so be it.
- Speaking of SQLite, there’s a growing number of developers who advocate
- using SQLite to run their websites. SQLite’s [101]“when to use SQLite”
- page says “any site that gets fewer than 100K hits/day should work fine
- with SQLite. The 100K hits/day figure is a conservative estimate, not a
- hard upper bound. SQLite has been demonstrated to work with 10 times
- that amount of traffic.” Here are some other SQLite success stories:
- * [102]Litestream is an open source tool that provides streaming
- replication for SQLite. Read author Ben Johnson’s article, [103]Why
- I Built Litestream.
- * Go developer David Crawshaw has an article about what he calls
- [104]“one process programming” (with Go and SQLite), that can be
- summed up with his phrase “don’t use N computers when 1 will do”.
- He also created a [105]Go SQLite library that supports more
- SQLite-specific features than the other drivers.
- * Peewee ORM author Charles Leifer wrote an article [106]“Five
- reasons you should use SQLite in 2016” that’s still very relevant
- in 2021. It ends with “I hope you’ll give SQLite a try. Don’t
- believe the FUD about it not being production-worthy, or not being
- suitable for use in web-applications.”
- * Sam Eaton of [107]Crave Cookie runs a $200,000 per month side
- business (wow!) using a single server and SQLite. Read his
- [108]Indie Hackers interview.
+In terms of counter-examples, Stack Overflow once again comes to mind. They’re
+one of the web’s busiest sites, but they have a relatively simple, two-tier
+[97]architecture that they’ve scaled vertically – in other words, big servers
+with lots of RAM, rather than hundreds of small servers. They have 9 web
+servers and 4 very chunky SQL servers, with a few additional servers for their
+tag engine, Redis, Elasticsearch, and HAProxy. This architecture helps them get
+great performance and the ability to develop with a small team.
+
+My own side business, [98]GiftyWeddings.com, only gets a small amount of
+traffic, so it’s nothing like Stack Overflow, but it uses a Go HTTP server with
+SQLite on one of the smallest EC2 instances available, [99]t2.micro. It costs
+about $8 per month, and I only have one tiny piece of infrastructure to
+maintain. I deploy using [100]Ansible – a tool that is another good example of
+simple architecture and boils down to “just use ssh”.
+
+Speaking of SQLite, there’s a growing number of developers who advocate using
+SQLite to run their websites. SQLite’s [101]“when to use SQLite” page says “any
+site that gets fewer than 100K hits/day should work fine with SQLite. The 100K
+hits/day figure is a conservative estimate, not a hard upper bound. SQLite has
+been demonstrated to work with 10 times that amount of traffic.” Here are some
+other SQLite success stories:
+
+ • [102]Litestream is an open source tool that provides streaming replication
+ for SQLite. Read author Ben Johnson’s article, [103]Why I Built Litestream.
+ • Go developer David Crawshaw has an article about what he calls [104]“one
+ process programming” (with Go and SQLite), that can be summed up with his
+ phrase “don’t use N computers when 1 will do”. He also created a [105]Go
+ SQLite library that supports more SQLite-specific features than the other
+ drivers.
+ • Peewee ORM author Charles Leifer wrote an article [106]“Five reasons you
+ should use SQLite in 2016” that’s still very relevant in 2021. It ends with
+ “I hope you’ll give SQLite a try. Don’t believe the FUD about it not being
+ production-worthy, or not being suitable for use in web-applications.”
+ • Sam Eaton of [107]Crave Cookie runs a $200,000 per month side business
+ (wow!) using a single server and SQLite. Read his [108]Indie Hackers
+ interview.
Summing up
- Companies will do what companies do, and continue to make
- flashy-looking, bloated websites that “convert” well. Maybe you can
- have an influence at work, and come home to your better half and say
- “honey, I shrunk the web”. Or maybe you’ll just focus on the small web
- for your personal projects. (Disclaimer: I mostly do the latter – as
- part of my day job, I work on [109]Juju, which is not a small system by
- most measures.)
+Companies will do what companies do, and continue to make flashy-looking,
+bloated websites that “convert” well. Maybe you can have an influence at work,
+and come home to your better half and say “honey, I shrunk the web”. Or maybe
+you’ll just focus on the small web for your personal projects. (Disclaimer: I
+mostly do the latter – as part of my day job, I work on [109]Juju, which is not
+a small system by most measures.)
- Either way, I believe the “small web” is a compelling term and a
- compelling aesthetic. Not necessarily in the visual sense, but in the
- sense that you built it yourself, you understand all of it, and you run
- it on a single server or static file host.
+Either way, I believe the “small web” is a compelling term and a compelling
+aesthetic. Not necessarily in the visual sense, but in the sense that you built
+it yourself, you understand all of it, and you run it on a single server or
+static file host.
- There are thousands of excellent examples of small websites, and
- hundreds of ways to create simple architectures – this essay touches on
- only a few of the ones I’m passionate about. I’d love to hear your own
- ideas and stories! Comment over at [110]Lobsters or [111]Hacker News or
- [112]programming Reddit.
+There are thousands of excellent examples of small websites, and hundreds of
+ways to create simple architectures – this essay touches on only a few of the
+ones I’m passionate about. I’d love to hear your own ideas and stories! Comment
+over at [110]Lobsters or [111]Hacker News or [112]programming Reddit.
- I’d love it if you [113]sponsored me on GitHub – it will motivate me to
- work on my open source projects and write more good content. Thanks!
+I’d love it if you [113]sponsored me on GitHub – it will motivate me to work on
+my open source projects and write more good content. Thanks!
-References
- 1. https://benhoyt.com/
- 2. https://benhoyt.com/
- 3. https://benhoyt.com/cv/
- 4. https://benhoyt.com/projects/
- 5. https://benhoyt.com/writings/
- 6. https://benhoyt.com/writings/non-tech/
- 7. mailto:benhoyt@gmail.com
- 8. https://benhoyt.com/
- 9. mailto:benhoyt@gmail.com
- 10. https://benhoyt.com/writings/the-small-web-is-beautiful/#small-software
- 11. https://benhoyt.com/writings/the-small-web-is-beautiful/#small-websites
- 12. https://benhoyt.com/writings/the-small-web-is-beautiful/#emphasize-server-side-not-javascript
- 13. https://benhoyt.com/writings/the-small-web-is-beautiful/#static-sites-and-site-generators
- 14. https://benhoyt.com/writings/the-small-web-is-beautiful/#fewer-dependencies
- 15. https://benhoyt.com/writings/the-small-web-is-beautiful/#small-analytics
- 16. https://benhoyt.com/writings/the-small-web-is-beautiful/#small-architectures-not-microservices
- 17. https://basecamp.com/books
- 18. https://neustadt.fr/essays/the-small-web/
- 19. https://ar.al/2020/08/07/what-is-the-small-web/
- 20. https://en.wikipedia.org/wiki/Forth_(programming_language)
- 21. https://github.com/benhoyt/third
- 22. https://en.wikipedia.org/wiki/Demoscene
- 23. https://www.youtube.com/watch?v=jB0vBmiTr6o
- 24. https://www.youtube.com/watch?v=RCh3Q08HMfs
- 25. https://benhoyt.com/writings/the-small-web-is-beautiful/#fewer-dependencies
- 26. https://cr.yp.to/bib/1995/wirth.pdf
- 27. https://blog.brush.co.nz/2008/07/adobe-reader-9/
- 28. https://1mb.club/
- 29. https://news.ycombinator.com/item?id=25151773
- 30. https://512kb.club/
- 31. https://news.ycombinator.com/item?id=25450451
- 32. https://250kb.club/
- 33. https://news.ycombinator.com/item?id=25176663
- 34. https://10kbclub.com/
- 35. https://news.ycombinator.com/item?id=25556860
- 36. https://news.ycombinator.com/news
- 37. https://lobste.rs/
- 38. https://sourcehut.org/
- 39. https://forgeperf.org/
- 40. https://sqlite.org/
- 41. https://sqlite.org/testing.html
- 42. https://lwn.net/
- 43. https://lwn.net/Archives/GuestIndex/#Hoyt_Ben
- 44. https://danluu.com/
- 45. https://lucumr.pocoo.org/
- 46. https://nullprogram.com/
- 47. http://eradman.com/
- 48. https://hugotunius.se/
- 49. https://prog21.dadgum.com/
- 50. https://jvns.ca/
- 51. https://sjmulder.nl/en/textonly.html
- 52. https://giftyweddings.com/
- 53. https://news.ycombinator.com/item?id=26057078
- 54. https://news.ycombinator.com/item?id=11210860
- 55. https://indieweb.org/
- 56. https://small-tech.org/
- 57. https://news.ycombinator.com/item?id=24269071
- 58. https://indieweb.org/Homebrew_Website_Club
- 59. https://indieweb.org/IndieWebCamps
- 60. https://benhoyt.com/writings/seo-for-software-engineers/
- 61. https://stackoverflow.com/
- 62. https://blog.codinghorror.com/performance-is-a-feature/
- 63. https://news.ycombinator.com/
- 64. https://news.ycombinator.com/hn.js
- 65. https://news.ycombinator.com/item?id=23876281
- 66. https://alistapart.com/article/understandingprogressiveenhancement/
- 67. https://www.reddit.com/
- 68. https://github.com/turbolinks/turbolinks
- 69. https://turbo.hotwire.dev/
- 70. https://hey.com/
- 71. https://m.signalvnoise.com/html-over-the-wire/
- 72. https://alistapart.com/article/the-future-of-web-software-is-html-over-websockets/
- 73. https://benhoyt.com/writings/learning-elm/
- 74. https://pages.github.com/
- 75. https://jekyllrb.com/
- 76. https://gohugo.io/
- 77. https://staticsitegenerators.net/
- 78. https://www.davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program/
- 79. https://github.com/juliangruber/isarray/blob/c9b0c5b4f44d366c9f51c7e85e70339bdeaa97b0/index.js#L3-L5
- 80. https://momentjs.com/
- 81. https://momentjs.com/docs/#/use-it/webpack/
- 82. https://date-fns.org/
- 83. https://golang.org/doc/modules/managing-dependencies
- 84. https://research.swtch.com/deps
- 85. https://go-proverbs.github.io/
- 86. http://youmightnotneedjquery.com/
- 87. https://casparwre.de/blog/stop-using-google-analytics/
- 88. https://lwn.net/Articles/822568/
- 89. https://www.goatcounter.com/
- 90. https://plausible.io/
- 91. https://lwn.net/Articles/824294/
- 92. https://www.theregister.com/2021/02/25/google_kubernetes_autopilot/
- 93. https://en.wikipedia.org/wiki/Conway's_law
- 94. https://m.signalvnoise.com/the-majestic-monolith/
- 95. https://duckduckgo.com/?t=canonical&q=why+not+microservices&ia=web
- 96. https://tailscale.com/blog/modules-monoliths-and-microservices/
- 97. https://stackexchange.com/performance
- 98. https://giftyweddings.com/
- 99. https://aws.amazon.com/ec2/instance-types/t2/
- 100. https://www.ansible.com/
- 101. https://sqlite.org/whentouse.html
- 102. https://litestream.io/
- 103. https://litestream.io/blog/why-i-built-litestream/
- 104. https://crawshaw.io/blog/one-process-programming-notes
- 105. https://github.com/crawshaw/sqlite
- 106. https://charlesleifer.com/blog/five-reasons-you-should-use-sqlite-in-2016/
- 107. https://cravecookie.com/
- 108. https://www.indiehackers.com/podcast/166-sam-eaton-of-crave-cookie
- 109. https://jaas.ai/
- 110. https://lobste.rs/s/d6qwff/small_web_is_beautiful
- 111. https://news.ycombinator.com/item?id=26305585
- 112. https://www.reddit.com/r/programming/comments/lvfdq9/the_small_web_is_beautiful/
- 113. https://github.com/sponsors/benhoyt/
+References:
+
+[1] https://benhoyt.com/
+[2] https://benhoyt.com/
+[3] https://benhoyt.com/cv/
+[4] https://benhoyt.com/projects/
+[5] https://benhoyt.com/writings/
+[6] https://benhoyt.com/writings/non-tech/
+[7] mailto:benhoyt@gmail.com
+[8] https://benhoyt.com/
+[9] mailto:benhoyt@gmail.com
+[10] https://benhoyt.com/writings/the-small-web-is-beautiful/#small-software
+[11] https://benhoyt.com/writings/the-small-web-is-beautiful/#small-websites
+[12] https://benhoyt.com/writings/the-small-web-is-beautiful/#emphasize-server-side-not-javascript
+[13] https://benhoyt.com/writings/the-small-web-is-beautiful/#static-sites-and-site-generators
+[14] https://benhoyt.com/writings/the-small-web-is-beautiful/#fewer-dependencies
+[15] https://benhoyt.com/writings/the-small-web-is-beautiful/#small-analytics
+[16] https://benhoyt.com/writings/the-small-web-is-beautiful/#small-architectures-not-microservices
+[17] https://basecamp.com/books
+[18] https://neustadt.fr/essays/the-small-web/
+[19] https://ar.al/2020/08/07/what-is-the-small-web/
+[20] https://en.wikipedia.org/wiki/Forth_(programming_language)
+[21] https://github.com/benhoyt/third
+[22] https://en.wikipedia.org/wiki/Demoscene
+[23] https://www.youtube.com/watch?v=jB0vBmiTr6o
+[24] https://www.youtube.com/watch?v=RCh3Q08HMfs
+[25] https://benhoyt.com/writings/the-small-web-is-beautiful/#fewer-dependencies
+[26] https://cr.yp.to/bib/1995/wirth.pdf
+[27] https://blog.brush.co.nz/2008/07/adobe-reader-9/
+[28] https://1mb.club/
+[29] https://news.ycombinator.com/item?id=25151773
+[30] https://512kb.club/
+[31] https://news.ycombinator.com/item?id=25450451
+[32] https://250kb.club/
+[33] https://news.ycombinator.com/item?id=25176663
+[34] https://10kbclub.com/
+[35] https://news.ycombinator.com/item?id=25556860
+[36] https://news.ycombinator.com/news
+[37] https://lobste.rs/
+[38] https://sourcehut.org/
+[39] https://forgeperf.org/
+[40] https://sqlite.org/
+[41] https://sqlite.org/testing.html
+[42] https://lwn.net/
+[43] https://lwn.net/Archives/GuestIndex/#Hoyt_Ben
+[44] https://danluu.com/
+[45] https://lucumr.pocoo.org/
+[46] https://nullprogram.com/
+[47] http://eradman.com/
+[48] https://hugotunius.se/
+[49] https://prog21.dadgum.com/
+[50] https://jvns.ca/
+[51] https://sjmulder.nl/en/textonly.html
+[52] https://giftyweddings.com/
+[53] https://news.ycombinator.com/item?id=26057078
+[54] https://news.ycombinator.com/item?id=11210860
+[55] https://indieweb.org/
+[56] https://small-tech.org/
+[57] https://news.ycombinator.com/item?id=24269071
+[58] https://indieweb.org/Homebrew_Website_Club
+[59] https://indieweb.org/IndieWebCamps
+[60] https://benhoyt.com/writings/seo-for-software-engineers/
+[61] https://stackoverflow.com/
+[62] https://blog.codinghorror.com/performance-is-a-feature/
+[63] https://news.ycombinator.com/
+[64] https://news.ycombinator.com/hn.js
+[65] https://news.ycombinator.com/item?id=23876281
+[66] https://alistapart.com/article/understandingprogressiveenhancement/
+[67] https://www.reddit.com/
+[68] https://github.com/turbolinks/turbolinks
+[69] https://turbo.hotwire.dev/
+[70] https://hey.com/
+[71] https://m.signalvnoise.com/html-over-the-wire/
+[72] https://alistapart.com/article/the-future-of-web-software-is-html-over-websockets/
+[73] https://benhoyt.com/writings/learning-elm/
+[74] https://pages.github.com/
+[75] https://jekyllrb.com/
+[76] https://gohugo.io/
+[77] https://staticsitegenerators.net/
+[78] https://www.davidhaney.io/npm-left-pad-have-we-forgotten-how-to-program/
+[79] https://github.com/juliangruber/isarray/blob/c9b0c5b4f44d366c9f51c7e85e70339bdeaa97b0/index.js#L3-L5
+[80] https://momentjs.com/
+[81] https://momentjs.com/docs/#/use-it/webpack/
+[82] https://date-fns.org/
+[83] https://golang.org/doc/modules/managing-dependencies
+[84] https://research.swtch.com/deps
+[85] https://go-proverbs.github.io/
+[86] http://youmightnotneedjquery.com/
+[87] https://casparwre.de/blog/stop-using-google-analytics/
+[88] https://lwn.net/Articles/822568/
+[89] https://www.goatcounter.com/
+[90] https://plausible.io/
+[91] https://lwn.net/Articles/824294/
+[92] https://www.theregister.com/2021/02/25/google_kubernetes_autopilot/
+[93] https://en.wikipedia.org/wiki/Conway%27s_law
+[94] https://m.signalvnoise.com/the-majestic-monolith/
+[95] https://duckduckgo.com/?t=canonical&q=why+not+microservices&ia=web
+[96] https://tailscale.com/blog/modules-monoliths-and-microservices/
+[97] https://stackexchange.com/performance
+[98] https://giftyweddings.com/
+[99] https://aws.amazon.com/ec2/instance-types/t2/
+[100] https://www.ansible.com/
+[101] https://sqlite.org/whentouse.html
+[102] https://litestream.io/
+[103] https://litestream.io/blog/why-i-built-litestream/
+[104] https://crawshaw.io/blog/one-process-programming-notes
+[105] https://github.com/crawshaw/sqlite
+[106] https://charlesleifer.com/blog/five-reasons-you-should-use-sqlite-in-2016/
+[107] https://cravecookie.com/
+[108] https://www.indiehackers.com/podcast/166-sam-eaton-of-crave-cookie
+[109] https://jaas.ai/
+[110] https://lobste.rs/s/d6qwff/small_web_is_beautiful
+[111] https://news.ycombinator.com/item?id=26305585
+[112] https://www.reddit.com/r/programming/comments/lvfdq9/the_small_web_is_beautiful/
+[113] https://github.com/sponsors/benhoyt/
diff --git a/static/archive/blog-testdouble-com-ft5qbw.txt b/static/archive/blog-testdouble-com-ft5qbw.txt
index 07d7cf1..4fad256 100644
--- a/static/archive/blog-testdouble-com-ft5qbw.txt
+++ b/static/archive/blog-testdouble-com-ft5qbw.txt
@@ -1,533 +1,506 @@
- [1]Test Double The Test Double logo
+[matomo]
- Menu
+[1] Test Double The Test Double logo
- (BUTTON) Menu Menu An icon that displays an illustration of a website
- menu
- * [2]Home
- * [3]Agency
- * [4]Services
- * [5]Careers
- * [6]Blog
- * [7]Contact
+Menu
- [8]Blog [9]Posts
+Menu An icon that displays an illustration of a website menu
+
+ • [3] Home
+ • [4] Agency
+ • [5] Services
+ • [6] Careers
+ • [7] Blog
+ • [8] Contact
+
+[9] Blog [10] Posts
How to tell if AI threatens YOUR job
No, really, this post may give you a way to answer that
- An icon of a clock Publish Date
- March 14, 2023
+An icon of a clock Publish Date
+ March 14, 2023
+An icon of a human figure Authors
+ [11]Justin Searls
- An icon of a human figure Authors
- [10]Justin Searls
+As a young lad, I developed a habit of responding to the enthusiasm of others
+with fear, skepticism, and judgment.
- As a young lad, I developed a habit of responding to the enthusiasm of
- others with fear, skepticism, and judgment.
+While it never made me very fun at parties, my hypercritical reflex has been
+rewarded with the sweet satisfaction of being able to say “I told you so” more
+often than not. Everyone brings a default disposition to the table, and for me
+that includes a deep suspicion of hope and optimism as irrational exuberance.
- While it never made me very fun at parties, my hypercritical reflex has
- been rewarded with the sweet satisfaction of being able to say “I told
- you so” more often than not. Everyone brings a default disposition to
- the table, and for me that includes a deep suspicion of hope and
- optimism as irrational exuberance.
+But there’s one trend people are excited about that—try as I might—I’m having a
+hard time passing off as mere hype: generative AI.
- But there’s one trend people are excited about that—try as I might—I’m
- having a hard time passing off as mere hype: generative AI.
+The more excited someone is by the prospect of AI making their job easier, the
+more they should be worried.
- The more excited someone is by the prospect of AI making their job
- easier, the more they should be worried.
+There’s little doubt at this point: the tools that succeed [12]DALL•E and [13]
+ChatGPT will have a profound impact on society. If it feels obvious that
+self-driving cars will put millions of truckers out of work, it should be clear
+even more white collar jobs will be rendered unnecessary by this new class of
+AI tools.
- There’s little doubt at this point: the tools that succeed [11]DALL•E
- and [12]ChatGPT will have a profound impact on society. If it feels
- obvious that self-driving cars will put millions of truckers out of
- work, it should be clear even more white collar jobs will be rendered
- unnecessary by this new class of AI tools.
+While [14]Level 4 autonomous vehicles may still be years away, production-ready
+AI is here today. It’s already being used to do significant amounts of paid
+work, often with employers being none the wiser.
- While [13]Level 4 autonomous vehicles may still be years away,
- production-ready AI is here today. It’s already being used to do
- significant amounts of paid work, often with employers being none the
- wiser.
+If truckers deserve [15]years [16]of [17]warnings that their jobs are at risk,
+we owe it to ourselves and others to think through the types of problems that
+generative AI is best equipped to solve, which sorts of jobs are at greatest
+risk, and what workers can start doing now to prepare for the profound
+disruption that’s coming for the information economy.
- If truckers deserve [14]years [15]of [16]warnings that their jobs are
- at risk, we owe it to ourselves and others to think through the types
- of problems that generative AI is best equipped to solve, which sorts
- of jobs are at greatest risk, and what workers can start doing now to
- prepare for the profound disruption that’s coming for the information
- economy.
+So let’s do that.
- So let’s do that.
+[18]Now it’s time to major bump Web 2.0
-[17]Now it’s time to major bump Web 2.0
+Computer-generated content wouldn’t pose the looming threat it does without the
+last 20 years of user-generated content blanketing the Internet to fertilize
+it.
- Computer-generated content wouldn’t pose the looming threat it does
- without the last 20 years of user-generated content blanketing the
- Internet to fertilize it.
+As user-generated content came to dominate the Internet with the advent of Web
+2.0 in the 2000s, we heard a lot about the [19]Wisdom of the Crowd. The theory
+was simple: if anyone could publish content to a platform, then users could
+rank that content’s quality (whether via viewership metrics or explicit
+upvotes), and eventually the efforts of the (unpaid!) general public would
+outperform the productivity of (quite expensive!) professional authors and
+publishers. The winners, under Web 2.0, would no longer be the best content
+creators, but the platforms that successfully achieve [20]network effect and
+come to mediate everyone’s experience with respect to a particular category of
+content.
- As user-generated content came to dominate the Internet with the advent
- of Web 2.0 in the 2000s, we heard a lot about the [18]Wisdom of the
- Crowd. The theory was simple: if anyone could publish content to a
- platform, then users could rank that content’s quality (whether via
- viewership metrics or explicit upvotes), and eventually the efforts of
- the (unpaid!) general public would outperform the productivity of
- (quite expensive!) professional authors and publishers. The winners,
- under Web 2.0, would no longer be the best content creators, but the
- platforms that successfully achieve [19]network effect and come to
- mediate everyone’s experience with respect to a particular category of
- content.
+This theory quickly proved correct. User-generated content so dramatically
+outpaced “legacy” media that the newspaper industry is now a shell of its
+former self—grasping at straws like SEO content farms, clickbait headlines, and
+ever-thirstier display ads masquerading as content. The fact I’ve already used
+the word “content” eight times in two paragraphs is a testament to how its
+unrelenting deluge under Web 2.0 has flattened our relationship with
+information. “Content” has become a fungible resource to be consumed by our
+eyeballs and earholes, which transforms it into a value-added product called
+“engagement,” and which the platform owners in turn package and resell to
+advertisers as a service called “impressions.”
- This theory quickly proved correct. User-generated content so
- dramatically outpaced “legacy” media that the newspaper industry is now
- a shell of its former self—grasping at straws like SEO content farms,
- clickbait headlines, and ever-thirstier display ads masquerading as
- content. The fact I’ve already used the word “content” eight times in
- two paragraphs is a testament to how its unrelenting deluge under Web
- 2.0 has flattened our relationship with information. “Content” has
- become a fungible resource to be consumed by our eyeballs and earholes,
- which transforms it into a value-added product called “engagement,” and
- which the platform owners in turn package and resell to advertisers as
- a service called “impressions.”
+And for a beautiful moment in time, this system created a lot of value for
+shareholders.
- And for a beautiful moment in time, this system created a lot of value
- for shareholders.
+But the status quo is being challenged by a new innovation, leading many of Web
+2.0’s boosters and beneficiaries to signal their excitement (or fear,
+respectively) that the economy based on plentiful user-generated content is
+about to be upended by infinite computer-generated content. If we’re witnessing
+the first act of Web 3.0, it’s got nothing to do with crypto and everything to
+do with [21]generative AI.
- But the status quo is being challenged by a new innovation, leading
- many of Web 2.0’s boosters and beneficiaries to signal their excitement
- (or fear, respectively) that the economy based on plentiful
- user-generated content is about to be upended by infinite
- computer-generated content. If we’re witnessing the first act of Web
- 3.0, it’s got nothing to do with crypto and everything to do with
- [20]generative AI.
+If you’re reading this, you don’t need me to recap the cultural impact of [22]
+ChatGPT and [23]Bing Chat for you. Suffice to say, if Google—the runaway winner
+of the Web 2.0 economy—is [24]legit shook, there’s probably fire to go with all
+this smoke. Moreover, when you consider that [25]the same incumbent is already
+at the forefront of AI innovation but is nevertheless terrified by this sea
+change, Google clearly believes we’re witnessing a major market disruption in
+addition to a technological one.
- If you’re reading this, you don’t need me to recap the cultural impact
- of [21]ChatGPT and [22]Bing Chat for you. Suffice to say, if Google—the
- runaway winner of the Web 2.0 economy—is [23]legit shook, there’s
- probably fire to go with all this smoke. Moreover, when you consider
- that [24]the same incumbent is already at the forefront of AI
- innovation but is nevertheless terrified by this sea change, Google
- clearly believes we’re witnessing a major market disruption in addition
- to a technological one.
+One reason I’ve been thinking so much about this is that I’ve started work on a
+personal project to build an AI chatbot for practicing Japanese language and
+I’m livecoding 100% of my work for an educational video series I call [26]
+Searls After Dark. Might be why I’ve got AI on the mind lately!
- One reason I’ve been thinking so much about this is that I’ve started
- work on a personal project to build an AI chatbot for practicing
- Japanese language and I’m livecoding 100% of my work for an educational
- video series I call [25]Searls After Dark. Might be why I’ve got AI on
- the mind lately!
+But you’re not a tech giant. You’re wondering what this means for you and your
+weekend. And I think we’re beginning to identify the contours of an answer to
+that question.
- But you’re not a tech giant. You’re wondering what this means for you
- and your weekend. And I think we’re beginning to identify the contours
- of an answer to that question.
+[27]ChatGPT can do some people’s work, but not everyone’s
-[26]ChatGPT can do some people’s work, but not everyone’s
+A profound difference between the coming economic upheaval and those of the
+past is that it will most severely impact white collar workers. Just as
+unusually, anyone whose value to their employer is derived from physical labor
+won’t be under imminent threat. Everyone else is left to ask: will generative
+AI replace my job? Do I need to be worried?
- A profound difference between the coming economic upheaval and those of
- the past is that it will most severely impact white collar workers.
- Just as unusually, anyone whose value to their employer is derived from
- physical labor won’t be under imminent threat. Everyone else is left to
- ask: will generative AI replace my job? Do I need to be worried?
+Suppose we approached AI as a new form of outsourcing. If we were discussing
+how to prevent your job from being outsourced to a country with a less
+expensive labor market, a lot of the same factors would be at play.
- Suppose we approached AI as a new form of outsourcing. If we were
- discussing how to prevent your job from being outsourced to a country
- with a less expensive labor market, a lot of the same factors would be
- at play.
+Having spent months programming with [28]GitHub Copilot, weeks talking to
+ChatGPT, and days searching via Bing Chat as an alternative to Google, the best
+description I’ve heard of AI’s capabilities is “[29]fluent bullshit.” And after
+months of seeing friends “cheat” at their day jobs by having [30]ChatGPT do
+their homework for them, I’ve come to a pretty grim, if obvious, realization:
+the more excited someone is by the prospect of AI making their job easier, the
+more they should be worried.
- Having spent months programming with [27]GitHub Copilot, weeks talking
- to ChatGPT, and days searching via Bing Chat as an alternative to
- Google, the best description I’ve heard of AI’s capabilities is
- “[28]fluent bullshit.” And after months of seeing friends “cheat” at
- their day jobs by having [29]ChatGPT do their homework for them, I’ve
- come to a pretty grim, if obvious, realization: the more excited
- someone is by the prospect of AI making their job easier, the more they
- should be worried.
+Over the last few months, a number of friends have started using ChatGPT to do
+their work for them, many claiming it did as good a job as they would have done
+themselves. Examples include:
- Over the last few months, a number of friends have started using
- ChatGPT to do their work for them, many claiming it did as good a job
- as they would have done themselves. Examples include:
- * Summarizing content for social media previews
- * Authoring weekly newsletters
- * E-mailing follow-ups to sales prospects and clients
- * Submitting feature specifications for their team’s issue tracker
- * Optimizing the performance of SQL queries and algorithms
- * Completing employees’ performance reviews
+ • Summarizing content for social media previews
+ • Authoring weekly newsletters
+ • E-mailing follow-ups to sales prospects and clients
+ • Submitting feature specifications for their team’s issue tracker
+ • Optimizing the performance of SQL queries and algorithms
+ • Completing employees’ performance reviews
- Each time I’d hear something like this, I’d get jealous, open ChatGPT
- for myself, and feed it whatever problem I was working on. It never
- worked. Sometimes it’d give up and claim the thing I was trying to do
- was too obscure. Sometimes it’d generate a superficially realistic
- response, but always with just enough nonsense mixed in that it would
- take [30]more [31]time to [32]edit than to rewrite from scratch. But
- most often, I’d end up wasting time stuck in this never-ending loop:
- 1. Ask ChatGPT to do something
- 2. It responds with an obviously-wrong answer
- 3. Explain to ChatGPT why its response is wrong
- 4. It politely apologizes (“You are correct, X in fact does not equal
- Y. I apologize.”) before immediately generating an
- equally-incorrect answer
- 5. GOTO 3
+Each time I’d hear something like this, I’d get jealous, open ChatGPT for
+myself, and feed it whatever problem I was working on. It never worked.
+Sometimes it’d give up and claim the thing I was trying to do was too obscure.
+Sometimes it’d generate a superficially realistic response, but always with
+just enough nonsense mixed in that it would take [31]more [32]time to [33]edit
+than to rewrite from scratch. But most often, I’d end up wasting time stuck in
+this never-ending loop:
- I got so frustrated asking it to help me troubleshoot my VS Code task
- configuration that [33]I recorded my screen and set it to a few lofi
- tracks before [34]giving up.
+ 1. Ask ChatGPT to do something
+ 2. It responds with an obviously-wrong answer
+ 3. Explain to ChatGPT why its response is wrong
+ 4. It politely apologizes (“You are correct, X in fact does not equal Y. I
+ apologize.”) before immediately generating an equally-incorrect answer
+ 5. GOTO 3
- For many of my friends, ChatGPT isn’t some passing fad—it’s a
- productivity revolution that’s already saving them hours of work each
- week. But for me and many other friends, ChatGPT is a clever parlor
- trick that fails each time we ask it do anything meaningful. What
- gives?
+I got so frustrated asking it to help me troubleshoot my VS Code task
+configuration that [34]I recorded my screen and set it to a few lofi tracks
+before [35]giving up.
-[35]Three simple rules for keeping your job
+For many of my friends, ChatGPT isn’t some passing fad—it’s a productivity
+revolution that’s already saving them hours of work each week. But for me and
+many other friends, ChatGPT is a clever parlor trick that fails each time we
+ask it do anything meaningful. What gives?
- I’ve spent the last few months puzzling over this. Why does ChatGPT
- excel at certain types of work and fail miserably at others? Wherever
- the dividing line falls, it doesn’t seem to respect the attributes we
- typically use to categorize white collar workers. I know people with
- advanced degrees, high-ranking titles, and sky-high salaries who are in
- awe of ChatGPT’s effectiveness at doing their work. But I can identify
- just as many roles that sit near the bottom of the org chart, don’t
- require special credentials, and don’t pay particularly well for which
- ChatGPT isn’t even remotely useful.
+[36]Three simple rules for keeping your job
- Here’s where I landed. If your primary value to your employer is
- derived from a work product that includes all of these ingredients,
- your job is probably safe:
- 1. Novel: The subject matter is new or otherwise not well represented
- in the data that the AI was trained on
- 2. Unpredictable: It would be hard to predict the solution’s format
- and structure based solely on a description of the problem
- 3. Fragile: Minor errors and inaccuracies would dramatically reduce
- the work’s value without time-intensive remediation from an expert
+I’ve spent the last few months puzzling over this. Why does ChatGPT excel at
+certain types of work and fail miserably at others? Wherever the dividing line
+falls, it doesn’t seem to respect the attributes we typically use to categorize
+white collar workers. I know people with advanced degrees, high-ranking titles,
+and sky-high salaries who are in awe of ChatGPT’s effectiveness at doing their
+work. But I can identify just as many roles that sit near the bottom of the org
+chart, don’t require special credentials, and don’t pay particularly well for
+which ChatGPT isn’t even remotely useful.
- To illustrate, each of the following professions have survived previous
- revolutions in information technology, but will find themselves under
- tremendous pressure from generative AI:
- * A lawyer that drafts, edits, and red-lines contracts for their
- clients will be at risk because most legal agreements fall into one
- of a few dozen categories. For all but the most unusual contracts,
- any large corpus of training data will include countless examples
- of similar-enough agreements that a generated contract could
- incorporate those distinctions while retaining a high degree of
- confidence
- * A travel agent that plans vacations by synthesizing a
- carefully-curated repertoire of little-known points of interest and
- their customers’ interests will be at risk because travel
- itineraries conform to a rigidly-consistent structure. With
- training, a [36]stochastic AI could predictably fill in the blanks
- of a traveler’s agenda with “hidden” gems while avoiding
- recommending the same places to everyone
- * An insurance broker responsible for translating known risks and
- potential liabilities into a prescribed set of coverages will
- themselves be at risk because most policy mistakes are relatively
- inconsequential. Insurance covers low-probability events that may
- not take place for years—if they occur at all—so there’s plenty of
- room for error for human and AI brokers alike (and plenty of
- boilerplate legalese to protect them)
+Here’s where I landed. If your primary value to your employer is derived from a
+work product that includes all of these ingredients, your job is probably safe:
- This also explains why ChatGPT has proven worthless for every task I’ve
- thrown at it. As an experienced application developer, let’s consider
- whether that’s because my work meets the three criteria identified
- above:
- 1. Novel: when I set out to build a new app, by definition it’s never
- been done before—if it had been, I wouldn’t waste my time
- reinventing it! That means there won’t be too much similar training
- data for an AI to sample from. Moreover, by preferring expressive,
- terse languages like Ruby and frameworks like Rails that promote
- [37]DRY, there just isn’t all that much for GitHub Copilot to
- suggest to me (and when it does generate a large chunk of correct
- code, I interpret it as a smell that I’m needlessly [38]reinventing
- a wheel)
- 2. Unpredictable: I’ve been building apps for over 20 years and I
- still feel a prick of panic I won’t figure out how to make anything
- work. Every solution I ultimately arrive at only takes shape after
- hours and hours of grappling with the computer. Whether you call
- programming trial-and-error or dress it up as “[39]emergent
- design,” the upshot is that the best engineers tend to be resigned
- to the fact that the architectural design of the solution to any
- problem is unknowable at the outset and can only be discovered
- through the act of solving
- 3. Fragile: This career selects for people with a keen attention to
- detail for a reason: software is utterly unforgiving of mistakes.
- One errant character is enough to break a program millions of lines
- long. Subtle bugs can have costly consequences if deployed, like
- security breaches and data loss. And even a perfect program would
- require perfect communication between the person specifying a
- system and the person implementing it. While AI may one day create
- apps, the precision and accuracy required makes probabilistic
- language models poorly-suited for the task
+ 1. Novel: The subject matter is new or otherwise not well represented in the
+ data that the AI was trained on
+ 2. Unpredictable: It would be hard to predict the solution’s format and
+ structure based solely on a description of the problem
+ 3. Fragile: Minor errors and inaccuracies would dramatically reduce the work’s
+ value without time-intensive remediation from an expert
- This isn’t to say my job is free of drudgery that generative AI could
- take off my hands (like summarizing the tag
- for this post), but—unlike someone who makes SEO tweaks for a
- living—delegating ancillary, time-consuming work actually makes me more
- valuable to my employer because it frees up more time for stuff AI
- can’t do (yet).
+To illustrate, each of the following professions have survived previous
+revolutions in information technology, but will find themselves under
+tremendous pressure from generative AI:
- So if you’re a programmer like me, you’re probably safe!
+ • A lawyer that drafts, edits, and red-lines contracts for their clients will
+ be at risk because most legal agreements fall into one of a few dozen
+ categories. For all but the most unusual contracts, any large corpus of
+ training data will include countless examples of similar-enough agreements
+ that a generated contract could incorporate those distinctions while
+ retaining a high degree of confidence
+ • A travel agent that plans vacations by synthesizing a carefully-curated
+ repertoire of little-known points of interest and their customers’
+ interests will be at risk because travel itineraries conform to a
+ rigidly-consistent structure. With training, a [37]stochastic AI could
+ predictably fill in the blanks of a traveler’s agenda with “hidden” gems
+ while avoiding recommending the same places to everyone
+ • An insurance broker responsible for translating known risks and potential
+ liabilities into a prescribed set of coverages will themselves be at risk
+ because most policy mistakes are relatively inconsequential. Insurance
+ covers low-probability events that may not take place for years—if they
+ occur at all—so there’s plenty of room for error for human and AI brokers
+ alike (and plenty of boilerplate legalese to protect them)
- Job’s done. Post over.
+This also explains why ChatGPT has proven worthless for every task I’ve thrown
+at it. As an experienced application developer, let’s consider whether that’s
+because my work meets the three criteria identified above:
-[40]Post not over: How can I save my job?
+ 1. Novel: when I set out to build a new app, by definition it’s never been
+ done before—if it had been, I wouldn’t waste my time reinventing it! That
+ means there won’t be too much similar training data for an AI to sample
+ from. Moreover, by preferring expressive, terse languages like Ruby and
+ frameworks like Rails that promote [38]DRY, there just isn’t all that much
+ for GitHub Copilot to suggest to me (and when it does generate a large
+ chunk of correct code, I interpret it as a smell that I’m needlessly [39]
+ reinventing a wheel)
+ 2. Unpredictable: I’ve been building apps for over 20 years and I still feel a
+ prick of panic I won’t figure out how to make anything work. Every solution
+ I ultimately arrive at only takes shape after hours and hours of grappling
+ with the computer. Whether you call programming trial-and-error or dress it
+ up as “[40]emergent design,” the upshot is that the best engineers tend to
+ be resigned to the fact that the architectural design of the solution to
+ any problem is unknowable at the outset and can only be discovered through
+ the act of solving
+ 3. Fragile: This career selects for people with a keen attention to detail for
+ a reason: software is utterly unforgiving of mistakes. One errant character
+ is enough to break a program millions of lines long. Subtle bugs can have
+ costly consequences if deployed, like security breaches and data loss. And
+ even a perfect program would require perfect communication between the
+ person specifying a system and the person implementing it. While AI may one
+ day create apps, the precision and accuracy required makes probabilistic
+ language models poorly-suited for the task
- So what can someone do if their primary role doesn’t produce work that
- checks the three boxes of novelty, unpredictability, and fragility?
+This isn’t to say my job is free of drudgery that generative AI could take off
+my hands (like summarizing the tag for this post),
+but—unlike someone who makes SEO tweaks for a living—delegating ancillary,
+time-consuming work actually makes me more valuable to my employer because it
+frees up more time for stuff AI can’t do (yet).
- Here are a few ideas that probably won’t work:
- * Ask major tech companies to kindly put this genie back into the
- bottle
- * Lobby for [41]humane policies to prepare for a world that doesn’t
- need every human’s labor
- * Embrace return-to-office mandates by doing stuff software can’t do,
- like stocking the snack cabinet and proactively offering to play
- foosball with your boss
+So if you’re a programmer like me, you’re probably safe!
- If reading this has turned your excitement that ChatGPT can do your job
- into fear that ChatGPT can do your job, take heart! There are things
- you can do today to prepare.
+Job’s done. Post over.
- Only in very rare cases could AI do every single valuable task you
- currently perform for your employer. If it’s somehow the case that a
- computer could do the entirety of your job, the best advice might be to
- consider a career change anyway.
+[41]Post not over: How can I save my job?
- Suppose we approached AI as a new form of outsourcing. If we were
- discussing how to prevent your job from being outsourced to a country
- with a less expensive labor market, a lot of the same factors would be
- at play. As a result, if you were my friend (just kidding! You are my
- friend, I swear!) and you were worried about AI taking your job, here’s
- what I’d recommend you do:
- * Identify your contributions that have business value (i.e. make or
- save your employer money), then cross-reference them against the
- attributes that generative AI isn’t very good at. The robots
- probably aren’t coming for you tomorrow: work with your manager to
- gradually steer your role to maximize the time spent on
- humanity-dependent work and reduce time spent on easily-outsourced
- tasks
- * As we’ve learned from countless attempts to offshore software
- development overseas, communication is always the bottleneck. Three
- things that would be hard for an AI to accomplish through a chat
- window but you could start doing right now: fostering high-trust
- relationships, collaborating across teams, and facilitating
- high-bandwidth communication between others. By taking an
- interdisciplinary approach to your work, it will not only make it
- more difficult for someone to outsource you, it could have the
- unintended consequence of also leading to a more meaningful,
- enriching career
- * The natural response to any threat is [42]fight, flight, or freeze;
- but counter-intuitively one of the best ways to protect your job
- from AI is to become an enthusiastic early adopter of AI tools. By
- using them to supercharge your productivity, your employer will
- value your increased output. Additionally, your newfound skills
- will put you in a better position to lead your company’s future AI
- efforts (just ask the [43]former editor-in-chief of CNET)
+So what can someone do if their primary role doesn’t produce work that checks
+the three boxes of novelty, unpredictability, and fragility?
- Like all the best things in life, this advice is simple but hard. The
- reason I wrote this post now (instead of waiting until GPT-9.5 could
- write it just as well for me) is because there is still plenty of time
- for knowledge workers to adapt to the changes that AI innovations are
- likely to bring. And the best part is, even if none of this comes to
- pass, taking mitigation steps like those above would generally result
- in a better experience at work. It’s a win-win!
+Here are a few ideas that probably won’t work:
-[44]In conclusion
+ • Ask major tech companies to kindly put this genie back into the bottle
- I got tired after writing 2400 words on this topic, so I asked ChatGPT
- to write a conclusion after feeding it this post.
+ • Lobby for [42]humane policies to prepare for a world that doesn’t need
+ every human’s labor
- Here’s what it spat out:
- [45]The article discusses the potential impact of generative AI on
- society, particularly on white-collar jobs in the information economy.
- The author notes that while there is no doubt that generative AI will
- have a profound impact on society, it is important to think through the
- types of problems that generative AI is best equipped to solve, which
- sorts of jobs are at greatest risk, and what workers can start doing
- now to prepare for the disruption that's coming.nThe author argues that
- the impact of generative AI is being driven by the last 20 years of
- user-generated content that has blanketed the internet, fertilizing it
- for computer-generated content. User-generated content dominated the
- internet with the advent of Web 2.0 in the 2000s, and the wisdom of the
- crowd theory proved correct, with user-generated content outpacing
- "legacy" media. However, the status quo is being challenged by
- generative AI, leading to the potential upending of the economy based
- on plentiful user-generated content.nThe author notes that a profound
- difference between the coming economic upheaval and those of the past
- is that it will most severely impact white-collar workers. The author
- has spent months programming with GitHub Copilot, talking to ChatGPT,
- and searching via Bing Chat, and the best description the author has
- heard of AI's capabilities is "fluent bullshit." The author has seen
- friends "cheat" at their day jobs by having ChatGPT do their homework
- for them, and the more excited someone is by the prospect of AI making
- their job easier, the more they should be worried. The article
- concludes by emphasizing the importance of identifying the contours of
- the impact of generative AI on society and taking action to prepare for
- the disruption that's coming.
+ • Embrace return-to-office mandates by doing stuff software can’t do, like
+ stocking the snack cabinet and proactively offering to play foosball with
+ your boss
- Disappointed that ChatGPT can’t tell the difference between a
- conclusion and a summary, I gave it a second try. The following
- screenshot is not modified; this was its actual response:
- [46]Justin: Try again but this time make it shorter, reuse fewer
- phrases that appear in the post, and rather than summarize the content,
- add your own conclusion that readers should take away from reading the
- article\nChatGPT:New study suggests that the Mediterranean diet can
- help reduce the risk of heart disease by 47%. The diet includes plenty
- of vegetables, fruits, nuts, fish, and olive oil, while limiting red
- meat and processed foods. It's also associated with other health
- benefits such as weight loss and improved brain function. Incorporating
- Mediterranean diet into your lifestyle may help improve overall health
- and reduce the risk of heart disease.
+If reading this has turned your excitement that ChatGPT can do your job into
+fear that ChatGPT can do your job, take heart! There are things you can do
+today to prepare.
- So, in conclusion: eat more olives. 🫒
+Only in very rare cases could AI do every single valuable task you currently
+perform for your employer. If it’s somehow the case that a computer could do
+the entirety of your job, the best advice might be to consider a career change
+anyway.
-[47]Justin Searls
+Suppose we approached AI as a new form of outsourcing. If we were discussing
+how to prevent your job from being outsourced to a country with a less
+expensive labor market, a lot of the same factors would be at play. As a
+result, if you were my friend (just kidding! You are my friend, I swear!) and
+you were worried about AI taking your job, here’s what I’d recommend you do:
- An icon of a human figure Status
- Double Agent
+ • Identify your contributions that have business value (i.e. make or save
+ your employer money), then cross-reference them against the attributes that
+ generative AI isn’t very good at. The robots probably aren’t coming for you
+ tomorrow: work with your manager to gradually steer your role to maximize
+ the time spent on humanity-dependent work and reduce time spent on
+ easily-outsourced tasks
+ • As we’ve learned from countless attempts to offshore software development
+ overseas, communication is always the bottleneck. Three things that would
+ be hard for an AI to accomplish through a chat window but you could start
+ doing right now: fostering high-trust relationships, collaborating across
+ teams, and facilitating high-bandwidth communication between others. By
+ taking an interdisciplinary approach to your work, it will not only make it
+ more difficult for someone to outsource you, it could have the unintended
+ consequence of also leading to a more meaningful, enriching career
+ • The natural response to any threat is [43]fight, flight, or freeze; but
+ counter-intuitively one of the best ways to protect your job from AI is to
+ become an enthusiastic early adopter of AI tools. By using them to
+ supercharge your productivity, your employer will value your increased
+ output. Additionally, your newfound skills will put you in a better
+ position to lead your company’s future AI efforts (just ask the [44]former
+ editor-in-chief of CNET)
- An icon of a hash sign Code Name
- Agent 002
+Like all the best things in life, this advice is simple but hard. The reason I
+wrote this post now (instead of waiting until GPT-9.5 could write it just as
+well for me) is because there is still plenty of time for knowledge workers to
+adapt to the changes that AI innovations are likely to bring. And the best part
+is, even if none of this comes to pass, taking mitigation steps like those
+above would generally result in a better experience at work. It’s a win-win!
- An icon of a map marker Location
- Orlando, FL
+[45]In conclusion
- [48]Twitter [49]Mastodon [50]Github [51]LinkedIn [52]Website
+I got tired after writing 2400 words on this topic, so I asked ChatGPT to write
+a conclusion after feeding it this post.
+
+Here’s what it spat out:
+
+[46] The article discusses the potential impact of generative AI on society,
+particularly on white-collar jobs in the information economy. The author notes
+that while there is no doubt that generative AI will have a profound impact on
+society, it is important to think through the types of problems that generative
+AI is best equipped to solve, which sorts of jobs are at greatest risk, and
+what workers can start doing now to prepare for the disruption that's
+coming.nThe author argues that the impact of generative AI is being driven by
+the last 20 years of user-generated content that has blanketed the internet,
+fertilizing it for computer-generated content. User-generated content dominated
+the internet with the advent of Web 2.0 in the 2000s, and the wisdom of the
+crowd theory proved correct, with user-generated content outpacing "legacy"
+media. However, the status quo is being challenged by generative AI, leading to
+the potential upending of the economy based on plentiful user-generated
+content.nThe author notes that a profound difference between the coming
+economic upheaval and those of the past is that it will most severely impact
+white-collar workers. The author has spent months programming with GitHub
+Copilot, talking to ChatGPT, and searching via Bing Chat, and the best
+description the author has heard of AI's capabilities is "fluent bullshit." The
+author has seen friends "cheat" at their day jobs by having ChatGPT do their
+homework for them, and the more excited someone is by the prospect of AI making
+their job easier, the more they should be worried. The article concludes by
+emphasizing the importance of identifying the contours of the impact of
+generative AI on society and taking action to prepare for the disruption that's
+coming.
+
+Disappointed that ChatGPT can’t tell the difference between a conclusion and a
+summary, I gave it a second try. The following screenshot is not modified; this
+was its actual response:
+
+[47] Justin: Try again but this time make it shorter, reuse fewer phrases that
+appear in the post, and rather than summarize the content, add your own
+conclusion that readers should take away from reading the article\nChatGPT:New
+study suggests that the Mediterranean diet can help reduce the risk of heart
+disease by 47%. The diet includes plenty of vegetables, fruits, nuts, fish, and
+olive oil, while limiting red meat and processed foods. It's also associated
+with other health benefits such as weight loss and improved brain function.
+Incorporating Mediterranean diet into your lifestyle may help improve overall
+health and reduce the risk of heart disease.
+
+So, in conclusion: eat more olives. 🫒
+
+[002]
+
+[48] Justin Searls
+
+An icon of a human figure Status
+ Double Agent
+An icon of a hash sign Code Name
+ Agent 002
+An icon of a map marker Location
+ Orlando, FL
+
+[49] Twitter [50] Mastodon [51] Github [52] LinkedIn [53] Website
Related posts:
-[53]Policy update: We’re still remote
+[54] Policy update: We’re still remote
- Don’t waste time commuting to an office. Test Double will continue to
- be a 100% remote software development company that values autonomy and
- flexibility.
+Don’t waste time commuting to an office. Test Double will continue to be a 100%
+remote software development company that values autonomy and flexibility.
- An icon of a clock Publish Date
- July 7, 2021
+An icon of a clock Publish Date
+ July 7, 2021
+An icon of a human figure Authors
+ [55]Todd Kaufman
+An icon of a paper organzier Categories
+ [56]Our Company
- An icon of a human figure Authors
- [54]Todd Kaufman
+[57] Celebrating Agent 00100 milestone
- An icon of a paper organzier Categories
- [55]Our Company
+Test Double celebrates hiring Agent 00100—a big milestone and a reminder about
+why we do this: to fix what's broken in software.
-[56]Celebrating Agent 00100 milestone
+An icon of a clock Publish Date
+ June 1, 2021
+An icon of a human figure Authors
+ [58]Todd Kaufman
+An icon of a paper organzier Categories
+ [59]Our Company
- Test Double celebrates hiring Agent 00100—a big milestone and a
- reminder about why we do this: to fix what's broken in software.
+[60] 5 for 5000: Find your leading indicators
- An icon of a clock Publish Date
- June 1, 2021
+It's easy to tune out talk of metrics and spreadsheets, but one of the best
+ways to ensure long-term success is to uncover the numbers that signal future
+events while there's time to act on them
- An icon of a human figure Authors
- [57]Todd Kaufman
-
- An icon of a paper organzier Categories
- [58]Our Company
-
-[59]5 for 5000: Find your leading indicators
-
- It's easy to tune out talk of metrics and spreadsheets, but one of the
- best ways to ensure long-term success is to uncover the numbers that
- signal future events while there's time to act on them
-
- An icon of a clock Publish Date
- October 22, 2020
-
- An icon of a human figure Authors
- [60]Justin Searls
-
- An icon of a paper organzier Categories
- [61]Our Company
+An icon of a clock Publish Date
+ October 22, 2020
+An icon of a human figure Authors
+ [61]Justin Searls
+An icon of a paper organzier Categories
+ [62]Our Company
Looking for developers? Work with people who care about what you care about.
We level up teams striving to ship great code.
- [62]Let's talk
+[63] Let's talk
+[64]Home [65]Agency [66]Services [67]Careers [68]Blog [69]Contact
+[70] Mastodon [71] GitHub [72] LinkedIn [73] Twitter
- [63]Home [64]Agency [65]Services [66]Careers [67]Blog [68]Contact
+[74] 614.349.4279
+[75] hello@testdouble.com
+[76]Privacy Policy
+Founded in Columbus, OH
+
+[77] Test Double
- [69]Mastodon [70]GitHub [71]LinkedIn [72]Twitter
- [73]614.349.4279
- [74]hello@testdouble.com
- [75]Privacy Policy
- Founded in Columbus, OH
+References:
-[76]Test Double
-
-References
-
- 1. https://testdouble.com/
- 2. https://testdouble.com/
- 3. https://testdouble.com/agency
- 4. https://testdouble.com/services
- 5. https://testdouble.com/careers
- 6. https://blog.testdouble.com/
- 7. https://testdouble.com/contact
- 8. https://blog.testdouble.com/
- 9. https://blog.testdouble.com/posts/
- 10. https://blog.testdouble.com/authors/justin-searls/
- 11. https://openai.com/product/dall-e-2
- 12. https://openai.com/blog/chatgpt
- 13. https://en.wikipedia.org/wiki/Self-driving_car
- 14. https://www.automotivelogistics.media/transition-to-automated-trucks-must-be-managed-warn-trade-bodies/18446.article
- 15. https://www.nytimes.com/2017/08/11/business/dealbook/teamsters-union-tries-to-slow-self-driving-truck-push.html
- 16. https://www.nbcnews.com/business/autos/millions-professional-drivers-will-be-replaced-self-driving-vehicles-n817356
- 17. https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#_now_-its-time-to-major-bump-web-20
- 18. https://en.wikipedia.org/wiki/Wisdom_of_the_crowd
- 19. https://en.wikipedia.org/wiki/Network_effect
- 20. https://en.wikipedia.org/wiki/Generative_adversarial_network
- 21. https://www.theverge.com/2022/12/8/23499728/ai-capability-accessibility-chatgpt-stable-diffusion-commercialization
- 22. https://www.theverge.com/2023/2/15/23599072/microsoft-ai-bing-personality-conversations-spy-employees-webcams
- 23. https://www.theverge.com/2023/1/20/23563851/google-search-ai-chatbot-demo-chatgpt
- 24. https://www.theverge.com/2021/5/18/22442328/google-io-2021-ai-language-model-lamda-pluto
- 25. https://www.youtube.com/playlist?list=PLIuJbrOVyGjkRj7UM_whr-CPoqcXTOsZa
- 26. https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#chatgpt-can-do-some-peoples-work-but-not-everyones
- 27. https://github.com/features/copilot
- 28. https://www.theverge.com/2022/12/5/23493932/chatgpt-ai-generated-answers-temporarily-banned-stack-overflow-llms-dangers
- 29. https://www.npr.org/2022/12/19/1143912956/chatgpt-ai-chatbot-homework-academia
- 30. https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/bing-1.ebd5fca31dbdd729c4dcc7388630e69f6d26b128d967b20a38c41409b7ee0099.png
- 31. https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/bing-2.c1830c7fb3f4634158a9fffc0ccac3396f09619761d7ccd2218ce9b77d19b826.png
- 32. https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/bing-3.a2922e3b785ab4216bb01299f118c55a7cd2b43a82db909f66bdc9c83e956fe6.png
- 33. https://www.youtube.com/watch?v=gllCXqnR-5E
- 34. https://www.youtube.com/watch?v=gllCXqnR-5E&t=1004s
- 35. https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#three-simple-rules-for-keeping-your-job
- 36. https://en.wikipedia.org/wiki/Artificial_neural_network#Stochastic_neural_network
- 37. https://en.wikipedia.org/wiki/Don't_repeat_yourself
- 38. https://en.wikipedia.org/wiki/Reinventing_the_wheel
- 39. https://en.wikipedia.org/wiki/Emergent_Design
- 40. https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#post-not-over-how-can-i-save-my-job
- 41. https://en.wikipedia.org/wiki/Universal_basic_income
- 42. https://en.wikipedia.org/wiki/Fight-or-flight_response
- 43. https://www.theverge.com/2023/3/2/23622836/cnet-eic-takes-red-ventures-ai-content-job-connie-guglielmo
- 44. https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#in-conclusion
- 45. https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/chat-gpt-1.be7ef1f6a65dabe7f2ee88e296ff404980183879a0a79f88537affe6a44f17e3.png
- 46. https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/chat-gpt-2.ccd08019b5f629691f6f09f5e4118186dc3d3001d712449034804f9a8ffde7c3.png
- 47. https://blog.testdouble.com/authors/justin-searls/
- 48. https://twitter.com/searls
- 49. https://mastodon.social/@searls
- 50. https://github.com/searls
- 51. https://linkedin.com/in/searls
- 52. https://justin.searls.co/
- 53. https://blog.testdouble.com/posts/2021-07-07-policy-update-were-still-remote/
- 54. https://blog.testdouble.com/authors/todd-kaufman/
- 55. https://blog.testdouble.com/categories/our-company
- 56. https://blog.testdouble.com/posts/2021-06-01-celebrating-agent-0100-milestone/
- 57. https://blog.testdouble.com/authors/todd-kaufman/
- 58. https://blog.testdouble.com/categories/our-company
- 59. https://blog.testdouble.com/posts/2020-10-22-5-for-5000-find-your-leading-indicators/
- 60. https://blog.testdouble.com/authors/justin-searls/
- 61. https://blog.testdouble.com/categories/our-company
- 62. https://link.testdouble.com/blog-cta-sales
- 63. https://testdouble.com/
- 64. https://testdouble.com/agency
- 65. https://testdouble.com/services
- 66. https://testdouble.com/careers
- 67. https://blog.testdouble.com/
- 68. https://testdouble.com/contact
- 69. https://mastodon.social/@testdouble
- 70. https://github.com/testdouble
- 71. https://www.linkedin.com/company/testdouble
- 72. https://twitter.com/testdouble
- 73. tel:+16143494279
- 74. mailto:hello@testdouble.com
- 75. https://testdouble.com/privacy-policy
- 76. https://testdouble.com/
+[1] https://testdouble.com/
+[3] https://testdouble.com/
+[4] https://testdouble.com/agency
+[5] https://testdouble.com/services
+[6] https://testdouble.com/careers
+[7] https://blog.testdouble.com/
+[8] https://testdouble.com/contact
+[9] https://blog.testdouble.com/
+[10] https://blog.testdouble.com/posts/
+[11] https://blog.testdouble.com/authors/justin-searls/
+[12] https://openai.com/product/dall-e-2
+[13] https://openai.com/blog/chatgpt
+[14] https://en.wikipedia.org/wiki/Self-driving_car
+[15] https://www.automotivelogistics.media/transition-to-automated-trucks-must-be-managed-warn-trade-bodies/18446.article
+[16] https://www.nytimes.com/2017/08/11/business/dealbook/teamsters-union-tries-to-slow-self-driving-truck-push.html
+[17] https://www.nbcnews.com/business/autos/millions-professional-drivers-will-be-replaced-self-driving-vehicles-n817356
+[18] https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#_now_-its-time-to-major-bump-web-20
+[19] https://en.wikipedia.org/wiki/Wisdom_of_the_crowd
+[20] https://en.wikipedia.org/wiki/Network_effect
+[21] https://en.wikipedia.org/wiki/Generative_adversarial_network
+[22] https://www.theverge.com/2022/12/8/23499728/ai-capability-accessibility-chatgpt-stable-diffusion-commercialization
+[23] https://www.theverge.com/2023/2/15/23599072/microsoft-ai-bing-personality-conversations-spy-employees-webcams
+[24] https://www.theverge.com/2023/1/20/23563851/google-search-ai-chatbot-demo-chatgpt
+[25] https://www.theverge.com/2021/5/18/22442328/google-io-2021-ai-language-model-lamda-pluto
+[26] https://www.youtube.com/playlist?list=PLIuJbrOVyGjkRj7UM_whr-CPoqcXTOsZa
+[27] https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#chatgpt-can-do-some-peoples-work-but-not-everyones
+[28] https://github.com/features/copilot
+[29] https://www.theverge.com/2022/12/5/23493932/chatgpt-ai-generated-answers-temporarily-banned-stack-overflow-llms-dangers
+[30] https://www.npr.org/2022/12/19/1143912956/chatgpt-ai-chatbot-homework-academia
+[31] https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/bing-1.ebd5fca31dbdd729c4dcc7388630e69f6d26b128d967b20a38c41409b7ee0099.png
+[32] https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/bing-2.c1830c7fb3f4634158a9fffc0ccac3396f09619761d7ccd2218ce9b77d19b826.png
+[33] https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/bing-3.a2922e3b785ab4216bb01299f118c55a7cd2b43a82db909f66bdc9c83e956fe6.png
+[34] https://www.youtube.com/watch?v=gllCXqnR-5E
+[35] https://www.youtube.com/watch?v=gllCXqnR-5E&t=1004s
+[36] https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#three-simple-rules-for-keeping-your-job
+[37] https://en.wikipedia.org/wiki/Artificial_neural_network#Stochastic_neural_network
+[38] https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
+[39] https://en.wikipedia.org/wiki/Reinventing_the_wheel
+[40] https://en.wikipedia.org/wiki/Emergent_Design
+[41] https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#post-not-over-how-can-i-save-my-job
+[42] https://en.wikipedia.org/wiki/Universal_basic_income
+[43] https://en.wikipedia.org/wiki/Fight-or-flight_response
+[44] https://www.theverge.com/2023/3/2/23622836/cnet-eic-takes-red-ventures-ai-content-job-connie-guglielmo
+[45] https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/#in-conclusion
+[46] https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/chat-gpt-1.be7ef1f6a65dabe7f2ee88e296ff404980183879a0a79f88537affe6a44f17e3.png
+[47] https://cdn-blog.testdouble.com/img/how-to-tell-if-ai-threatens-your-job/chat-gpt-2.ccd08019b5f629691f6f09f5e4118186dc3d3001d712449034804f9a8ffde7c3.png
+[48] https://blog.testdouble.com/authors/justin-searls/
+[49] https://twitter.com/searls
+[50] https://mastodon.social/@searls
+[51] https://github.com/searls
+[52] https://linkedin.com/in/searls
+[53] https://justin.searls.co/
+[54] https://blog.testdouble.com/posts/2021-07-07-policy-update-were-still-remote/
+[55] https://blog.testdouble.com/authors/todd-kaufman/
+[56] https://blog.testdouble.com/categories/our-company
+[57] https://blog.testdouble.com/posts/2021-06-01-celebrating-agent-0100-milestone/
+[58] https://blog.testdouble.com/authors/todd-kaufman/
+[59] https://blog.testdouble.com/categories/our-company
+[60] https://blog.testdouble.com/posts/2020-10-22-5-for-5000-find-your-leading-indicators/
+[61] https://blog.testdouble.com/authors/justin-searls/
+[62] https://blog.testdouble.com/categories/our-company
+[63] https://link.testdouble.com/blog-cta-sales
+[64] https://testdouble.com/
+[65] https://testdouble.com/agency
+[66] https://testdouble.com/services
+[67] https://testdouble.com/careers
+[68] https://blog.testdouble.com/
+[69] https://testdouble.com/contact
+[70] https://mastodon.social/@testdouble
+[71] https://github.com/testdouble
+[72] https://www.linkedin.com/company/testdouble
+[73] https://twitter.com/testdouble
+[74] tel:+16143494279
+[75] mailto:hello@testdouble.com
+[76] https://testdouble.com/privacy-policy
+[77] https://testdouble.com/
diff --git a/static/archive/blog-testdouble-com-g9g5id.txt b/static/archive/blog-testdouble-com-g9g5id.txt
index e33acd5..bfb2f5c 100644
--- a/static/archive/blog-testdouble-com-g9g5id.txt
+++ b/static/archive/blog-testdouble-com-g9g5id.txt
@@ -1,365 +1,346 @@
- [1]Test Double The Test Double logo
+[matomo]
- Menu
+[1] Test Double The Test Double logo
- (BUTTON) Menu Menu An icon that displays an illustration of a website
- menu
- * [2]Home
- * [3]Agency
- * [4]Services
- * [5]Careers
- * [6]Blog
- * [7]Contact
+Menu
- [8]Blog [9]Posts
+Menu An icon that displays an illustration of a website menu
+
+ • [3] Home
+ • [4] Agency
+ • [5] Services
+ • [6] Careers
+ • [7] Blog
+ • [8] Contact
+
+[9] Blog [10] Posts
Only you can give meaning to your career
How to mark moments that matter by planting a flag
- An icon of a clock Publish Date
- January 2, 2024
+An icon of a clock Publish Date
+ January 2, 2024
+An icon of a human figure Authors
+ [11]Justin Searls
- An icon of a human figure Authors
- [10]Justin Searls
+I have, for whatever reason, live-blogged my career. Posting technical tips
+I’ve learned. Complaining about bugs I’ve uncovered. Elaborating on struggles
+my teams have faced. Mixed in with the substantive stuff has been plenty of
+vain ephemera that many would rightly describe as “over-sharing.” My brother
+sent me [12]this last week and I felt personally attacked:
- I have, for whatever reason, live-blogged my career. Posting technical
- tips I’ve learned. Complaining about bugs I’ve uncovered. Elaborating
- on struggles my teams have faced. Mixed in with the substantive stuff
- has been plenty of vain ephemera that many would rightly describe as
- “over-sharing.” My brother sent me [11]this last week and I felt
- personally attacked:
+ Everyone is fighting a battle you don’t know about. Except for me. I am
+ complaining loudly about my battle. Everybody knows about it.
- Everyone is fighting a battle you don’t know about. Except for me. I
- am complaining loudly about my battle. Everybody knows about it.
+So if you’ve borne witness to how much of my life I have spewed
+indiscriminately onto the Internet: first, I’m sorry. And second, please know
+that my vocation as a limelight enthusiast is emphatically not what I’m
+encouraging when I say this: I really wish more people took the time to reflect
+on the moments that mattered most in their careers and did more to memorialize
+them.
- So if you’ve borne witness to how much of my life I have spewed
- indiscriminately onto the Internet: first, I’m sorry. And second,
- please know that my vocation as a limelight enthusiast is emphatically
- not what I’m encouraging when I say this: I really wish more people
- took the time to reflect on the moments that mattered most in their
- careers and did more to memorialize them.
+Ask yourself: what experience in the Spring of 2019 had the greatest impact on
+how you go about your work today? Or 2017… what was 2017 all about? Think about
+the project you’re focused on right now. What will you remember about it a
+decade from now? In what ways are you reaching (or being stretched) beyond your
+comfort zone? If Walter Isaacson were writing a bullshit hagiography about your
+life instead of some [13]other schmuck, what would he have to say about you in
+your current chapter?
- Ask yourself: what experience in the Spring of 2019 had the greatest
- impact on how you go about your work today? Or 2017… what was 2017 all
- about? Think about the project you’re focused on right now. What will
- you remember about it a decade from now? In what ways are you reaching
- (or being stretched) beyond your comfort zone? If Walter Isaacson were
- writing a bullshit hagiography about your life instead of some
- [12]other schmuck, what would he have to say about you in your current
- chapter?
+How does it feel to be asked these questions?
- How does it feel to be asked these questions?
+Early in my career, being asked those questions would have felt like a personal
+attack. But why? I had the tremendous privilege to have a job that paid me to
+use my mind instead of my hands, that afforded me the comfort of working behind
+a desk instead of out in a field, and that saw value in my continued growth
+instead of viewing me as a resource to be extracted and consumed. Those
+relative luxuries signaled that (by some definitions) I had “made it,” but
+nevertheless there I was: working overtime and shedding hair to deliver
+projects that meant nothing to me. As the years passed, I knew I was
+accomplishing something and growing somehow, but I found myself totally unable
+to articulate what or how.
- Early in my career, being asked those questions would have felt like a
- personal attack. But why? I had the tremendous privilege to have a job
- that paid me to use my mind instead of my hands, that afforded me the
- comfort of working behind a desk instead of out in a field, and that
- saw value in my continued growth instead of viewing me as a resource to
- be extracted and consumed. Those relative luxuries signaled that (by
- some definitions) I had “made it,” but nevertheless there I was:
- working overtime and shedding hair to deliver projects that meant
- nothing to me. As the years passed, I knew I was accomplishing
- something and growing somehow, but I found myself totally unable to
- articulate what or how.
+Not unrelatedly, I grew to hate answering “what do you do?” at parties.
- Not unrelatedly, I grew to hate answering “what do you do?” at parties.
+People tend to spend about a third of their lifespan at work, and that’s
+assuming they’re fortunate enough to retire at some point. That’s a big chunk
+of life to be rendered meaningless! So I decided to be someone whose work
+mattered—to myself, if no one else.
- People tend to spend about a third of their lifespan at work, and
- that’s assuming they’re fortunate enough to retire at some point.
- That’s a big chunk of life to be rendered meaningless! So I decided to
- be someone whose work mattered—to myself, if no one else.
+Deciding to take ownership over the meaning of my work has unquestionably
+changed my life for the better. This post is the first time I’ve shared my
+process publicly, and my hope is that others will benefit from reading it.
+Given how dissatisfied most people seem to be with their careers, maybe that’s
+you.
- Deciding to take ownership over the meaning of my work has
- unquestionably changed my life for the better. This post is the first
- time I’ve shared my process publicly, and my hope is that others will
- benefit from reading it. Given how dissatisfied most people seem to be
- with their careers, maybe that’s you.
+[14]Periodically plant a flag
-[13]Periodically plant a flag
+Despite the fact that I live in Florida and I’m typing this sentence poolside
+in shorts and a t-shirt in mid-December, I conceptualize time with the passage
+of seasons. There are seasons when my life demands a lot from me and my career
+is forced to take a back seat. There are seasons when my work is particularly
+engaging and my life falls into a pleasant-but-unremarkable routine. There are,
+of course, seasons when both are challenging simultaneously, but hopefully not
+too many. Whatever the case, I find myself pausing every three or four months
+and pondering, “what from the last season of my life is worth remembering?”
- Despite the fact that I live in Florida and I’m typing this sentence
- poolside in shorts and a t-shirt in mid-December, I conceptualize time
- with the passage of seasons. There are seasons when my life demands a
- lot from me and my career is forced to take a back seat. There are
- seasons when my work is particularly engaging and my life falls into a
- pleasant-but-unremarkable routine. There are, of course, seasons when
- both are challenging simultaneously, but hopefully not too many.
- Whatever the case, I find myself pausing every three or four months and
- pondering, “what from the last season of my life is worth remembering?”
+It’s not like I have a reminder scheduled or anything. I don’t gather my
+colleagues and family for a standing meeting to review my achievements from the
+prior quarter. It’s more like an itch I’ve trained my brain to scratch whenever
+I go more than a few months without examining where my time has gone and what I
+have to show for it.
- It’s not like I have a reminder scheduled or anything. I don’t gather
- my colleagues and family for a standing meeting to review my
- achievements from the prior quarter. It’s more like an itch I’ve
- trained my brain to scratch whenever I go more than a few months
- without examining where my time has gone and what I have to show for
- it.
+I often refer to this regular act of reflection as “planting a flag” to
+symbolize whatever I want to stand out when I look back on a period of my life.
+In my case, these flags usually take the form of creative work like a blog
+post, a conference talk, or an open source library, but however you choose to
+imbue meaning into your experiences is entirely up to you. The most important
+thing is that you sit with them long enough to associate your memories of those
+experiences with why they mattered. When useful artifacts shake out of my
+process that can help others along in their own journeys, that’s a happy
+accident as far as I’m concerned.
- I often refer to this regular act of reflection as “planting a flag” to
- symbolize whatever I want to stand out when I look back on a period of
- my life. In my case, these flags usually take the form of creative work
- like a blog post, a conference talk, or an open source library, but
- however you choose to imbue meaning into your experiences is entirely
- up to you. The most important thing is that you sit with them long
- enough to associate your memories of those experiences with why they
- mattered. When useful artifacts shake out of my process that can help
- others along in their own journeys, that’s a happy accident as far as
- I’m concerned.
+[15]How to plant a flag
-[14]How to plant a flag
+So, how does one actually assign meaning to a heretofore meaningless
+experience? This is the process I’ve settled into over the years to identify
+and commemorate my life’s watershed moments:
- So, how does one actually assign meaning to a heretofore meaningless
- experience? This is the process I’ve settled into over the years to
- identify and commemorate my life’s watershed moments:
- 1. Reflect: spend some unstructured time—maybe on a walk or with a
- notebook—and let your mind wander through the previous season of
- your life. A lesson you learned. Feedback that encouraged you. An
- interaction that left an impact. A moment that inspired you. I’m
- especially drawn to memories where emotions ran high—maybe I was
- really worried before a hard conversation or relieved after a
- colleague helped me solve a hard problem. If I draw a blank, I scan
- my e-mail and calendar to jog my memory. If, nothing stands out
- after all that, I don’t force it; I’ll give the exercise a rest and
- come back to it a few days later
- 2. Collect: considering the experiences that came to mind when
- reflecting, which ones were distinct and new to you? Anything new
- you learned is, by definition, novel, and would obviously qualify.
- It’s naturally harder to identify familiar-seeming experiences as
- novel, but perhaps there was something unique and interesting
- hiding in the otherwise banal UI control you shipped last month.
- Why do this? Because by filtering out everything you’ve seen and
- done before, whatever flag you plant will stand taller, and you
- won’t risk mistaking this moment and its meaning for another. If
- this step filters everything out because nothing seems sufficiently
- novel, widen the aperture a bit—surely something interesting
- happened in the last few months. And, try as you might, if you go
- long enough with nothing to show for it, the meaning you’re
- searching for may be that it’s time to make a change
- 3. Connect: for each of the experiences you’ve collected, try to
- understand how they might connect to future situations. A new tool
- or technique might empower you to do something you couldn’t
- accomplish otherwise. A painful mistake might warn your future self
- to avoid try a different approach next time. Since I can’t see the
- future, I imagine what impact each such insight might have had if
- applied to experiences from my past. “If I’d had learned this years
- ago, how would it have changed other events in my life?” If I can
- think of several moments in my life that would have played out
- differently, that’s as good of evidence as any that it has the
- potential to make an impact on you going forward
- 4. Protect: memory is fleeting, and the work you do to identify
- moments that matter will quickly fade away if you don’t do
- something to mark the occasion. Memories thrive in novelty and
- wither in predictability, so the only wrong answer would be to
- enshrine every life lesson in the exact same way. Because creative
- endeavors necessarily result in the creation of something new,
- they’re a great way to clarify meaning and cement memories. My
- go-to creative outlets are essays, videos, and code, but yours
- might be songs, recipes, or [15]Etch A Sketch portraiture
+ 1. Reflect: spend some unstructured time—maybe on a walk or with a
+ notebook—and let your mind wander through the previous season of your life.
+ A lesson you learned. Feedback that encouraged you. An interaction that
+ left an impact. A moment that inspired you. I’m especially drawn to
+ memories where emotions ran high—maybe I was really worried before a hard
+ conversation or relieved after a colleague helped me solve a hard problem.
+ If I draw a blank, I scan my e-mail and calendar to jog my memory. If,
+ nothing stands out after all that, I don’t force it; I’ll give the exercise
+ a rest and come back to it a few days later
+ 2. Collect: considering the experiences that came to mind when reflecting,
+ which ones were distinct and new to you? Anything new you learned is, by
+ definition, novel, and would obviously qualify. It’s naturally harder to
+ identify familiar-seeming experiences as novel, but perhaps there was
+ something unique and interesting hiding in the otherwise banal UI control
+ you shipped last month. Why do this? Because by filtering out everything
+ you’ve seen and done before, whatever flag you plant will stand taller, and
+ you won’t risk mistaking this moment and its meaning for another. If this
+ step filters everything out because nothing seems sufficiently novel, widen
+ the aperture a bit—surely something interesting happened in the last few
+ months. And, try as you might, if you go long enough with nothing to show
+ for it, the meaning you’re searching for may be that it’s time to make a
+ change
+ 3. Connect: for each of the experiences you’ve collected, try to understand
+ how they might connect to future situations. A new tool or technique might
+ empower you to do something you couldn’t accomplish otherwise. A painful
+ mistake might warn your future self to avoid try a different approach next
+ time. Since I can’t see the future, I imagine what impact each such insight
+ might have had if applied to experiences from my past. “If I’d had learned
+ this years ago, how would it have changed other events in my life?” If I
+ can think of several moments in my life that would have played out
+ differently, that’s as good of evidence as any that it has the potential to
+ make an impact on you going forward
+ 4. Protect: memory is fleeting, and the work you do to identify moments that
+ matter will quickly fade away if you don’t do something to mark the
+ occasion. Memories thrive in novelty and wither in predictability, so the
+ only wrong answer would be to enshrine every life lesson in the exact same
+ way. Because creative endeavors necessarily result in the creation of
+ something new, they’re a great way to clarify meaning and cement memories.
+ My go-to creative outlets are essays, videos, and code, but yours might be
+ songs, recipes, or [16]Etch A Sketch portraiture
- That’s it! Reflect, collect, connect, and protect.
+That’s it! Reflect, collect, connect, and protect.
- (See what I did there? How all the steps rhyme. That’s the kind of
- thing you’ll be able to pull off with a decade of practice doing this.)
+(See what I did there? How all the steps rhyme. That’s the kind of thing you’ll
+be able to pull off with a decade of practice doing this.)
-[16]This all happens in hindsight
+[17]This all happens in hindsight
- If you’ve ever had a job that encouraged you to make quarterly or
- annual goals for yourself, you may have noticed that a lot of those
- goals go unfinished. By the time performance reviews roll around,
- people often feel forced to justify why they didn’t achieve this or
- that goal. Regardless of the reason—maybe learning some skill was no
- longer relevant or the business’s strategic priorities shifted—the
- failure to meet a goal is often rooted in a failure to predict the
- future. I’m sure managers hope people will feel inspired and
- accountable to pursue their goals creatively, but in my experience they
- more often instill procrastination and anxiety. If there’s any
- creativity exhibited in annual goal rituals, it’s usually when people
- feel forced to weave a narrative that kinda-sorta connects a stated
- objective to whatever mostly-unrelated work they actually did.
+If you’ve ever had a job that encouraged you to make quarterly or annual goals
+for yourself, you may have noticed that a lot of those goals go unfinished. By
+the time performance reviews roll around, people often feel forced to justify
+why they didn’t achieve this or that goal. Regardless of the reason—maybe
+learning some skill was no longer relevant or the business’s strategic
+priorities shifted—the failure to meet a goal is often rooted in a failure to
+predict the future. I’m sure managers hope people will feel inspired and
+accountable to pursue their goals creatively, but in my experience they more
+often instill procrastination and anxiety. If there’s any creativity exhibited
+in annual goal rituals, it’s usually when people feel forced to weave a
+narrative that kinda-sorta connects a stated objective to whatever
+mostly-unrelated work they actually did.
- To wit, I’ve never accomplished anything I felt proud of by setting a
- goal. In fact, the surest way to ensure I don’t do something is to set
- a goal. When asked to set goals for myself, I’ve found that expressing
- the goal (as opposed to achieving it) becomes my overriding objective.
- The moment a manager approved my list of goals, I felt that I had
- completed the work asked of me and I would instantly lose all
- motivation to pursue the goals themselves.
+To wit, I’ve never accomplished anything I felt proud of by setting a goal. In
+fact, the surest way to ensure I don’t do something is to set a goal. When
+asked to set goals for myself, I’ve found that expressing the goal (as opposed
+to achieving it) becomes my overriding objective. The moment a manager approved
+my list of goals, I felt that I had completed the work asked of me and I would
+instantly lose all motivation to pursue the goals themselves.
- This explains why planting flags can succeed where goal-setting fails.
- If what I’m searching for is meaning in my work, setting a goal creates
- an expectation of where, when, and how my future self should find that
- meaning. High pressure. Focusing on doing my job well and reflecting on
- whatever I did in retrospect, however, has allowed me to sift through
- my experiences, identify patterns, and give meaning to them. Low
- pressure.
+This explains why planting flags can succeed where goal-setting fails. If what
+I’m searching for is meaning in my work, setting a goal creates an expectation
+of where, when, and how my future self should find that meaning. High pressure.
+Focusing on doing my job well and reflecting on whatever I did in retrospect,
+however, has allowed me to sift through my experiences, identify patterns, and
+give meaning to them. Low pressure.
- Instead of studying something you think you might need in the future,
- wait for the need to arise and then immerse yourself in learning it.
- Instead of feeling stressed and distracted by the fear that you’ll run
- out of time before hitting an annual goal, do your work diligently and
- look forward to the next opportunity to reflect on the things you’ll
- achieve. Instead of reducing your existence at work into a series of
- boxes to check in a prescribed career plan, focus on being truly
- present and intentional at work and open to wherever that might lead
- you.
+Instead of studying something you think you might need in the future, wait for
+the need to arise and then immerse yourself in learning it. Instead of feeling
+stressed and distracted by the fear that you’ll run out of time before hitting
+an annual goal, do your work diligently and look forward to the next
+opportunity to reflect on the things you’ll achieve. Instead of reducing your
+existence at work into a series of boxes to check in a prescribed career plan,
+focus on being truly present and intentional at work and open to wherever that
+might lead you.
-[17]Who, me? Yes, you!
+[18]Who, me? Yes, you!
- There’s just one last thing to talk about: you, and why you don’t
- already do this.
+There’s just one last thing to talk about: you, and why you don’t already do
+this.
- It’s not like this retrospective process of imbuing meaning into one’s
- work is particularly clever or insightful. I don’t think I’m a genius
- for arriving at the following three-step formula to having a deeply
- meaningful career and leaving a memorable legacy:
- 1. Work really damn hard
- 2. Occasionally gather highlights
- 3. Commemorate them somehow
+It’s not like this retrospective process of imbuing meaning into one’s work is
+particularly clever or insightful. I don’t think I’m a genius for arriving at
+the following three-step formula to having a deeply meaningful career and
+leaving a memorable legacy:
- But if it’s so obvious, why don’t more people do this?
+ 1. Work really damn hard
+ 2. Occasionally gather highlights
+ 3. Commemorate them somehow
- I wonder if it’s because everything above might seem like the exclusive
- domain of the Thoughtleader™ class. “I don’t have (or necessarily want)
- an audience to read my blog posts or watch me speak, so this ain’t for
- me!” you might be thinking.
+But if it’s so obvious, why don’t more people do this?
- This line of thinking is reasonable, but it’s based on an assumption
- that doesn’t always hold.
+I wonder if it’s because everything above might seem like the exclusive domain
+of the Thoughtleader™ class. “I don’t have (or necessarily want) an audience to
+read my blog posts or watch me speak, so this ain’t for me!” you might be
+thinking.
- It’s true: if you believe the purpose of creating something borne out
- of your career experience is for other people to see and appreciate it,
- then maybe it makes no sense for you to bother. Not everyone craves
- attention. Building a following inevitably attracts a certain number of
- trolls. And if you build it, odds are people won’t come. I can’t
- guarantee anyone will run your code, read your blog, or watch your
- talk.
+This line of thinking is reasonable, but it’s based on an assumption that
+doesn’t always hold.
- But here’s the thing: I create these things for me and me alone. When a
- bunch of people read something I wrote or show up to one of my talks,
- do I find it encouraging and validating? Sure. But it’s not what drives
- me. I started creating things to punctuate my life’s sentences long
- before anybody took an interest in me and I wouldn’t stop even if
- everyone loses interest in me.
+It’s true: if you believe the purpose of creating something borne out of your
+career experience is for other people to see and appreciate it, then maybe it
+makes no sense for you to bother. Not everyone craves attention. Building a
+following inevitably attracts a certain number of trolls. And if you build it,
+odds are people won’t come. I can’t guarantee anyone will run your code, read
+your blog, or watch your talk.
- What’s more, a lot of (ugh) content creators are the same way. In the
- course of my travels, I’ve gotten to meet many of my heroes, and while
- a few have disappointed me spectacularly (don’t meet your heroes!),
- I’ve found that a surprising number of them got into the
- thought-leading racket for the same selfish reason I did. They create
- stuff to scratch their own intrinsic creative itches and to give
- meaning to their careers. If other people’s attention factors in at
- all, it’s usually to justify the time they spend making stuff.
+But here’s the thing: I create these things for me and me alone. When a bunch
+of people read something I wrote or show up to one of my talks, do I find it
+encouraging and validating? Sure. But it’s not what drives me. I started
+creating things to punctuate my life’s sentences long before anybody took an
+interest in me and I wouldn’t stop even if everyone loses interest in me.
-[18]Justin Searls
+What’s more, a lot of (ugh) content creators are the same way. In the course of
+my travels, I’ve gotten to meet many of my heroes, and while a few have
+disappointed me spectacularly (don’t meet your heroes!), I’ve found that a
+surprising number of them got into the thought-leading racket for the same
+selfish reason I did. They create stuff to scratch their own intrinsic creative
+itches and to give meaning to their careers. If other people’s attention
+factors in at all, it’s usually to justify the time they spend making stuff.
- An icon of a human figure Status
- Double Agent
+[002]
- An icon of a hash sign Code Name
- Agent 002
+[19] Justin Searls
- An icon of a map marker Location
- Orlando, FL
+An icon of a human figure Status
+ Double Agent
+An icon of a hash sign Code Name
+ Agent 002
+An icon of a map marker Location
+ Orlando, FL
- [19]Twitter [20]Mastodon [21]Github [22]LinkedIn [23]Website
+[20] Twitter [21] Mastodon [22] Github [23] LinkedIn [24] Website
Related posts:
-[24]16 things you believe about software
+[25] 16 things you believe about software
- Over 6 years ago, I made up an unscientific personality quiz as a
- joke…and people can't help themselves—they're still filling it out!
- Here's what they think
+Over 6 years ago, I made up an unscientific personality quiz as a joke…and
+people can't help themselves—they're still filling it out! Here's what they
+think
- An icon of a clock Publish Date
- October 10, 2023
+An icon of a clock Publish Date
+ October 10, 2023
+An icon of a human figure Authors
+ [26]Justin Searls
+An icon of a paper organzier Categories
+ [27]Community
- An icon of a human figure Authors
- [25]Justin Searls
+[28] Shared values can make the difference for your engineering team
- An icon of a paper organzier Categories
- [26]Community
+Ever feel challenged in how to level up your engineering team's effectiveness?
+Apply values in day-to-day work. That's how you build great software and great
+teams. Here's how Test Double does that.
-[27]Shared values can make the difference for your engineering team
-
- Ever feel challenged in how to level up your engineering team's
- effectiveness? Apply values in day-to-day work. That's how you build
- great software and great teams. Here's how Test Double does that.
-
- An icon of a clock Publish Date
- February 20, 2023
-
- An icon of a human figure Authors
- [28]Cathy Colliver
-
- An icon of a paper organzier Categories
- [29]Leadership
- [30]Teams
- [31]Our Company
+An icon of a clock Publish Date
+ February 20, 2023
+An icon of a human figure Authors
+ [29]Cathy Colliver
+An icon of a paper organzier Categories
+ [30]Leadership
+ [31]Teams
+ [32]Our Company
Looking for developers? Work with people who care about what you care about.
We level up teams striving to ship great code.
- [32]Let's talk
+[33] Let's talk
+[34]Home [35]Agency [36]Services [37]Careers [38]Blog [39]Contact
+[40] Mastodon [41] GitHub [42] LinkedIn [43] Twitter
- [33]Home [34]Agency [35]Services [36]Careers [37]Blog [38]Contact
+[44] 614.349.4279
+[45] hello@testdouble.com
+[46]Privacy Policy
+Founded in Columbus, OH
+
+[47] Test Double
- [39]Mastodon [40]GitHub [41]LinkedIn [42]Twitter
- [43]614.349.4279
- [44]hello@testdouble.com
- [45]Privacy Policy
- Founded in Columbus, OH
+References:
-[46]Test Double
-
-References
-
- 1. https://testdouble.com/
- 2. https://testdouble.com/
- 3. https://testdouble.com/agency
- 4. https://testdouble.com/services
- 5. https://testdouble.com/careers
- 6. https://blog.testdouble.com/
- 7. https://testdouble.com/contact
- 8. https://blog.testdouble.com/
- 9. https://blog.testdouble.com/posts/
- 10. https://blog.testdouble.com/authors/justin-searls/
- 11. https://x.com/TheAndrewNadeau/status/1647622603698257921
- 12. https://www.amazon.com/Elon-Musk-Walter-Isaacson/dp/1982181281
- 13. https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#periodically-plant-a-flag
- 14. https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#how-to-plant-a-flag
- 15. https://www.etsy.com/shop/PrincessEtch
- 16. https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#this-all-happens-in-hindsight
- 17. https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#who-me-yes-you
- 18. https://blog.testdouble.com/authors/justin-searls/
- 19. https://twitter.com/searls
- 20. https://mastodon.social/@searls
- 21. https://github.com/searls
- 22. https://linkedin.com/in/searls
- 23. https://justin.searls.co/
- 24. https://blog.testdouble.com/posts/2023-10-10-16-things-you-believe-about-software/
- 25. https://blog.testdouble.com/authors/justin-searls/
- 26. https://blog.testdouble.com/categories/community
- 27. https://blog.testdouble.com/posts/2023-02-20-shared-values-make-the-difference/
- 28. https://blog.testdouble.com/authors/cathy-colliver/
- 29. https://blog.testdouble.com/categories/leadership
- 30. https://blog.testdouble.com/categories/teams
- 31. https://blog.testdouble.com/categories/our-company
- 32. https://link.testdouble.com/blog-cta-sales
- 33. https://testdouble.com/
- 34. https://testdouble.com/agency
- 35. https://testdouble.com/services
- 36. https://testdouble.com/careers
- 37. https://blog.testdouble.com/
- 38. https://testdouble.com/contact
- 39. https://mastodon.social/@testdouble
- 40. https://github.com/testdouble
- 41. https://www.linkedin.com/company/testdouble
- 42. https://twitter.com/testdouble
- 43. tel:+16143494279
- 44. mailto:hello@testdouble.com
- 45. https://testdouble.com/privacy-policy
- 46. https://testdouble.com/
+[1] https://testdouble.com/
+[3] https://testdouble.com/
+[4] https://testdouble.com/agency
+[5] https://testdouble.com/services
+[6] https://testdouble.com/careers
+[7] https://blog.testdouble.com/
+[8] https://testdouble.com/contact
+[9] https://blog.testdouble.com/
+[10] https://blog.testdouble.com/posts/
+[11] https://blog.testdouble.com/authors/justin-searls/
+[12] https://x.com/TheAndrewNadeau/status/1647622603698257921
+[13] https://www.amazon.com/Elon-Musk-Walter-Isaacson/dp/1982181281
+[14] https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#periodically-plant-a-flag
+[15] https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#how-to-plant-a-flag
+[16] https://www.etsy.com/shop/PrincessEtch
+[17] https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#this-all-happens-in-hindsight
+[18] https://blog.testdouble.com/posts/2024-01-02-plant-your-flag-career-advice/#who-me-yes-you
+[19] https://blog.testdouble.com/authors/justin-searls/
+[20] https://twitter.com/searls
+[21] https://mastodon.social/@searls
+[22] https://github.com/searls
+[23] https://linkedin.com/in/searls
+[24] https://justin.searls.co/
+[25] https://blog.testdouble.com/posts/2023-10-10-16-things-you-believe-about-software/
+[26] https://blog.testdouble.com/authors/justin-searls/
+[27] https://blog.testdouble.com/categories/community
+[28] https://blog.testdouble.com/posts/2023-02-20-shared-values-make-the-difference/
+[29] https://blog.testdouble.com/authors/cathy-colliver/
+[30] https://blog.testdouble.com/categories/leadership
+[31] https://blog.testdouble.com/categories/teams
+[32] https://blog.testdouble.com/categories/our-company
+[33] https://link.testdouble.com/blog-cta-sales
+[34] https://testdouble.com/
+[35] https://testdouble.com/agency
+[36] https://testdouble.com/services
+[37] https://testdouble.com/careers
+[38] https://blog.testdouble.com/
+[39] https://testdouble.com/contact
+[40] https://mastodon.social/@testdouble
+[41] https://github.com/testdouble
+[42] https://www.linkedin.com/company/testdouble
+[43] https://twitter.com/testdouble
+[44] tel:+16143494279
+[45] mailto:hello@testdouble.com
+[46] https://testdouble.com/privacy-policy
+[47] https://testdouble.com/
diff --git a/static/archive/blog-testdouble-com-krzanb.txt b/static/archive/blog-testdouble-com-krzanb.txt
index 7892a41..fed3bed 100644
--- a/static/archive/blog-testdouble-com-krzanb.txt
+++ b/static/archive/blog-testdouble-com-krzanb.txt
@@ -1,646 +1,603 @@
- [1]Test Double The Test Double logo
+[matomo]
- Menu
+[1] Test Double The Test Double logo
- (BUTTON) Menu Menu An icon that displays an illustration of a website
- menu
- * [2]Home
- * [3]Agency
- * [4]Services
- * [5]Careers
- * [6]Blog
- * [7]Contact
+Menu
- [8]Blog [9]Posts
+Menu An icon that displays an illustration of a website menu
+
+ • [3] Home
+ • [4] Agency
+ • [5] Services
+ • [6] Careers
+ • [7] Blog
+ • [8] Contact
+
+[9] Blog [10] Posts
The looming demise of the 10x developer
Why an era of enthusiast programmers is coming to an end
- An icon of a clock Publish Date
- July 12, 2023
-
- An icon of a human figure Authors
- [10]Justin Searls
-
- I’ve recently been telling anyone who will listen that I am excited to
- be on the precipice of using [11]Sorbet to write a type-checked edition
- of [12]Mocktail that has the potential to unlock productivity workflows
- never before possible in Ruby.
-
- I’m not there yet.
-
- I don’t want to say it’s been a “quagmire,” but I’m over [13]150
- commits in, and there’s a lot left to button up before release. It’s
- been a real challenge. Learning Sorbet at all takes a good chunk of
- time, to be sure. I’ve also hit a number of thorny edge cases and
- elusive bugs along the way (both in the type system itself and that the
- type system exposed in my code). And, like usual, I’m trying to do
- something that’s never quite been done before, so I’m constantly
- oscillating between feelings of nervous excitement and fear that I’m
- attempting the impossible. (Though it’s been made far more possible
- thanks to the generous assistance of [14]Ufuk Kayserilioglu, [15]Kevin
- Newton, and [16]Jake Zimmerman!)
-
- Beyond this, any specifics I might share about my current quest are so
- banal as to not be worth your time. (If you somehow find this
- interesting, please [17]email me so I might feel less alone in this
- world.) That said, there is something generally interesting here that
- programmers don’t often talk about. And that’s the deeper question: why
- do I keep doing this to myself?
-
-[18]What makes me “special”
-
- I am an enthusiast programmer.
-
- I stumble on a problem like this one and I stay up late every night
- until I find the solution. I wake up early each morning with new ideas
- of things to try. I don’t take enough breaks, but when I do, they’re
- tactically-designed to exploit my brain’s asynchronous processor to
- generate solutions for whatever I’m currently stuck on. I irresponsibly
- defer responsibilities from other areas of my life. Eventually, I
- realize I’m only at the 20% mark and that a pattern is repeating where
- a month or more of my life is about to disappear from the calendar.
- Towards the end, I find myself rushing to find the maze’s exit because
- my desire to unlock the puzzle’s final secret starts to be overtaken by
- the shame of all the other balls I’m dropping. It’s excruciating as I
- approach that inflection point—as intense as an overbearing manager’s
- “do or die” deadlines ever were, except in this case the pressure I
- feel is entirely self-imposed.
-
- And then, at some uneventful moment at 4 pm on a Sunday, it’s done.
-
- Sometimes people care about what I made. Usually they don’t. Often,
- even I don’t.
-
- I give myself enough time to clear my inbox, tidy the house, and shave.
- Then I move onto the next Sisyphean task I’ve laid before myself.
-
- This describes how I’ve lived my life since I was 13 years old, with
- few exceptions. And let me tell you, it’s very difficult to juggle a
- healthy personal life and a sustainable work life when you’re
- simultaneously engulfed in an endless series of side quests to will
- every creative curiosity into existence.
-
- When I was a consultant at [19]Crowe, there was one year I billed
- clients for nearly 2100 hours, which averages out to more than 40 hours
- per week every week of the year with zero days off. And that’s not
- counting travel time. Or the half-dozen hours of weekly administrative
- work that wasn’t considered billable. Nevertheless, I found time in my
- nights and weekends that year to build an app with Apple’s buggy,
- mostly-undocumented initial iPhone SDK. The app was a native client to
- [20]vBulletin web forums, allowing users to browse threads and compose
- replies. Despite knowing nothing about any of the underlying
- technologies, I obsessively polished the app to perfection. Did I make
- time to sleep? I don’t remember. The whole year’s a blur.
-
- All so that Apple could reject my app because users might post swear
- words or dirty pictures. Oh, well. Onto the next thing.
-
- I don’t know what word best describes my behavior above without
- inflecting significant value judgment. Perfectionist? Obsessive?
- Passionate? Whatever we call this compulsion, it’s hardly an unalloyed
- good and it comes with its share of downsides. Nevertheless, it’s one
- of a number of idiosyncrasies and character flaws I’ve decided to lean
- into and find productive outlets for rather than attempting to repress
- or rewire.
-
- Other examples:
- * I ruminate endlessly under stress, so I wrest back some control by
- manufacturing stress responses over things I’m building to trick my
- brain into ruminating on work that’s useful to me. This both
- overrides the unhelpful, irrational worries that surround me every
- day and unlocks a “second shift” where I accomplish almost as much
- away from the keyboard as in front of it
- * I’m a terrible listener and struggle with auditory processing,
- especially in groups and loud environments. (One reason I talk so
- much is that it’s always felt safer to drive the conversation than
- risk mishearing and offending someone.) Parsing others’ sentences
- often feels like I’m filling in the blanks to make sense of them,
- like playing a game of [21]Mad Libs. Over the years, I’ve
- redirected this into a source of creativity and humor. Most of my
- puns and wordplay are happy accidents as I fill in the gaps in my
- own listening comprehension. Some of my most creative ideas are
- things I swear I heard someone say when it turns out they were
- actually talking about something else
- * I’m a really bad learner—disinterested, distractible, and
- disagreeable. I’ve never enjoyed learning and generally avoid it,
- especially learning for its own sake. At the slightest discomfort
- when struggling to understand something, I’ll grasp for any
- distraction that might offer me a momentary escape. When I do
- manage to get traction, I inevitably find myself disagreeing with
- the premise or subversively trying to prove the authors wrong. The
- upshot is that once I actually do learn something, I know it cold.
- It means I will have scoured every nook and climbed out of every
- pitfall. Professionally, this apparent weakness has turned out to
- be a superpower. Learning everything the hard way has made me a
- natural consultant and mentor. Because I’ve already explored all
- the wrong paths, I often know someone is stuck before they do,
- understand what threw them off course, and show them how to get
- back on track
-
- The reason I landed on this topic today is not that any of the above
- makes me special, it’s actually that contradictions like these—whatever
- their origin—are so typical among programmers born before 1990 that
- they’re entirely mundane.
-
-[22]An aberrant generation of programmers
-
- Squint and everything I just said about myself could have described a
- character from [23]The Big Bang Theory or [24]Silicon Valley. I’m at
- peace with the fact that on my best days, I’m an overplayed, abrasive
- character trope come to life. For decades, we’ve associated a slew of
- mostly-negative traits like these with programmers as if the linkage is
- inherent and inevitable. I’ve always thought that stereotype was
- arbitrary—anybody can learn programming and be great at it—but now I’m
- starting to think it’s a product of our times as well.
-
- That is to say, I’ve come to believe the era typified by the enthusiast
- programmer—autodidactic, obsessive, and antisocial—is drawing to a
- close.
-
- Why do I think that? Because there was a specific, generational moment
- that attracted a bunch of people like me into the software industry. It
- occurred during the brief window between home computers becoming widely
- available and their becoming sealed airtight by platform holders. For a
- fleeting moment, computers were simultaneously accessible and scrutable
- during a necessary but temporary stage in the maturation of information
- technology. Before they were rendered irreducibly complex as consumer
- devices, merely using a computer required figuring out a lot about how
- it worked. And coming of age with an understanding how computers worked
- made programming them far more approachable. And thanks to cosmic
- coincidence and the marketing teams of companies like RadioShack,
- society unwittingly handed a generation of social mobility to [25]the
- boys of upper-middle-class families in the US who felt more comfortable
- at home with their computer than outside engaging socially with their
- peers. I was definitely one of those awkward, anxious kids and a whole
- lot of the programmers I’ve met along the way were too.
-
- But one reason to believe that programmers don’t have to be like this
- is that programmers weren’t always like this. I remember asking a
- computer science professor in 2003 about our school’s gender disparity
- (we only had a single woman in my class, and she later switched
- majors). He recounted that before 1990 and the advent of hacker and
- gamer subcultures, my college touted robust majorities of women in
- computer science. (Nationally, women’s enrollment in CS doubled in a
- decade, [26]peaking at 37.1% nationally in 1984 before dropping
- precipitously.)
-
- And one reason to believe programmers won’t always be this way is that
- there’s plenty of evidence that the next generation of professional
- programmers is no longer dominated by enthusiasts. People becoming
- software developers today look markedly different than those who came
- before. (Sadly, I wish I could say I’m referring to the success of
- movements to increase representation from traditionally marginalized
- groups—tech is still dramatically over-indexed on white dudes who
- enjoyed affluent upbringings.) I’m just pointing to all the money
- sloshing around here: it catapulted programming from a firmly middle
- class job that appealed to people who really loved computers into a
- comfortably upper-middle class profession that attracts anyone who
- wants to secure their financial future. Ask anyone who switched careers
- in the last decade how many times someone suggested they “learn to
- code.” Countless people are entering the industry simply because
- programming is a relatively secure, well-paying profession. (And
- there’s nothing wrong with that!)
-
-[27]Inter-generational conflict is brewing
-
- I’m not sure if anyone has ever said “OK boomer” to my parents, but I
- can imagine it wouldn’t feel awesome to hear.
-
- Nor do I know whether anyone will coin a term to dismiss my generation,
- but I have faith that there’s enough societal exasperation out there
- for someone on TikTok to come up with something snappy. A lot of people
- in my professional cohort still see themselves as social outcasts who
- grew up in front of a CRT in their parents’ basements, but I suspect
- the next generation sees a homogenous monolith of 40-somethings wearing
- hoodies and sandals (with socks!) that lucked their way into capturing
- control of the software industry just as it settled into a state of
- economic maturity.
-
- Sit with this distinction for a while, and you might start to see these
- old-hat programmers as belonging to an Enthusiast Generation, one
- that—due to its unique initial circumstances—is unlikely to be
- replicated. Once I introduced the word “generation” to my thinking, it
- became easier to make sense of many contentious, unresolved issues in
- tech that flared up over the past decade by looking at them through the
- lens of intergenerational conflict. And just like any discussion of
- generations, it’s important to caveat that there are no firm boundary
- lines, that exceptions are plentiful, and that many observations will
- be isolated to a single locale and culture (the U.S. in this case,
- maybe Canada?). The only thing that bucketing people into generations
- can do for us is provide a new way to look at how a population may be
- changing, thanks to a big enough time-step to perceive the accumulation
- of decades of gradual change.
-
- To illustrate, I’ll highlight three high-profile conflicts that make a
- different kind of sense when viewed as a generational shift.
-
-[28]Passion
-
- I remember about 8 years ago, people [29]got [30]passionate [31]about
- [32]the [33]word [34]passion.
-
- This rubbed me the wrong way at first. Then again, everything does.
-
- I remember thinking, “banning the word ‘passion’ will just lead people
- to pick others like ‘self-driven’, ‘highly-motivated’, and
- ‘ambitious’.” I remember asking, “are we supposed to screen out
- candidates for whom programming is a hobby outside work?” What I don’t
- remember was pondering whether this was an indication that the times
- were changing.
-
- When I entered the industry, my salary was lower than it would’ve been
- if I’d gone into accounting, or become an actuary, or majored in civil
- engineering—myself and most of the people around me did get into
- software because we were passionate about it. Reading tweets and
- thinkpieces that suggested “passion” was a four-letter word felt like a
- personal affront, so I responded defensively.
-
- What I wasn’t thinking about was what it must have felt like for
- everyone who entered the industry expecting their job to be a job but
- who found themselves managed by people from my generation who didn’t
- leave them room to have a life outside work. Maybe everyone else on the
- team worked overtime without being asked. Maybe taking “too much”
- supposedly “unlimited” time off would foreclose any chance for a
- promotion. Maybe building rapport at lunch required holding evolved
- opinions on Emacs vs. Vim, or mechanical key switches, or whatever was
- on the front page of Hacker News. That sounds like a pretty miserable
- existence, especially if programming isn’t what gets you out of bed in
- the morning.
-
- If you allow for the possibility we’re undergoing a generational
- change, maybe this debate over “passion” is evidence that the
- assumption that most programmers will always be passionate about
- programming was mistaken and counter-productive.
-
-[35]Craftsmanship
-
- This brings another contentious word to mind: “craftsmanship.” Its
- origin, as I witnessed it, was a reaction to the watering down of the
- technical aspects of the agile software movement in the late 2000s in
- favor of more lucrative soft-skills training and consulting services.
- In case you missed it, most of the craftsmanship meme could be summed
- up as a Slow Code movement. There was a lot of talk about measuring
- twice and cutting once, establishing apprenticeship programs to train
- new programmers, and a million ways to leverage automated tests for
- purposes other than testing things.
-
- I was an active participant in this community, speaking at the
- [36]conference several times, putting [37]my name on the manifesto, and
- generally exhorting anyone who would listen to please make their
- software less terrible.
-
- But looking back, the craftsmanship movement wasn’t only about
- rekindling the tremendous engineering insights of agile methods like
- [38]Extreme Programming, it was also a response to a rapid influx of a
- generation of programmers who didn’t care about code quality the same
- way we did. There was a sense that serious programmers were under
- threat and hopelessly outnumbered by unserious ones. That if your team
- didn’t get more disciplined about what you allow in your codebase,
- you’d find yourself mired in a maze of complexity, beholden to epochal
- build times, and left holding the bag with yet another legacy system.
-
- Thinking about this point of tension as another manifestation of the
- generational shift we’re experiencing, it’s easy to spot the problem:
- “what you allow in your codebase” is a wee bit too easy to conflate
- with “who you allow in your codebase.”
-
- Shibboleths like “test-driven design” were so numerous that, to
- outsiders, even perfunctory conversations were riddled with rhetorical
- land mines. The emphasis on apprenticeship also carried assumptions
- nobody seriously grappled with: that it implied “one true path” to
- programming, that somebody (us) had uniquely figured it out, and that
- the only way to learn it was to imitate the people who came before you.
- I watched more than one conference talk advocating for
- professionalizing software like any other trade by licensing
- programmers just like we do plumbers, electricians, and [39]Canadian
- engineers. Everyone’s intention was to prevent people from writing bad
- software, but some of the movement’s prescriptions would have prevented
- many people from writing software at all.
-
-[40]10x Developers
-
- Before you say anything, I know [41]you [42]probably [43]already
- [44]have [45]an [46]opinion [47]on [48]the [49]idea of a “10x”
- developer. If you aren’t familiar, the term refers to
- debatably-mythical programmers whose output is worth that of ten other
- programmers. What aspects of that output? Which ten other programmers?
- Unclear.
-
- The concept behind the “10x” term predates either of the generations of
- programmers being discussed here. It seems to have originated in
- [50]this (flimsy) 1968 study that among experienced programmers, the
- best were ten times more productive than the worst (as opposed to the
- average). We remember it because it was referenced in the late Fred
- Brooks’ seminal [51]Mythical Man-Month.
-
- That some people are better at their jobs than others is (usually)
- uncontroversial. At least, it was, until it bubbled up in The Discourse
- during the 2010s as a flashpoint over who the industry chooses to
- valorize, often sparked by tweets from people affiliated with venture
- capital and advocating that founders should strive to “only hire 10x
- developers.”
-
- In response, many people who reasonably identified this framing as
- unproductive chose to pick a weird fight by claiming that 10x
- developers don’t exist instead. This invited a lot of
- counter-criticism, as I think most of us can dream up examples of
- people whose work is 1/10th as valuable as their own. From there, the
- conversation shifted to counter-counter-critiques enumerating the
- adverse knock-on effects of adding a toxic actor to a team, no matter
- how much of a ninja/rockstar they are at coding.
-
- And it was here that the conversation settled into a stalemate, with
- clear battle lines dividing the two camps. On one side were proponents
- who believed a lot of well-compensated programmers aren’t very good,
- but that a few programmers are so good that the value they generate far
- exceeds the range of a typical payscale (which was why Google used to
- brag that they “[52]pay unfairly”). On the other side were critics who
- were more than happy to project every negative stereotype about
- programmers onto these supposedly hyper-productive ones, suggesting a
- 10x developer’s easy-to-measure output often came with hard-to-measure
- organizational and technical costs.
-
- But now, looking back, this debate would have gone a lot differently if
- we’d considered it through the valence of inter-generational conflict.
-
- I’ll come clean: do I believe some programmers are at least an order of
- magnitude better at programming than others? In my experience … yes.
- I’ve worked with programmers who routinely solve problems in minutes
- after I’ve wasted days or weeks on them. I’ve witnessed a programmer
- singlehandedly build something in a day that an entire team struggled
- to deliver in two weeks—without any of the catastrophic antisocial,
- unsustainable downsides one might imagine. I’ve honestly seen more
- socially corrosive behavior from the other end of the productivity
- spectrum, because programmers who spin their wheels and make zero
- forward progress for days, weeks, or months will inevitably scramble
- for a way to save face.
-
- It may be uncomfortable to admit, but it’s not altogether unreasonable
- to speculate that enthusiast programmers may, in aggregate, outperform
- professional programmers who hang up their keyboard at the end of each
- shift. In my experience, these traits differentiate the former from the
- latter:
- * Tireless: spending more time practicing programming—not under
- coercion to work long hours, but being intrinsically motivated to
- do so—will generally make someone a better programmer
- * Tenacious: chasing down answers with limitless curiosity and
- relentless, no-holds-barred tenacity—whether or not it’s in their
- job description to spelunk open source stack traces or debug other
- teams’ code—will yield better information and faster progress
- * Thorough: priding oneself on the quality of one’s work and pursuing
- excellence in the (brace for it) craft—not falling victim to
- perfectionism, but cutting the right corners when necessary—will
- produce better-working software that’s easier to maintain
-
- In the context of this generational rift, all three of the above are
- exemplified by (but by no means exclusively limited to) us last-gen
- models: the individual that programs in their spare time, obsessively
- refuses to let a hard problem go, and is personally invested in the
- quality of their work product.
-
- I can’t imagine this dynamic feels awesome for members of the new
- generation who don’t want to spend more than 40 hours a week at their
- computer, or who have significant family commitments, or who aren’t
- inclined to asynchronously ponder refactoring techniques as they run
- errands. Will they be forever outpaced by more enthusiastic colleagues
- for whom “programmer” is an all-encompassing identity as well a career?
- I don’t know.
-
- It’s an uncomfortable conversation because it’s an uncomfortable
- reality.
-
-[53]What do we do with this?
-
- The power of an analogy lies in what it empowers people to do.
- Envisioning programmers as belonging to discrete generations who are
- ushering in a dramatic transition in the industry can equip us to
- identify the common threads between many of the challenges we’re
- currently facing. It may even enable us to predict and plan for
- inevitable difficulties in the future, as more members of the earlier
- generation age out.
-
- Suppose you’ve read this far and you can buy both these arguments:
- 1. The next generation of programmers are less likely to be motivated
- by a love of programming than the previous generation and may
- differ in profound ways as a result
- 2. Software, as an industry, has structurally organized itself around
- the assumption programmers will continue to resemble members of the
- outgoing generation
-
- If so, then you can probably imagine there will be a lot of problems to
- be solved here. The hot-button issues we revisited above are already
- known, even if we failed to put our collective finger on a common cause
- at the time. It’s likely that countless more challenges lie beneath the
- surface, waiting for the spark that causes them to boil over. It’s up
- to us whether we put in the work to uncover and address these problems
- proactively.
-
- Here are a few examples of questions I find myself asking after sitting
- with this for a few days:
- * The new generation is more likely to expect structure and support
- from human resources and management, whereas the previous
- generation is more likely to find active management (e.g. career
- pathing, coaching, goal-setting) actually saps their autonomy and
- intrinsic motivation. Can organizations effectively cater to the
- needs of both groups?
- * It’s an open secret that the industry has no idea how to teach
- people to program. Computer Science degrees famously don’t prepare
- programmers for the job of programming, which has always been left
- as an exercise to the student to figure out on their own time. If
- the industry is going to outlive us enthusiast programmers, will it
- adopt a sustainable approach to educating the next generation that
- doesn’t require people to teach themselves everything?
- * Betting your business on a limitless supply of self-starting,
- self-sufficient, self-disciplined candidates seems a lot like
- investing in the long-term prospects of fossil fuel extraction. How
- will companies that built their cultures around enthusiast
- programmers adjust to a generation needing more direction, more
- support, and more accountability?
-
- All we know for sure is that time keeps marching forward and change is
- a constant, so planning for a future that looks different than the past
- is usually time well spent.
-
- What challenges do you see in this generational transition? [54]Join
- the conversation on our N.E.A.T community
-
- Not a N.E.A.T. community member yet? [55]More info.
-
- If you enjoyed this piece and want to keep up with what myself and the
- other agents are up to, you should check out our [56]monthly
- newsletter.
-
-[57]Justin Searls
-
- An icon of a human figure Status
- Double Agent
-
- An icon of a hash sign Code Name
- Agent 002
-
- An icon of a map marker Location
- Orlando, FL
-
- [58]Twitter [59]Mastodon [60]Github [61]LinkedIn [62]Website
+An icon of a clock Publish Date
+ July 12, 2023
+An icon of a human figure Authors
+ [11]Justin Searls
+
+I’ve recently been telling anyone who will listen that I am excited to be on
+the precipice of using [12]Sorbet to write a type-checked edition of [13]
+Mocktail that has the potential to unlock productivity workflows never before
+possible in Ruby.
+
+I’m not there yet.
+
+I don’t want to say it’s been a “quagmire,” but I’m over [14]150 commits in,
+and there’s a lot left to button up before release. It’s been a real challenge.
+Learning Sorbet at all takes a good chunk of time, to be sure. I’ve also hit a
+number of thorny edge cases and elusive bugs along the way (both in the type
+system itself and that the type system exposed in my code). And, like usual,
+I’m trying to do something that’s never quite been done before, so I’m
+constantly oscillating between feelings of nervous excitement and fear that I’m
+attempting the impossible. (Though it’s been made far more possible thanks to
+the generous assistance of [15]Ufuk Kayserilioglu, [16]Kevin Newton, and [17]
+Jake Zimmerman!)
+
+Beyond this, any specifics I might share about my current quest are so banal as
+to not be worth your time. (If you somehow find this interesting, please [18]
+email me so I might feel less alone in this world.) That said, there is
+something generally interesting here that programmers don’t often talk about.
+And that’s the deeper question: why do I keep doing this to myself?
+
+[19]What makes me “special”
+
+I am an enthusiast programmer.
+
+I stumble on a problem like this one and I stay up late every night until I
+find the solution. I wake up early each morning with new ideas of things to
+try. I don’t take enough breaks, but when I do, they’re tactically-designed to
+exploit my brain’s asynchronous processor to generate solutions for whatever
+I’m currently stuck on. I irresponsibly defer responsibilities from other areas
+of my life. Eventually, I realize I’m only at the 20% mark and that a pattern
+is repeating where a month or more of my life is about to disappear from the
+calendar. Towards the end, I find myself rushing to find the maze’s exit
+because my desire to unlock the puzzle’s final secret starts to be overtaken by
+the shame of all the other balls I’m dropping. It’s excruciating as I approach
+that inflection point—as intense as an overbearing manager’s “do or die”
+deadlines ever were, except in this case the pressure I feel is entirely
+self-imposed.
+
+And then, at some uneventful moment at 4 pm on a Sunday, it’s done.
+
+Sometimes people care about what I made. Usually they don’t. Often, even I
+don’t.
+
+I give myself enough time to clear my inbox, tidy the house, and shave. Then I
+move onto the next Sisyphean task I’ve laid before myself.
+
+This describes how I’ve lived my life since I was 13 years old, with few
+exceptions. And let me tell you, it’s very difficult to juggle a healthy
+personal life and a sustainable work life when you’re simultaneously engulfed
+in an endless series of side quests to will every creative curiosity into
+existence.
+
+When I was a consultant at [20]Crowe, there was one year I billed clients for
+nearly 2100 hours, which averages out to more than 40 hours per week every week
+of the year with zero days off. And that’s not counting travel time. Or the
+half-dozen hours of weekly administrative work that wasn’t considered billable.
+Nevertheless, I found time in my nights and weekends that year to build an app
+with Apple’s buggy, mostly-undocumented initial iPhone SDK. The app was a
+native client to [21]vBulletin web forums, allowing users to browse threads and
+compose replies. Despite knowing nothing about any of the underlying
+technologies, I obsessively polished the app to perfection. Did I make time to
+sleep? I don’t remember. The whole year’s a blur.
+
+All so that Apple could reject my app because users might post swear words or
+dirty pictures. Oh, well. Onto the next thing.
+
+I don’t know what word best describes my behavior above without inflecting
+significant value judgment. Perfectionist? Obsessive? Passionate? Whatever we
+call this compulsion, it’s hardly an unalloyed good and it comes with its share
+of downsides. Nevertheless, it’s one of a number of idiosyncrasies and
+character flaws I’ve decided to lean into and find productive outlets for
+rather than attempting to repress or rewire.
+
+Other examples:
+
+ • I ruminate endlessly under stress, so I wrest back some control by
+ manufacturing stress responses over things I’m building to trick my brain
+ into ruminating on work that’s useful to me. This both overrides the
+ unhelpful, irrational worries that surround me every day and unlocks a
+ “second shift” where I accomplish almost as much away from the keyboard as
+ in front of it
+ • I’m a terrible listener and struggle with auditory processing, especially
+ in groups and loud environments. (One reason I talk so much is that it’s
+ always felt safer to drive the conversation than risk mishearing and
+ offending someone.) Parsing others’ sentences often feels like I’m filling
+ in the blanks to make sense of them, like playing a game of [22]Mad Libs.
+ Over the years, I’ve redirected this into a source of creativity and humor.
+ Most of my puns and wordplay are happy accidents as I fill in the gaps in
+ my own listening comprehension. Some of my most creative ideas are things I
+ swear I heard someone say when it turns out they were actually talking
+ about something else
+ • I’m a really bad learner—disinterested, distractible, and disagreeable.
+ I’ve never enjoyed learning and generally avoid it, especially learning for
+ its own sake. At the slightest discomfort when struggling to understand
+ something, I’ll grasp for any distraction that might offer me a momentary
+ escape. When I do manage to get traction, I inevitably find myself
+ disagreeing with the premise or subversively trying to prove the authors
+ wrong. The upshot is that once I actually do learn something, I know it
+ cold. It means I will have scoured every nook and climbed out of every
+ pitfall. Professionally, this apparent weakness has turned out to be a
+ superpower. Learning everything the hard way has made me a natural
+ consultant and mentor. Because I’ve already explored all the wrong paths, I
+ often know someone is stuck before they do, understand what threw them off
+ course, and show them how to get back on track
+
+The reason I landed on this topic today is not that any of the above makes me
+special, it’s actually that contradictions like these—whatever their origin—are
+so typical among programmers born before 1990 that they’re entirely mundane.
+
+[23]An aberrant generation of programmers
+
+Squint and everything I just said about myself could have described a character
+from [24]The Big Bang Theory or [25]Silicon Valley. I’m at peace with the fact
+that on my best days, I’m an overplayed, abrasive character trope come to life.
+For decades, we’ve associated a slew of mostly-negative traits like these with
+programmers as if the linkage is inherent and inevitable. I’ve always thought
+that stereotype was arbitrary—anybody can learn programming and be great at
+it—but now I’m starting to think it’s a product of our times as well.
+
+That is to say, I’ve come to believe the era typified by the enthusiast
+programmer—autodidactic, obsessive, and antisocial—is drawing to a close.
+
+Why do I think that? Because there was a specific, generational moment that
+attracted a bunch of people like me into the software industry. It occurred
+during the brief window between home computers becoming widely available and
+their becoming sealed airtight by platform holders. For a fleeting moment,
+computers were simultaneously accessible and scrutable during a necessary but
+temporary stage in the maturation of information technology. Before they were
+rendered irreducibly complex as consumer devices, merely using a computer
+required figuring out a lot about how it worked. And coming of age with an
+understanding how computers worked made programming them far more approachable.
+And thanks to cosmic coincidence and the marketing teams of companies like
+RadioShack, society unwittingly handed a generation of social mobility to [26]
+the boys of upper-middle-class families in the US who felt more comfortable at
+home with their computer than outside engaging socially with their peers. I was
+definitely one of those awkward, anxious kids and a whole lot of the
+programmers I’ve met along the way were too.
+
+But one reason to believe that programmers don’t have to be like this is that
+programmers weren’t always like this. I remember asking a computer science
+professor in 2003 about our school’s gender disparity (we only had a single
+woman in my class, and she later switched majors). He recounted that before
+1990 and the advent of hacker and gamer subcultures, my college touted robust
+majorities of women in computer science. (Nationally, women’s enrollment in CS
+doubled in a decade, [27]peaking at 37.1% nationally in 1984 before dropping
+precipitously.)
+
+And one reason to believe programmers won’t always be this way is that there’s
+plenty of evidence that the next generation of professional programmers is no
+longer dominated by enthusiasts. People becoming software developers today look
+markedly different than those who came before. (Sadly, I wish I could say I’m
+referring to the success of movements to increase representation from
+traditionally marginalized groups—tech is still dramatically over-indexed on
+white dudes who enjoyed affluent upbringings.) I’m just pointing to all the
+money sloshing around here: it catapulted programming from a firmly middle
+class job that appealed to people who really loved computers into a comfortably
+upper-middle class profession that attracts anyone who wants to secure their
+financial future. Ask anyone who switched careers in the last decade how many
+times someone suggested they “learn to code.” Countless people are entering the
+industry simply because programming is a relatively secure, well-paying
+profession. (And there’s nothing wrong with that!)
+
+[28]Inter-generational conflict is brewing
+
+I’m not sure if anyone has ever said “OK boomer” to my parents, but I can
+imagine it wouldn’t feel awesome to hear.
+
+Nor do I know whether anyone will coin a term to dismiss my generation, but I
+have faith that there’s enough societal exasperation out there for someone on
+TikTok to come up with something snappy. A lot of people in my professional
+cohort still see themselves as social outcasts who grew up in front of a CRT in
+their parents’ basements, but I suspect the next generation sees a homogenous
+monolith of 40-somethings wearing hoodies and sandals (with socks!) that lucked
+their way into capturing control of the software industry just as it settled
+into a state of economic maturity.
+
+Sit with this distinction for a while, and you might start to see these old-hat
+programmers as belonging to an Enthusiast Generation, one that—due to its
+unique initial circumstances—is unlikely to be replicated. Once I introduced
+the word “generation” to my thinking, it became easier to make sense of many
+contentious, unresolved issues in tech that flared up over the past decade by
+looking at them through the lens of intergenerational conflict. And just like
+any discussion of generations, it’s important to caveat that there are no firm
+boundary lines, that exceptions are plentiful, and that many observations will
+be isolated to a single locale and culture (the U.S. in this case, maybe
+Canada?). The only thing that bucketing people into generations can do for us
+is provide a new way to look at how a population may be changing, thanks to a
+big enough time-step to perceive the accumulation of decades of gradual change.
+
+To illustrate, I’ll highlight three high-profile conflicts that make a
+different kind of sense when viewed as a generational shift.
+
+[29]Passion
+
+I remember about 8 years ago, people [30]got [31]passionate [32]about [33]the
+[34]word [35]passion.
+
+This rubbed me the wrong way at first. Then again, everything does.
+
+I remember thinking, “banning the word ‘passion’ will just lead people to pick
+others like ‘self-driven’, ‘highly-motivated’, and ‘ambitious’.” I remember
+asking, “are we supposed to screen out candidates for whom programming is a
+hobby outside work?” What I don’t remember was pondering whether this was an
+indication that the times were changing.
+
+When I entered the industry, my salary was lower than it would’ve been if I’d
+gone into accounting, or become an actuary, or majored in civil
+engineering—myself and most of the people around me did get into software
+because we were passionate about it. Reading tweets and thinkpieces that
+suggested “passion” was a four-letter word felt like a personal affront, so I
+responded defensively.
+
+What I wasn’t thinking about was what it must have felt like for everyone who
+entered the industry expecting their job to be a job but who found themselves
+managed by people from my generation who didn’t leave them room to have a life
+outside work. Maybe everyone else on the team worked overtime without being
+asked. Maybe taking “too much” supposedly “unlimited” time off would foreclose
+any chance for a promotion. Maybe building rapport at lunch required holding
+evolved opinions on Emacs vs. Vim, or mechanical key switches, or whatever was
+on the front page of Hacker News. That sounds like a pretty miserable
+existence, especially if programming isn’t what gets you out of bed in the
+morning.
+
+If you allow for the possibility we’re undergoing a generational change, maybe
+this debate over “passion” is evidence that the assumption that most
+programmers will always be passionate about programming was mistaken and
+counter-productive.
+
+[36]Craftsmanship
+
+This brings another contentious word to mind: “craftsmanship.” Its origin, as I
+witnessed it, was a reaction to the watering down of the technical aspects of
+the agile software movement in the late 2000s in favor of more lucrative
+soft-skills training and consulting services. In case you missed it, most of
+the craftsmanship meme could be summed up as a Slow Code movement. There was a
+lot of talk about measuring twice and cutting once, establishing apprenticeship
+programs to train new programmers, and a million ways to leverage automated
+tests for purposes other than testing things.
+
+I was an active participant in this community, speaking at the [37]conference
+several times, putting [38]my name on the manifesto, and generally exhorting
+anyone who would listen to please make their software less terrible.
+
+But looking back, the craftsmanship movement wasn’t only about rekindling the
+tremendous engineering insights of agile methods like [39]Extreme Programming,
+it was also a response to a rapid influx of a generation of programmers who
+didn’t care about code quality the same way we did. There was a sense that
+serious programmers were under threat and hopelessly outnumbered by unserious
+ones. That if your team didn’t get more disciplined about what you allow in
+your codebase, you’d find yourself mired in a maze of complexity, beholden to
+epochal build times, and left holding the bag with yet another legacy system.
+
+Thinking about this point of tension as another manifestation of the
+generational shift we’re experiencing, it’s easy to spot the problem: “what you
+allow in your codebase” is a wee bit too easy to conflate with “who you allow
+in your codebase.”
+
+Shibboleths like “test-driven design” were so numerous that, to outsiders, even
+perfunctory conversations were riddled with rhetorical land mines. The emphasis
+on apprenticeship also carried assumptions nobody seriously grappled with: that
+it implied “one true path” to programming, that somebody (us) had uniquely
+figured it out, and that the only way to learn it was to imitate the people who
+came before you. I watched more than one conference talk advocating for
+professionalizing software like any other trade by licensing programmers just
+like we do plumbers, electricians, and [40]Canadian engineers. Everyone’s
+intention was to prevent people from writing bad software, but some of the
+movement’s prescriptions would have prevented many people from writing software
+at all.
+
+[41]10x Developers
+
+Before you say anything, I know [42]you [43]probably [44]already [45]have [46]
+an [47]opinion [48]on [49]the [50]idea of a “10x” developer. If you aren’t
+familiar, the term refers to debatably-mythical programmers whose output is
+worth that of ten other programmers. What aspects of that output? Which ten
+other programmers? Unclear.
+
+The concept behind the “10x” term predates either of the generations of
+programmers being discussed here. It seems to have originated in [51]this
+(flimsy) 1968 study that among experienced programmers, the best were ten times
+more productive than the worst (as opposed to the average). We remember it
+because it was referenced in the late Fred Brooks’ seminal [52]Mythical
+Man-Month.
+
+That some people are better at their jobs than others is (usually)
+uncontroversial. At least, it was, until it bubbled up in The Discourse during
+the 2010s as a flashpoint over who the industry chooses to valorize, often
+sparked by tweets from people affiliated with venture capital and advocating
+that founders should strive to “only hire 10x developers.”
+
+In response, many people who reasonably identified this framing as unproductive
+chose to pick a weird fight by claiming that 10x developers don’t exist
+instead. This invited a lot of counter-criticism, as I think most of us can
+dream up examples of people whose work is 1/10th as valuable as their own. From
+there, the conversation shifted to counter-counter-critiques enumerating the
+adverse knock-on effects of adding a toxic actor to a team, no matter how much
+of a ninja/rockstar they are at coding.
+
+And it was here that the conversation settled into a stalemate, with clear
+battle lines dividing the two camps. On one side were proponents who believed a
+lot of well-compensated programmers aren’t very good, but that a few
+programmers are so good that the value they generate far exceeds the range of a
+typical payscale (which was why Google used to brag that they “[53]pay unfairly
+”). On the other side were critics who were more than happy to project every
+negative stereotype about programmers onto these supposedly hyper-productive
+ones, suggesting a 10x developer’s easy-to-measure output often came with
+hard-to-measure organizational and technical costs.
+
+But now, looking back, this debate would have gone a lot differently if we’d
+considered it through the valence of inter-generational conflict.
+
+I’ll come clean: do I believe some programmers are at least an order of
+magnitude better at programming than others? In my experience … yes. I’ve
+worked with programmers who routinely solve problems in minutes after I’ve
+wasted days or weeks on them. I’ve witnessed a programmer singlehandedly build
+something in a day that an entire team struggled to deliver in two
+weeks—without any of the catastrophic antisocial, unsustainable downsides one
+might imagine. I’ve honestly seen more socially corrosive behavior from the
+other end of the productivity spectrum, because programmers who spin their
+wheels and make zero forward progress for days, weeks, or months will
+inevitably scramble for a way to save face.
+
+It may be uncomfortable to admit, but it’s not altogether unreasonable to
+speculate that enthusiast programmers may, in aggregate, outperform
+professional programmers who hang up their keyboard at the end of each shift.
+In my experience, these traits differentiate the former from the latter:
+
+ • Tireless: spending more time practicing programming—not under coercion to
+ work long hours, but being intrinsically motivated to do so—will generally
+ make someone a better programmer
+ • Tenacious: chasing down answers with limitless curiosity and relentless,
+ no-holds-barred tenacity—whether or not it’s in their job description to
+ spelunk open source stack traces or debug other teams’ code—will yield
+ better information and faster progress
+ • Thorough: priding oneself on the quality of one’s work and pursuing
+ excellence in the (brace for it) craft—not falling victim to perfectionism,
+ but cutting the right corners when necessary—will produce better-working
+ software that’s easier to maintain
+
+In the context of this generational rift, all three of the above are
+exemplified by (but by no means exclusively limited to) us last-gen models: the
+individual that programs in their spare time, obsessively refuses to let a hard
+problem go, and is personally invested in the quality of their work product.
+
+I can’t imagine this dynamic feels awesome for members of the new generation
+who don’t want to spend more than 40 hours a week at their computer, or who
+have significant family commitments, or who aren’t inclined to asynchronously
+ponder refactoring techniques as they run errands. Will they be forever
+outpaced by more enthusiastic colleagues for whom “programmer” is an
+all-encompassing identity as well a career? I don’t know.
+
+It’s an uncomfortable conversation because it’s an uncomfortable reality.
+
+[54]What do we do with this?
+
+The power of an analogy lies in what it empowers people to do. Envisioning
+programmers as belonging to discrete generations who are ushering in a dramatic
+transition in the industry can equip us to identify the common threads between
+many of the challenges we’re currently facing. It may even enable us to predict
+and plan for inevitable difficulties in the future, as more members of the
+earlier generation age out.
+
+Suppose you’ve read this far and you can buy both these arguments:
+
+ 1. The next generation of programmers are less likely to be motivated by a
+ love of programming than the previous generation and may differ in profound
+ ways as a result
+ 2. Software, as an industry, has structurally organized itself around the
+ assumption programmers will continue to resemble members of the outgoing
+ generation
+
+If so, then you can probably imagine there will be a lot of problems to be
+solved here. The hot-button issues we revisited above are already known, even
+if we failed to put our collective finger on a common cause at the time. It’s
+likely that countless more challenges lie beneath the surface, waiting for the
+spark that causes them to boil over. It’s up to us whether we put in the work
+to uncover and address these problems proactively.
+
+Here are a few examples of questions I find myself asking after sitting with
+this for a few days:
+
+ • The new generation is more likely to expect structure and support from
+ human resources and management, whereas the previous generation is more
+ likely to find active management (e.g. career pathing, coaching,
+ goal-setting) actually saps their autonomy and intrinsic motivation. Can
+ organizations effectively cater to the needs of both groups?
+ • It’s an open secret that the industry has no idea how to teach people to
+ program. Computer Science degrees famously don’t prepare programmers for
+ the job of programming, which has always been left as an exercise to the
+ student to figure out on their own time. If the industry is going to
+ outlive us enthusiast programmers, will it adopt a sustainable approach to
+ educating the next generation that doesn’t require people to teach
+ themselves everything?
+ • Betting your business on a limitless supply of self-starting,
+ self-sufficient, self-disciplined candidates seems a lot like investing in
+ the long-term prospects of fossil fuel extraction. How will companies that
+ built their cultures around enthusiast programmers adjust to a generation
+ needing more direction, more support, and more accountability?
+
+All we know for sure is that time keeps marching forward and change is a
+constant, so planning for a future that looks different than the past is
+usually time well spent.
+
+What challenges do you see in this generational transition? [55]Join the
+conversation on our N.E.A.T community
+
+Not a N.E.A.T. community member yet? [56]More info.
+
+If you enjoyed this piece and want to keep up with what myself and the other
+agents are up to, you should check out our [57]monthly newsletter.
+
+[002]
+
+[58] Justin Searls
+
+An icon of a human figure Status
+ Double Agent
+An icon of a hash sign Code Name
+ Agent 002
+An icon of a map marker Location
+ Orlando, FL
+
+[59] Twitter [60] Mastodon [61] Github [62] LinkedIn [63] Website
Related posts:
-[63]How to tell if AI threatens YOUR job
+[64] How to tell if AI threatens YOUR job
- Can ChatGPT help do your job? If so, how can you be sure AI won't
- eventually replace you? Spot whether your job is at risk and what you
- can do about it.
+Can ChatGPT help do your job? If so, how can you be sure AI won't eventually
+replace you? Spot whether your job is at risk and what you can do about it.
- An icon of a clock Publish Date
- March 14, 2023
+An icon of a clock Publish Date
+ March 14, 2023
+An icon of a human figure Authors
+ [65]Justin Searls
+An icon of a paper organzier Categories
+ [66]Industry
+ [67]Career
- An icon of a human figure Authors
- [64]Justin Searls
+[68] Never Staff to the Peak
- An icon of a paper organzier Categories
- [65]Industry
- [66]Career
+For a decade, engineering leaders were taught to solve every problem with more
+full-time hires. There was always a better solution. Are you ready for it?
-[67]Never Staff to the Peak
+An icon of a clock Publish Date
+ April 3, 2023
+An icon of a human figure Authors
+ [69]Justin Searls
+An icon of a paper organzier Categories
+ [70]Industry
+ [71]Leadership
- For a decade, engineering leaders were taught to solve every problem
- with more full-time hires. There was always a better solution. Are you
- ready for it?
+[72] How my experience as an engineer made me a better recruiter
- An icon of a clock Publish Date
- April 3, 2023
+How similar are engineers and recruiters? Turns out a lot. A developer turned
+recruiter adapted from writing code to recruit those who write code.
- An icon of a human figure Authors
- [68]Justin Searls
-
- An icon of a paper organzier Categories
- [69]Industry
- [70]Leadership
-
-[71]How my experience as an engineer made me a better recruiter
-
- How similar are engineers and recruiters? Turns out a lot. A developer
- turned recruiter adapted from writing code to recruit those who write
- code.
-
- An icon of a clock Publish Date
- March 20, 2023
-
- An icon of a human figure Authors
- [72]Colleen Leonard
-
- An icon of a paper organzier Categories
- [73]Recruitment
- [74]Community
+An icon of a clock Publish Date
+ March 20, 2023
+An icon of a human figure Authors
+ [73]Colleen Leonard
+An icon of a paper organzier Categories
+ [74]Recruitment
+ [75]Community
Looking for developers? Work with people who care about what you care about.
We level up teams striving to ship great code.
- [75]Let's talk
+[76] Let's talk
+[77]Home [78]Agency [79]Services [80]Careers [81]Blog [82]Contact
+[83] Mastodon [84] GitHub [85] LinkedIn [86] Twitter
- [76]Home [77]Agency [78]Services [79]Careers [80]Blog [81]Contact
+[87] 614.349.4279
+[88] hello@testdouble.com
+[89]Privacy Policy
+Founded in Columbus, OH
+
+[90] Test Double
- [82]Mastodon [83]GitHub [84]LinkedIn [85]Twitter
- [86]614.349.4279
- [87]hello@testdouble.com
- [88]Privacy Policy
- Founded in Columbus, OH
+References:
-[89]Test Double
-
-References
-
- 1. https://testdouble.com/
- 2. https://testdouble.com/
- 3. https://testdouble.com/agency
- 4. https://testdouble.com/services
- 5. https://testdouble.com/careers
- 6. https://blog.testdouble.com/
- 7. https://testdouble.com/contact
- 8. https://blog.testdouble.com/
- 9. https://blog.testdouble.com/posts/
- 10. https://blog.testdouble.com/authors/justin-searls/
- 11. https://sorbet.org/
- 12. https://github.com/testdouble/mocktail
- 13. https://github.com/testdouble/mocktail/pull/22
- 14. https://github.com/paracycle
- 15. https://github.com/kddnewton
- 16. https://github.com/jez
- 17. mailto:justin@testdouble.com
- 18. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#what-makes-me-special
- 19. https://www.crowe.com/
- 20. https://www.vbulletin.com/
- 21. https://en.wikipedia.org/wiki/Mad_Libs
- 22. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#an-aberrant-generation-of-programmers
- 23. https://en.wikipedia.org/wiki/The_Big_Bang_Theory
- 24. https://en.wikipedia.org/wiki/Silicon_Valley_(TV_series)
- 25. https://www.npr.org/transcripts/356944145
- 26. https://nces.ed.gov/programs/digest/d12/tables/dt12_349.asp
- 27. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#inter-generational-conflict-is-brewing
- 28. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#passion
- 29. https://starbreaker.org/blog/programmer-passion-considered-harmful/index.html
- 30. https://www.hotjar.com/blog/the-passion-fallacy/
- 31. https://web.archive.org/web/20160304021738/http://www.gamasutra.com/view/feature/6523/the_designers_notebook_passion_.php?print=1
- 32. https://avdi.codes/the-moderately-enthusiastic-programmer/
- 33. https://philippe.bourgau.net/is-there-any-room-for-the-not-passionate-developer/
- 34. https://exceptionnotfound.net/passion-not-required-its-ok-to-only-program-for-a-paycheck/
- 35. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#craftsmanship
- 36. https://scna.softwarecraftsmanship.org/
- 37. http://manifesto.softwarecraftsmanship.org/
- 38. https://en.wikipedia.org/wiki/Extreme_programming
- 39. https://engineerscanada.ca/become-an-engineer/overview-of-licensing-process
- 40. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#10x-developers
- 41. https://jasoncrawford.org/10x-engineers
- 42. https://web.archive.org/web/20131205042721/https://medium.com/about-work/6aedba30ecfe
- 43. https://networkingnerd.net/2019/07/18/i-was-a-10x-engineer-and-im-sorry/
- 44. https://www.swarmia.com/blog/busting-the-10x-software-engineer-myth/
- 45. https://erikbern.com/2016/01/08/i-believe-in-the-10x-engineer-but
- 46. https://a16z.com/2014/07/30/the-happy-demise-of-the-10x-engineer/
- 47. https://blog.kenforthewin.com/state-of-the-10x-programmer-in-2018/
- 48. https://web.archive.org/web/20230326131816/https://payne.org/blog/the-myth-of-the-myth-of-the-10x-programmer/
- 49. https://avichal.com/2011/12/16/focus-on-building-10x-teams-not-on-hiring-10x-developers/
- 50. https://dl.acm.org/doi/10.1145/362851.362858
- 51. https://en.wikipedia.org/wiki/The_Mythical_Man-Month
- 52. https://www.inc.com/jeff-haden/why-google-quietly-uses-power-law-rule-to-pay-its-superstar-employees-unfairly.html
- 53. https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#what-do-we-do-with-this
- 54. https://forum.neat.town/t/the-looming-demise-of-the-10x-developer/91
- 55. https://testdouble.com/neat
- 56. https://testdouble.com/newsletter
- 57. https://blog.testdouble.com/authors/justin-searls/
- 58. https://twitter.com/searls
- 59. https://mastodon.social/@searls
- 60. https://github.com/searls
- 61. https://linkedin.com/in/searls
- 62. https://justin.searls.co/
- 63. https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/
- 64. https://blog.testdouble.com/authors/justin-searls/
- 65. https://blog.testdouble.com/categories/industry
- 66. https://blog.testdouble.com/categories/career
- 67. https://blog.testdouble.com/posts/2023-04-03-never-staff-to-the-peak/
- 68. https://blog.testdouble.com/authors/justin-searls/
- 69. https://blog.testdouble.com/categories/industry
- 70. https://blog.testdouble.com/categories/leadership
- 71. https://blog.testdouble.com/posts/2023-03-20-how-my-experience-as-an-engineer-made-me-a-better-recruiter/
- 72. https://blog.testdouble.com/authors/colleen-leonard/
- 73. https://blog.testdouble.com/categories/recruitment
- 74. https://blog.testdouble.com/categories/community
- 75. https://link.testdouble.com/blog-cta-sales
- 76. https://testdouble.com/
- 77. https://testdouble.com/agency
- 78. https://testdouble.com/services
- 79. https://testdouble.com/careers
- 80. https://blog.testdouble.com/
- 81. https://testdouble.com/contact
- 82. https://mastodon.social/@testdouble
- 83. https://github.com/testdouble
- 84. https://www.linkedin.com/company/testdouble
- 85. https://twitter.com/testdouble
- 86. tel:+16143494279
- 87. mailto:hello@testdouble.com
- 88. https://testdouble.com/privacy-policy
- 89. https://testdouble.com/
+[1] https://testdouble.com/
+[3] https://testdouble.com/
+[4] https://testdouble.com/agency
+[5] https://testdouble.com/services
+[6] https://testdouble.com/careers
+[7] https://blog.testdouble.com/
+[8] https://testdouble.com/contact
+[9] https://blog.testdouble.com/
+[10] https://blog.testdouble.com/posts/
+[11] https://blog.testdouble.com/authors/justin-searls/
+[12] https://sorbet.org/
+[13] https://github.com/testdouble/mocktail
+[14] https://github.com/testdouble/mocktail/pull/22
+[15] https://github.com/paracycle
+[16] https://github.com/kddnewton
+[17] https://github.com/jez
+[18] mailto:justin@testdouble.com
+[19] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#what-makes-me-special
+[20] https://www.crowe.com/
+[21] https://www.vbulletin.com/
+[22] https://en.wikipedia.org/wiki/Mad_Libs
+[23] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#an-aberrant-generation-of-programmers
+[24] https://en.wikipedia.org/wiki/The_Big_Bang_Theory
+[25] https://en.wikipedia.org/wiki/Silicon_Valley_(TV_series)
+[26] https://www.npr.org/transcripts/356944145
+[27] https://nces.ed.gov/programs/digest/d12/tables/dt12_349.asp
+[28] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#inter-generational-conflict-is-brewing
+[29] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#passion
+[30] https://starbreaker.org/blog/programmer-passion-considered-harmful/index.html
+[31] https://www.hotjar.com/blog/the-passion-fallacy/
+[32] https://web.archive.org/web/20160304021738/http://www.gamasutra.com/view/feature/6523/the_designers_notebook_passion_.php?print=1
+[33] https://avdi.codes/the-moderately-enthusiastic-programmer/
+[34] https://philippe.bourgau.net/is-there-any-room-for-the-not-passionate-developer/
+[35] https://exceptionnotfound.net/passion-not-required-its-ok-to-only-program-for-a-paycheck/
+[36] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#craftsmanship
+[37] https://scna.softwarecraftsmanship.org/
+[38] http://manifesto.softwarecraftsmanship.org/
+[39] https://en.wikipedia.org/wiki/Extreme_programming
+[40] https://engineerscanada.ca/become-an-engineer/overview-of-licensing-process
+[41] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#10x-developers
+[42] https://jasoncrawford.org/10x-engineers
+[43] https://web.archive.org/web/20131205042721/https://medium.com/about-work/6aedba30ecfe
+[44] https://networkingnerd.net/2019/07/18/i-was-a-10x-engineer-and-im-sorry/
+[45] https://www.swarmia.com/blog/busting-the-10x-software-engineer-myth/
+[46] https://erikbern.com/2016/01/08/i-believe-in-the-10x-engineer-but
+[47] https://a16z.com/2014/07/30/the-happy-demise-of-the-10x-engineer/
+[48] https://blog.kenforthewin.com/state-of-the-10x-programmer-in-2018/
+[49] https://web.archive.org/web/20230326131816/https://payne.org/blog/the-myth-of-the-myth-of-the-10x-programmer/
+[50] https://avichal.com/2011/12/16/focus-on-building-10x-teams-not-on-hiring-10x-developers/
+[51] https://dl.acm.org/doi/10.1145/362851.362858
+[52] https://en.wikipedia.org/wiki/The_Mythical_Man-Month
+[53] https://www.inc.com/jeff-haden/why-google-quietly-uses-power-law-rule-to-pay-its-superstar-employees-unfairly.html
+[54] https://blog.testdouble.com/posts/2023-07-12-the-looming-demise-of-the-10x-developer/#what-do-we-do-with-this
+[55] https://forum.neat.town/t/the-looming-demise-of-the-10x-developer/91
+[56] https://testdouble.com/neat
+[57] https://testdouble.com/newsletter
+[58] https://blog.testdouble.com/authors/justin-searls/
+[59] https://twitter.com/searls
+[60] https://mastodon.social/@searls
+[61] https://github.com/searls
+[62] https://linkedin.com/in/searls
+[63] https://justin.searls.co/
+[64] https://blog.testdouble.com/posts/2023-03-14-how-to-tell-if-ai-threatens-your-job/
+[65] https://blog.testdouble.com/authors/justin-searls/
+[66] https://blog.testdouble.com/categories/industry
+[67] https://blog.testdouble.com/categories/career
+[68] https://blog.testdouble.com/posts/2023-04-03-never-staff-to-the-peak/
+[69] https://blog.testdouble.com/authors/justin-searls/
+[70] https://blog.testdouble.com/categories/industry
+[71] https://blog.testdouble.com/categories/leadership
+[72] https://blog.testdouble.com/posts/2023-03-20-how-my-experience-as-an-engineer-made-me-a-better-recruiter/
+[73] https://blog.testdouble.com/authors/colleen-leonard/
+[74] https://blog.testdouble.com/categories/recruitment
+[75] https://blog.testdouble.com/categories/community
+[76] https://link.testdouble.com/blog-cta-sales
+[77] https://testdouble.com/
+[78] https://testdouble.com/agency
+[79] https://testdouble.com/services
+[80] https://testdouble.com/careers
+[81] https://blog.testdouble.com/
+[82] https://testdouble.com/contact
+[83] https://mastodon.social/@testdouble
+[84] https://github.com/testdouble
+[85] https://www.linkedin.com/company/testdouble
+[86] https://twitter.com/testdouble
+[87] tel:+16143494279
+[88] mailto:hello@testdouble.com
+[89] https://testdouble.com/privacy-policy
+[90] https://testdouble.com/
diff --git a/static/archive/brainbaking-com-wbhgjj.txt b/static/archive/brainbaking-com-wbhgjj.txt
index ed7d9a9..5b2031f 100644
--- a/static/archive/brainbaking-com-wbhgjj.txt
+++ b/static/archive/brainbaking-com-wbhgjj.txt
@@ -1,217 +1,208 @@
- GoatCounter stats
+[test-img]
+[1]skip to main content
+[2]Brain Baking navigation toggle
- [1]skip to main content
+ • [4] Brain Baking
+ • [5] Archives
+ • [6] Subscribe
- [2]Brain Baking (BUTTON) navigation toggle
- * [3] Brain Baking
- * [4] Archives
- * [5] Subscribe
+ • [7] Works
+ • [8] About
+ • [9] Links
- * [6] Works
- * [7] About
- * [8] Links
+[10]
- Favorites of December 2023
+Favorites of December 2023
- [9]1 January 2024
+[11] 1 January 2024
- Happy New Year! Hopefully 2024 will bring the needed peace and solace
- to everyone. 2023 was a very difficult year for us, with lots of what
- you might call “low lows” and a few “high highs”. We usually make fun
- of that saying, but this seems like the first time it’s appropriate to
- use it.
+Happy New Year! Hopefully 2024 will bring the needed peace and solace to
+everyone. 2023 was a very difficult year for us, with lots of what you might
+call “low lows” and a few “high highs”. We usually make fun of that saying, but
+this seems like the first time it’s appropriate to use it.
- As far as blogging goes, 2023 was a great year. See the Brain Baking
- [10]blog post archive for 2023: with 90 posts last year, that’s on
- average 7.5 a month or 1.875 a week. The best part about 2023 in
- blogging was the feedback I got, and the new friends and e-mail pen
- pals I made. As frequently mentioned before, [11]blogging keeps on
- giving. If there’s one thing I never ever intend to give up, it’s
- blogging.
+As far as blogging goes, 2023 was a great year. See the Brain Baking [12]blog
+post archive for 2023: with 90 posts last year, that’s on average 7.5 a month
+or 1.875 a week. The best part about 2023 in blogging was the feedback I got,
+and the new friends and e-mail pen pals I made. As frequently mentioned before,
+[13]blogging keeps on giving. If there’s one thing I never ever intend to give
+up, it’s blogging.
- The following posts turned out to be the most popular of 2023:
- 1. [12]FPGAs And The Renaissance of Retro Hardware
- 2. [13]Overlooked Reasons To Still Buy Physical Media
- 3. [14]Goodbye, ProtonMail
- 4. [15]Phomemo Thermal Printing On MacOS
- 5. [16]DOOM Turned Thirty
+The following posts turned out to be the most popular of 2023:
- As for Jefklak’s Codex, the most popular article was the one on
- [17]Freaky Trip, a bizarre (and very buggy) single-screen
- adventure/puzzle game. That one got a few hits simply because I
- couldn’t find any reviews online myself! As far as visitor counts go,
- the Codex gets almost none, but I still have a lot of fun filling it.
- It’s my own thing, and I’ve pondered on that subject recently in [18]On
- Writing For Yourself In Public.
+ 1. [14]FPGAs And The Renaissance of Retro Hardware
+ 2. [15]Overlooked Reasons To Still Buy Physical Media
+ 3. [16]Goodbye, ProtonMail
+ 4. [17]Phomemo Thermal Printing On MacOS
+ 5. [18]DOOM Turned Thirty
- Previous month: [19]October 2023.
+As for Jefklak’s Codex, the most popular article was the one on [19]Freaky Trip
+, a bizarre (and very buggy) single-screen adventure/puzzle game. That one got
+a few hits simply because I couldn’t find any reviews online myself! As far as
+visitor counts go, the Codex gets almost none, but I still have a lot of fun
+filling it. It’s my own thing, and I’ve pondered on that subject recently in
+[20]On Writing For Yourself In Public.
+
+Previous month: [21]October 2023.
Books I’ve read
- Not much this month. Read my [20]2023 in books overview post to find
- out about the 22 books I managed to finish last year.
+Not much this month. Read my [22]2023 in books overview post to find out about
+the 22 books I managed to finish last year.
- The Malloreon chronicles by [21]David Eddings continues to be my go-to
- bed-time material. Books 1 and 2 are done and although the tension
- doesn’t exactly build up, I don’t mind to keep on reading as it’s a
- light read and entertaining enough.
+The Malloreon chronicles by [23]David Eddings continues to be my go-to bed-time
+material. Books 1 and 2 are done and although the tension doesn’t exactly build
+up, I don’t mind to keep on reading as it’s a light read and entertaining
+enough.
Games I’ve played
- After finishing Super Mario Bros. Wonder, I continued with the 2D Mario
- strike with the Mario Land Game Boy series that evolved into Wario Land
- and Wario Land II. The best is yet to come, though, as Wario Land 3 is
- on my [22]25 Best Games of All Time list! I know them all by heart but
- still breeze through these platformers once every few years.
+After finishing Super Mario Bros. Wonder, I continued with the 2D Mario strike
+with the Mario Land Game Boy series that evolved into Wario Land and Wario Land
+II. The best is yet to come, though, as Wario Land 3 is on my [24]25 Best Games
+of All Time list! I know them all by heart but still breeze through these
+platformers once every few years.
- My wife discovered a cheap Switch eShop code for Mario + Rabbids:
- Kingdom Battle and since I love tactical turn-based games, I eagerly
- dove in. It’s okay so far: the core gameplay is very solid, but
- everything slathered on top is not my cup of tea. I’m nearing the end
- and will have a review up shortly. Meanwhile, Kristien insists on
- playing [23]Railbound, a cosy railway puzzle game with sometimes
- devilishly difficult levels! Most of the time, I just don’t “see it”,
- but we’re having fun together nonetheless.
+My wife discovered a cheap Switch eShop code for Mario + Rabbids: Kingdom
+Battle and since I love tactical turn-based games, I eagerly dove in. It’s okay
+so far: the core gameplay is very solid, but everything slathered on top is not
+my cup of tea. I’m nearing the end and will have a review up shortly.
+Meanwhile, Kristien insists on playing [25]Railbound, a cosy railway puzzle
+game with sometimes devilishly difficult levels! Most of the time, I just don’t
+“see it”, but we’re having fun together nonetheless.
Selected (blog) posts
- * Gibru writes several interesting articles on AI and LLM generation,
- including [24]Contextualizing the Artistic Process.
- * Jonas Downey is convinced that having [25]side projects is
- essential for creatives, and I agree. This could grow into a
- powerful manifesto.
- * Cory Zue provides an overview on his side projects and why
- [26]building publicly in private works for him.
- * Keith McNulty explains why [27]the MBTI tests are corporate
- astrology (Medum link).
- * Michael Klamerus explains his process on [28]finding small indie
- games.
- * This sobering article at Eurogamer reminds us that in the video
- game industry, 2023 was also the year of low lows and high highs:
- [29]You Can’t Talk About Games Without Talking About The Layoffs.
- * Glyph explains how to set up the best possible [30]Phython
- development environment for MacOS. Don’t use brew install like I
- did.
- * Speaking of Python, [31]why is Python so slow? Jake VanderPlas
- deciphers the Python internals to figure out why.
- * Vlad-Stefan Harbuz’s blog is great: it’s a combination between
- computing and philosophical work. Here’s his [32]overview on
- resources on the philosophy of work I still have to dig into.
- * Here’s an interesting piece on [33]Mickey Mouse and the Public
- Domain. As of today, one of the earliest versions of Mickey hits
- public domain in USA.
- * [34]You Don’t Need Statistics On Your Blog says William Woodruff.
- Perhaps I should take on the challenge and ditch GoatCounter in
- favor of a few grep scripts in access logs, if that?
+ • Gibru writes several interesting articles on AI and LLM generation,
+ including [26]Contextualizing the Artistic Process.
+ • Jonas Downey is convinced that having [27]side projects is essential for
+ creatives, and I agree. This could grow into a powerful manifesto.
+ • Cory Zue provides an overview on his side projects and why [28]building
+ publicly in private works for him.
+ • Keith McNulty explains why [29]the MBTI tests are corporate astrology
+ (Medum link).
+ • Michael Klamerus explains his process on [30]finding small indie games.
+ • This sobering article at Eurogamer reminds us that in the video game
+ industry, 2023 was also the year of low lows and high highs: [31]You Can’t
+ Talk About Games Without Talking About The Layoffs.
+ • Glyph explains how to set up the best possible [32]Phython development
+ environment for MacOS. Don’t use brew install like I did.
+ • Speaking of Python, [33]why is Python so slow? Jake VanderPlas deciphers
+ the Python internals to figure out why.
+ • Vlad-Stefan Harbuz’s blog is great: it’s a combination between computing
+ and philosophical work. Here’s his [34]overview on resources on the
+ philosophy of work I still have to dig into.
+ • Here’s an interesting piece on [35]Mickey Mouse and the Public Domain. As
+ of today, one of the earliest versions of Mickey hits public domain in USA.
+ • [36]You Don’t Need Statistics On Your Blog says William Woodruff. Perhaps I
+ should take on the challenge and ditch GoatCounter in favor of a few grep
+ scripts in access logs, if that?
Other random links
- * [35]Déjà Dup Backups is a Gnome-powered UI-friendly backup tool for
- Unix.
- * Did you know you can [36]Scheme in Scheme on WASM in the browser?
- wait what now? The Spritely Institute also has cool info on Lisp
- hackatons if that’s your jam.
- * If you want to follow physical video game releases, look no further
- than [37]https://www.physicalreleases.com/
- * The [38]Into The Aether Podcast released a six-hour long episode on
- the 2023 Game of the Year. It’s great, but I have been slogging
- through it on and off all week and I’m still just over 03:21:00
- hours/minutes in! Who decided that three-plus hours of jabbering
- about video games is a good thing? Because it totally is!
+ • [37]Déjà Dup Backups is a Gnome-powered UI-friendly backup tool for Unix.
+ • Did you know you can [38]Scheme in Scheme on WASM in the browser? wait what
+ now? The Spritely Institute also has cool info on Lisp hackatons if that’s
+ your jam.
+ • If you want to follow physical video game releases, look no further than
+ [39]https://www.physicalreleases.com/
+ • The [40]Into The Aether Podcast released a six-hour long episode on the
+ 2023 Game of the Year. It’s great, but I have been slogging through it on
+ and off all week and I’m still just over 03:21:00 hours/minutes in! Who
+ decided that three-plus hours of jabbering about video games is a good
+ thing? Because it totally is!
- I hope to keep up the blogging rhythm in 2024. That’s everything I wish
- for in 2024 besides the obvious ones.
+I hope to keep up the blogging rhythm in 2024. That’s everything I wish for in
+2024 besides the obvious ones.
- [39]metapost
+[41]metapost
-You Might Also Like...
+[42] You Might Also Like...
- * [40]2023 In Books 28 Dec 2023
- * [41]DOOM Turned Thirty 11 Dec 2023
- * [42]FPGAs And The Renaissance Of Retro Hardware 27 Nov 2023
- * [43]On Writing For Yourself In Public 06 Nov 2023
- * [44]Favorites of October 2023 02 Nov 2023
- * [45]Top 25 Best Games Of All Time (GOAT) 08 Oct 2023
- * [46]Overlooked Reasons To Still Buy Physical Media 25 Sep 2023
+ • [43]2023 In Books 28 Dec 2023
+ • [44]DOOM Turned Thirty 11 Dec 2023
+ • [45]FPGAs And The Renaissance Of Retro Hardware 27 Nov 2023
+ • [46]On Writing For Yourself In Public 06 Nov 2023
+ • [47]Favorites of October 2023 02 Nov 2023
+ • [48]Top 25 Best Games Of All Time (GOAT) 08 Oct 2023
+ • [49]Overlooked Reasons To Still Buy Physical Media 25 Sep 2023
-Bio and Support
+[50] Bio and Support
- [47]A photo of Me!
+[51] A photo of Me!
- I'm [48]Wouter Groeneveld, a Brain Baker, and I love the smell of
- freshly baked thoughts (and bread) in the morning. I sometimes convince
- others to bake their brain (and bread) too.
+I'm [52]Wouter Groeneveld, a Brain Baker, and I love the smell of freshly baked
+thoughts (and bread) in the morning. I sometimes convince others to bake their
+brain (and bread) too.
- If you found this article amusing and/or helpful, you can support me
- via [49]PayPal or [50]Ko-Fi. I also like to hear your feedback via
- [51]Mastodon or email. Thanks!
- JavaScript is disabled. I use it to obfuscate my e-mail, keeping
- spambots at bay.
- Reach me using: [firstname] at [this domain].
+If you found this article amusing and/or helpful, you can support me via [53]
+PayPal or [54]Ko-Fi. I also like to hear your feedback via [55]Mastodon or
+email. Thanks!
- ↑ [52]Top
- [53]Brain Baking | [54]Archives | [55]© CC BY 4.0 License.
+JavaScript is disabled. I use it to obfuscate my e-mail, keeping spambots at
+bay.
+Reach me using: [firstname] at [this domain].
-References
+↑ [56]Top [57]Brain Baking | [58]Archives | [59]© CC BY 4.0 License.
- Visible links:
- 1. https://brainbaking.com/post/2024/01/december-2023/#top
- 2. https://brainbaking.com/post/2024/01/december-2023/
- 3. https://brainbaking.com/
- 4. https://brainbaking.com/archives
- 5. https://brainbaking.com/subscribe
- 6. https://brainbaking.com/works
- 7. https://brainbaking.com/about
- 8. https://brainbaking.com/links
- 9. https://brainbaking.com/post/2024/01/december-2023/
- 10. https://brainbaking.com/post/2023/
- 11. https://brainbaking.com/post/2021/10/a-triumph-for-blogging/
- 12. https://brainbaking.com/post/2023/11/fpgas-and-the-renaissance-of-retro-hardware/
- 13. https://brainbaking.com/post/2023/09/overlooked-reasons-to-still-buy-physical-media/
- 14. https://brainbaking.com/post/2023/01/goodbye-protonmail/
- 15. https://brainbaking.com/post/2023/02/phomemo-thermal-printing-on-macos/
- 16. https://brainbaking.com/post/2023/12/doom-turned-thirty/
- 17. https://jefklakscodex.com/games/switch/freaky-trip/
- 18. https://brainbaking.com/post/2023/11/on-writing-for-yourself-in-public/
- 19. https://brainbaking.com/post/2023/11/october-2023
- 20. https://brainbaking.com/post/2023/12/2023-in-books
- 21. https://www.eddingschronicles.com/index.html
- 22. https://brainbaking.com/post/2023/10/top-25-best-games-of-all-time
- 23. https://store.steampowered.com/app/1967510/Railbound/
- 24. https://elusivewordsmith.com/posts/Playground/contextualizing/
- 25. https://jonas.do/writing/2023-10-05-side-projects/
- 26. https://www.coryzue.com/writing/building-in-private/
- 27. https://medium.com/swlh/the-mbti-is-corporate-astrology-c132d93e684f
- 28. https://virtualmoose.org/2023/12/13/finding-indie-games/
- 29. https://www.eurogamer.net/you-cant-talk-about-2023-in-games-without-talking-about-layoffs
- 30. https://blog.glyph.im/2023/08/get-your-mac-python-from-python-dot-org.html
- 31. http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/
- 32. https://vladh.net/wage-labour-resources/
- 33. https://web.law.duke.edu/cspd/mickey/
- 34. https://blog.yossarian.net/2023/12/24/You-dont-need-analytics-on-your-blog
- 35. https://apps.gnome.org/en-GB/DejaDup/
- 36. https://spritely.institute/news/scheme-in-scheme-on-wasm-in-the-browser.html
- 37. https://www.physicalreleases.com/
- 38. https://intothecast.online/
- 39. https://brainbaking.com/tags/metapost
- 40. https://brainbaking.com/post/2023/12/2023-in-books/
- 41. https://brainbaking.com/post/2023/12/doom-turned-thirty/
- 42. https://brainbaking.com/post/2023/11/fpgas-and-the-renaissance-of-retro-hardware/
- 43. https://brainbaking.com/post/2023/11/on-writing-for-yourself-in-public/
- 44. https://brainbaking.com/post/2023/11/october-2023/
- 45. https://brainbaking.com/post/2023/10/top-25-best-games-of-all-time/
- 46. https://brainbaking.com/post/2023/09/overlooked-reasons-to-still-buy-physical-media/
- 47. https://brainbaking.com/
- 48. https://brainbaking.com/about
- 49. https://www.paypal.com/donate/?hosted_button_id=R2WTKY7G9V2KQ
- 50. https://ko-fi.com/woutergroeneveld
- 51. https://dosgame.club/@jefklak
- 52. https://brainbaking.com/post/2024/01/december-2023/#header
- 53. https://brainbaking.com/
- 54. https://brainbaking.com/archives
- 55. https://brainbaking.com/copyright-and-tracking-policy
- Hidden links:
- 57. https://brainbaking.com/
- 58. https://brainbaking.com/post/2024/01/december-2023/#related
- 59. https://brainbaking.com/post/2024/01/december-2023/#bio
+References:
+
+[1] https://brainbaking.com/post/2024/01/december-2023/#top
+[2] https://brainbaking.com/post/2024/01/december-2023/#
+[4] https://brainbaking.com/
+[5] https://brainbaking.com/archives
+[6] https://brainbaking.com/subscribe
+[7] https://brainbaking.com/works
+[8] https://brainbaking.com/about
+[9] https://brainbaking.com/links
+[10] https://brainbaking.com/
+[11] https://brainbaking.com/post/2024/01/december-2023/
+[12] https://brainbaking.com/post/2023/
+[13] https://brainbaking.com/post/2021/10/a-triumph-for-blogging/
+[14] https://brainbaking.com/post/2023/11/fpgas-and-the-renaissance-of-retro-hardware/
+[15] https://brainbaking.com/post/2023/09/overlooked-reasons-to-still-buy-physical-media/
+[16] https://brainbaking.com/post/2023/01/goodbye-protonmail/
+[17] https://brainbaking.com/post/2023/02/phomemo-thermal-printing-on-macos/
+[18] https://brainbaking.com/post/2023/12/doom-turned-thirty/
+[19] https://jefklakscodex.com/games/switch/freaky-trip/
+[20] https://brainbaking.com/post/2023/11/on-writing-for-yourself-in-public/
+[21] https://brainbaking.com/post/2023/11/october-2023
+[22] https://brainbaking.com/post/2023/12/2023-in-books
+[23] https://www.eddingschronicles.com/index.html
+[24] https://brainbaking.com/post/2023/10/top-25-best-games-of-all-time
+[25] https://store.steampowered.com/app/1967510/Railbound/
+[26] https://elusivewordsmith.com/posts/Playground/contextualizing/
+[27] https://jonas.do/writing/2023-10-05-side-projects/
+[28] https://www.coryzue.com/writing/building-in-private/
+[29] https://medium.com/swlh/the-mbti-is-corporate-astrology-c132d93e684f
+[30] https://virtualmoose.org/2023/12/13/finding-indie-games/
+[31] https://www.eurogamer.net/you-cant-talk-about-2023-in-games-without-talking-about-layoffs
+[32] https://blog.glyph.im/2023/08/get-your-mac-python-from-python-dot-org.html
+[33] http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/
+[34] https://vladh.net/wage-labour-resources/
+[35] https://web.law.duke.edu/cspd/mickey/
+[36] https://blog.yossarian.net/2023/12/24/You-dont-need-analytics-on-your-blog
+[37] https://apps.gnome.org/en-GB/DejaDup/
+[38] https://spritely.institute/news/scheme-in-scheme-on-wasm-in-the-browser.html
+[39] https://www.physicalreleases.com/
+[40] https://intothecast.online/
+[41] https://brainbaking.com/tags/metapost
+[42] https://brainbaking.com/post/2024/01/december-2023/#related
+[43] https://brainbaking.com/post/2023/12/2023-in-books/
+[44] https://brainbaking.com/post/2023/12/doom-turned-thirty/
+[45] https://brainbaking.com/post/2023/11/fpgas-and-the-renaissance-of-retro-hardware/
+[46] https://brainbaking.com/post/2023/11/on-writing-for-yourself-in-public/
+[47] https://brainbaking.com/post/2023/11/october-2023/
+[48] https://brainbaking.com/post/2023/10/top-25-best-games-of-all-time/
+[49] https://brainbaking.com/post/2023/09/overlooked-reasons-to-still-buy-physical-media/
+[50] https://brainbaking.com/post/2024/01/december-2023/#bio
+[51] https://brainbaking.com/
+[52] https://brainbaking.com/about
+[53] https://www.paypal.com/donate/?hosted_button_id=R2WTKY7G9V2KQ
+[54] https://ko-fi.com/woutergroeneveld
+[55] https://dosgame.club/@jefklak
+[56] https://brainbaking.com/post/2024/01/december-2023/#header
+[57] https://brainbaking.com/
+[58] https://brainbaking.com/archives
+[59] https://brainbaking.com/copyright-and-tracking-policy
diff --git a/static/archive/calnewport-com-jtszvi.txt b/static/archive/calnewport-com-jtszvi.txt
index cce1291..16d163c 100644
--- a/static/archive/calnewport-com-jtszvi.txt
+++ b/static/archive/calnewport-com-jtszvi.txt
@@ -1,393 +1,380 @@
- #[1]Cal Newport » Feed [2]Cal Newport » Comments Feed [3]Cal Newport »
- On Tools and the Aesthetics of Work Comments Feed [4]alternate
- [5]alternate [6]alternate
+[1]Skip to content
+[2] Cal Newport
+Menu
+[4] Cal Newport
+Menu
- IFRAME: [7]https://www.googletagmanager.com/ns.html?id=GTM-W6XZ4TH
+ • [6]Home
+ • [7]Scholarship
+ • [8]Writing
+ • [9]Essays
+ • [10]Press
+ • [11]Contact
- [8]Skip to content
-
- [9]Cal Newport
-
- (BUTTON) Menu
-
- [10]Cal Newport
- (BUTTON) Menu
- * [11]Home
- * [12]Scholarship
- * [13]Writing
- * [14]Essays
- * [15]Press
- * [16]Contact
-
- [17]Home » [18]Blog » On Tools and the Aesthetics of Work
+[12]Home » [13]Blog » On Tools and the Aesthetics of Work
On Tools and the Aesthetics of Work
- September 4, 2023
+September 4, 2023
+[mythic-640px]
- In the summer of 2022, an engineer named Keegan McNamara, who was at
- the time working for a fundraising technology startup, found his way to
- the [19]Arms and Armor exhibit at the Met. He was struck by the
- unapologetic mixture of extreme beauty and focused function captured in
- the antique firearms on display. As reported in [20]a recent profile of
- McNamara published in The Verge, this encounter with the past sparked a
- realization about the present:
+In the summer of 2022, an engineer named Keegan McNamara, who was at the time
+working for a fundraising technology startup, found his way to the [14]Arms and
+Armor exhibit at the Met. He was struck by the unapologetic mixture of extreme
+beauty and focused function captured in the antique firearms on display. As
+reported in [15]a recent profile of McNamara published in The Verge, this
+encounter with the past sparked a realization about the present:
- “That combination of craftsmanship and utility, objects that are
- both thoroughly practical and needlessly outrageously beautiful,
- doesn’t really exist anymore. ‘And it especially doesn’t exist for
- computers.'”
+ “That combination of craftsmanship and utility, objects that are both
+ thoroughly practical and needlessly outrageously beautiful, doesn’t really
+ exist anymore. ‘And it especially doesn’t exist for computers.'”
- Aesthetically, contemporary digitals devices have become industrial and
- impersonal: grey and black rectangles carved into generically-modern
- clean lines . Functionally, they offer the hapless user a cluttered
- explosion of potential activity, windows piling on top of windows,
- command bars thick with applications. Standing in the Arms and Armor
- exhibit McNamara began to wonder if there was a way to rethink the PC;
- to save it from a predictable maximalism.
+Aesthetically, contemporary digitals devices have become industrial and
+impersonal: grey and black rectangles carved into generically-modern clean
+lines . Functionally, they offer the hapless user a cluttered explosion of
+potential activity, windows piling on top of windows, command bars thick with
+applications. Standing in the Arms and Armor exhibit McNamara began to wonder
+if there was a way to rethink the PC; to save it from a predictable maximalism.
- The result was [21]The Mythic I, a custom computer that McNamara
- handcrafted over the year or so that followed that momentous afternoon
- at the Met. The machine is housed in a swooping hardwood frame carved
- using manual tools. An eight-inch screen is mounted above a 1980’s
- IBM-style keyboard with big clacking keys that McNamara carefully
- lubricated to achieve exactly the right sound on each strike: “if you
- have dry rubbing of plastic, it doesn’t sound thock-y. It just sounds
- cheap.” Below the keyboard is an Italian leather hand rest. To turn it
- on you insert and turn a key and then flip a toggle switch.
+The result was [16]The Mythic I, a custom computer that McNamara handcrafted
+over the year or so that followed that momentous afternoon at the Met. The
+machine is housed in a swooping hardwood frame carved using manual tools. An
+eight-inch screen is mounted above a 1980’s IBM-style keyboard with big
+clacking keys that McNamara carefully lubricated to achieve exactly the right
+sound on each strike: “if you have dry rubbing of plastic, it doesn’t sound
+thock-y. It just sounds cheap.” Below the keyboard is an Italian leather hand
+rest. To turn it on you insert and turn a key and then flip a toggle switch.
- Equally notable is what happens once the machine is activated. McNamara
- designed the Mythic for three specific purposes: writing a novel,
- writing occasional computer code, and writing his daily journal.
- Accordingly, it runs a highly-modular version of Linux called NixOS
- that he’s customized to only offer emacs, a text-based editor popular
- among hacker types, that’s launched from a basic green command line.
- You can’t go online, or create a PowerPoint presentation, or edit a
- video. It’s a writing a machine, and like the antique arms that
- inspired it, the Mythic implements this functionality with a focused,
- beautiful utilitarianism.
+Equally notable is what happens once the machine is activated. McNamara
+designed the Mythic for three specific purposes: writing a novel, writing
+occasional computer code, and writing his daily journal. Accordingly, it runs a
+highly-modular version of Linux called NixOS that he’s customized to only offer
+emacs, a text-based editor popular among hacker types, that’s launched from a
+basic green command line. You can’t go online, or create a PowerPoint
+presentation, or edit a video. It’s a writing a machine, and like the antique
+arms that inspired it, the Mythic implements this functionality with a focused,
+beautiful utilitarianism.
- In his critical classic, [22]Amusing Ourselves to Death, Neil Postman
- argued that the form taken by the technologies we use impacts the
- fundamental nature of our cognition. When we switched media consumption
- from long newspaper articles to television soundbites, for example, our
- understanding of news lost its heft and became more superficial and
- emotionally-charged.
+In his critical classic, [17]Amusing Ourselves to Death, Neil Postman argued
+that the form taken by the technologies we use impacts the fundamental nature
+of our cognition. When we switched media consumption from long newspaper
+articles to television soundbites, for example, our understanding of news lost
+its heft and became more superficial and emotionally-charged.
- When pondering Keegan McNamara and the Mythic, I can’t help but apply
- Postman’s framework to the machines that organize our professional
- activities. The modern computer, with its generic styling and
- overloaded activity, creates a cognitive environment defined by urgent,
- bland, Sisyphean widget cranking — work as endless Slack and email and
- Zoom and “jumping on” calls, in which there is always too much to do,
- but no real sense of much of importance actually being accomplished.
+When pondering Keegan McNamara and the Mythic, I can’t help but apply Postman’s
+framework to the machines that organize our professional activities. The modern
+computer, with its generic styling and overloaded activity, creates a cognitive
+environment defined by urgent, bland, Sisyphean widget cranking — work as
+endless Slack and email and Zoom and “jumping on” calls, in which there is
+always too much to do, but no real sense of much of importance actually being
+accomplished.
- In Keegan’s construction we find an alternative understanding of work,
- built now on beauty, craftsmanship, and focus. Replacing everyone’s
- MacBook with custom-carved hardwood, of course, is not enough on its
- own to transform how we think about out jobs, [23]as these issues have
- deeper roots. But the Mythic is a useful reminder that the rhythms of
- our professional lives are not pre-ordained. We craft the world in
- which we work, even if we don’t realize it.
+In Keegan’s construction we find an alternative understanding of work, built
+now on beauty, craftsmanship, and focus. Replacing everyone’s MacBook with
+custom-carved hardwood, of course, is not enough on its own to transform how we
+think about out jobs, [18]as these issues have deeper roots. But the Mythic is
+a useful reminder that the rhythms of our professional lives are not
+pre-ordained. We craft the world in which we work, even if we don’t realize it.
- #####
+#####
- In other news: My longtime friend Brad Stulberg has a great new book
- out this week. It’s called, [24]Master of Change: How to Excel When
- Everything is Changing — Including You. In my cover blurb, I noted that
- this “immensely wise and timely book provides a roadmap for a
- tumultuous world.” I really mean it! The idea of preparing yourself to
- thrive, and not crumble, when faced with inevitable change is
- self-evidently important, and Brad does a great job of delivering the
- goods on this timely theme.
+In other news: My longtime friend Brad Stulberg has a great new book out this
+week. It’s called, [19]Master of Change: How to Excel When Everything is
+Changing — Including You. In my cover blurb, I noted that this “immensely wise
+and timely book provides a roadmap for a tumultuous world.” I really mean it!
+The idea of preparing yourself to thrive, and not crumble, when faced with
+inevitable change is self-evidently important, and Brad does a great job of
+delivering the goods on this timely theme.
- Pro-tip: if you do buy the book this week, [25]go to Brad’s website to
- claim a bunch of cool pre-order bonuses that he’s offering through the
- first full week of publication.
+Pro-tip: if you do buy the book this week, [20]go to Brad’s website to claim a
+bunch of cool pre-order bonuses that he’s offering through the first full week
+of publication.
- [26]We Don’t Need a New Twitter
- [27]On Tire Pressure and Productivity
+[21]We Don’t Need a New Twitter
+[22]On Tire Pressure and Productivity
11 thoughts on “On Tools and the Aesthetics of Work”
- 1.
- Galia
- [28]September 4, 2023 at 9:27 am
- Too much information when few things matter: that reminds me of the
- book Essentialism. Acting like those everyday stimuli don’t exist
- is the first recipe for success.
- [29]Reply
- 2.
- Alexander Lewis
- [30]September 4, 2023 at 11:57 am
- I love the idea here. People still use old typewriters as art
- pieces and coffee table decor in their homes. It’s hard to imagine
- something similar occuring with modern computers. Laptops are used
- until they’re dead, and then they’re recycled or thrown into the
- junk drawer.
- I think this craftsman/engineer might be onto something.
- [31]Reply
- 3.
- Rafa Font
- [32]September 4, 2023 at 3:22 pm
- They have become Swiss knives, tools for all. Especially mobile
- phones, they’re maps, navigators, radio, compass, torch, voice
- recorder, word processor… all in one.
- I gave my kids a voice recorder the other day. So that they can
- have a one-action device to play with and understand what it is, on
- its own.
- [33]Reply
- +
+ 1. [aac40]
+ Galia
+ [23] September 4, 2023 at 9:27 am
+
+ Too much information when few things matter: that reminds me of the book
+ Essentialism. Acting like those everyday stimuli don’t exist is the first
+ recipe for success.
+
+ [24]Reply
+ 2. [8b32b]
+ Alexander Lewis
+ [25] September 4, 2023 at 11:57 am
+
+ I love the idea here. People still use old typewriters as art pieces and
+ coffee table decor in their homes. It’s hard to imagine something similar
+ occuring with modern computers. Laptops are used until they’re dead, and
+ then they’re recycled or thrown into the junk drawer.
+
+ I think this craftsman/engineer might be onto something.
+
+ [26]Reply
+ 3. [d7ec0]
+ Rafa Font
+ [27] September 4, 2023 at 3:22 pm
+
+ They have become Swiss knives, tools for all. Especially mobile phones,
+ they’re maps, navigators, radio, compass, torch, voice recorder, word
+ processor… all in one.
+
+ I gave my kids a voice recorder the other day. So that they can have a
+ one-action device to play with and understand what it is, on its own.
+
+ [28]Reply
+ □ [92093]
Tim Koerner
- [34]September 11, 2023 at 3:27 pm
- Love the voice recorder idea for kids, well done.
- [35]Reply
- 4.
- Alex Francisco
- [36]September 4, 2023 at 8:04 pm
- What a find!
- My copies of ‘Understanding Media: The Extensions of Man’ –
- McLuhan,
- the Medium is the Massage are always in my mind.
- A good summary is that one line by Culkin in an article about
- McLuhan:
- “We become what we behold. We shape our tools, and thereafter our
- tools shape us.”
- Timeless, humbling AND empowering at once.
- [37]Reply
- +
+ [29] September 11, 2023 at 3:27 pm
+
+ Love the voice recorder idea for kids, well done.
+
+ [30]Reply
+ 4. [2e0eb]
+ Alex Francisco
+ [31] September 4, 2023 at 8:04 pm
+
+ What a find!
+
+ My copies of ‘Understanding Media: The Extensions of Man’ – McLuhan,
+ the Medium is the Massage are always in my mind.
+
+ A good summary is that one line by Culkin in an article about McLuhan:
+ “We become what we behold. We shape our tools, and thereafter our tools
+ shape us.”
+
+ Timeless, humbling AND empowering at once.
+
+ [32]Reply
+ □ [2a88f]
Jonathan
- [38]November 11, 2023 at 6:47 pm
- That quote it itself based on one by Winston Churchill to the
- UK Parliament in 1943: “We shape our buildings, and afterwards
- our buildings shape us.” Churchill was referring to the
- reconstruction of the bombed House of Commons, emphasizing how
- the design of buildings influences the behavior and culture of
- the people who use them.
- [39]Reply
- 5.
- rb
- [40]September 4, 2023 at 9:47 pm
- WordStar was more fun than WordPerfect, which was quite a bit more
- fun than Microsoft Word. There has not been a professional writing
- application since WordStar and its pale descendants including
- EMACS. Everybody writes – there is opportunity here.
- [41]Reply
- 6.
- Garrett
- [42]September 6, 2023 at 1:46 pm
- In my opinion, another huge value of this is that it has a distinct
- physical location. There’s a lot of power (at least for me) in
- having a physical place to do things. When I’m in my woodshop for
- instance, I am not engaging with distractions. I’m there to create
- things and I’m limited (or, empowered) by the tools around me.
- [43]Reply
- 7.
- Judy
- [44]September 6, 2023 at 6:23 pm
- As someone who formerly worked in IT but transitioned to become a
- classical fine art painter, I love the concept of objects that are
- both utilitarian and beautiful. Many craftspeople of the past took
- great pride in creating all manner of objects that were more than
- simply useful, as Keegan McNamara discovered. Owners of these
- well-crafted objects also loved them for their beauty. Beauty is
- important in life.
- [45]Reply
- 8.
- Kenneth Lawson
- [46]September 11, 2023 at 11:43 am
- This goes back to the idea of writing things in a book, on real
- paper.
- Paper and pen are used for one thing.
- Creation.
- When writing with a pen on paper, there is no distraction, only
- you, Your mind, and the physical act of putting words on paper.
- Thats not to say that paper and pen can’t be works of art in
- themselves.
- They definitely can.
- Good quality paper in a nice notebook will always be more enjoyable
- to use than cheap printer paper.
- The same with pens.
- Would you rather write the same note on printer paper with a Bic
- Ballpoint pen, or in a nice notebook on quality paper, with a nice
- fountain pen, that writes better and has more character than any
- pen could ever have?
- The note written on good paper with a fountain pen becomes a work
- of art in itself.
- And going back to read it later is more enjoyable.
- ‘
- [47]Reply
- 9.
- Kenwood
- [48]September 22, 2023 at 11:32 am
- Nice. Your essay emphasizes the profound influence of tool
- aesthetics on our work and cognition. The Mythic I, handcrafted by
- Keegan McNamara, epitomizes the fusion of craftsmanship and
- practicality, offering a stark contrast to today’s industrial and
- impersonal digital devices. McNamara’s computer is designed for
- specific tasks like writing, coding, and journaling, redirecting
- our focus from multitasking chaos to singular productivity. It
- reminds us that we shape our work environment and challenges
- conventional notions of productivity. I would like to share
- [49]https://writinguniverse.com/essay-writing-service/ free tools
- for writers. While we can’t all have custom-made computers,
- McNamara’s creation encourages us to rethink the balance between
- aesthetics and function in our daily tools.
- [50]Reply
+ [33] November 11, 2023 at 6:47 pm
-Leave a Comment [51]Cancel reply
+ That quote it itself based on one by Winston Churchill to the UK
+ Parliament in 1943: “We shape our buildings, and afterwards our
+ buildings shape us.” Churchill was referring to the reconstruction of
+ the bombed House of Commons, emphasizing how the design of buildings
+ influences the behavior and culture of the people who use them.
- Comment
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
+ [34]Reply
+ 5. [8e65d]
+ rb
+ [35] September 4, 2023 at 9:47 pm
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- Name ______________________________ Email
- ______________________________ ______________________________
+ WordStar was more fun than WordPerfect, which was quite a bit more fun than
+ Microsoft Word. There has not been a professional writing application since
+ WordStar and its pale descendants including EMACS. Everybody writes – there
+ is opportunity here.
- [ ] Save my name, email, and website in this browser for the next time
- I comment.
+ [36]Reply
+ 6. [5d6ca]
+ Garrett
+ [37] September 6, 2023 at 1:46 pm
- Post Comment
+ In my opinion, another huge value of this is that it has a distinct
+ physical location. There’s a lot of power (at least for me) in having a
+ physical place to do things. When I’m in my woodshop for instance, I am not
+ engaging with distractions. I’m there to create things and I’m limited (or,
+ empowered) by the tools around me.
- Cal Newport headshot
+ [38]Reply
+ 7. [90c00]
+ Judy
+ [39] September 6, 2023 at 6:23 pm
+
+ As someone who formerly worked in IT but transitioned to become a classical
+ fine art painter, I love the concept of objects that are both utilitarian
+ and beautiful. Many craftspeople of the past took great pride in creating
+ all manner of objects that were more than simply useful, as Keegan McNamara
+ discovered. Owners of these well-crafted objects also loved them for their
+ beauty. Beauty is important in life.
+
+ [40]Reply
+ 8. [50214]
+ Kenneth Lawson
+ [41] September 11, 2023 at 11:43 am
+
+ This goes back to the idea of writing things in a book, on real paper.
+
+ Paper and pen are used for one thing.
+ Creation.
+ When writing with a pen on paper, there is no distraction, only you, Your
+ mind, and the physical act of putting words on paper.
+
+ Thats not to say that paper and pen can’t be works of art in themselves.
+ They definitely can.
+ Good quality paper in a nice notebook will always be more enjoyable to use
+ than cheap printer paper.
+
+ The same with pens.
+ Would you rather write the same note on printer paper with a Bic Ballpoint
+ pen, or in a nice notebook on quality paper, with a nice fountain pen, that
+ writes better and has more character than any pen could ever have?
+
+ The note written on good paper with a fountain pen becomes a work of art in
+ itself.
+ And going back to read it later is more enjoyable.
+ ‘
+
+ [42]Reply
+ 9. [97f77]
+ Kenwood
+ [43] September 22, 2023 at 11:32 am
+
+ Nice. Your essay emphasizes the profound influence of tool aesthetics on
+ our work and cognition. The Mythic I, handcrafted by Keegan McNamara,
+ epitomizes the fusion of craftsmanship and practicality, offering a stark
+ contrast to today’s industrial and impersonal digital devices. McNamara’s
+ computer is designed for specific tasks like writing, coding, and
+ journaling, redirecting our focus from multitasking chaos to singular
+ productivity. It reminds us that we shape our work environment and
+ challenges conventional notions of productivity. I would like to share [44]
+ https://writinguniverse.com/essay-writing-service/ free tools for writers.
+ While we can’t all have custom-made computers, McNamara’s creation
+ encourages us to rethink the balance between aesthetics and function in our
+ daily tools.
+
+ [45]Reply
+
+Leave a Comment [46]Cancel reply
+
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+Comment[ ] [ ]
+
+Name[49][ ] Email
+[50][ ] [51][ ]
+
+[52][ ] Save my name, email, and website in this browser for the next time I
+comment.
+
+[53][Post Comment]
+
+Cal Newport headshot
About
- Cal launched the "Study Hacks" blog at calnewport.com in 2007, and has
- been regularly publishing essays here ever since. Over 2,000,000 people
- a year visit this site to read Cal's weekly posts about technology,
- productivity, and the quest to live and work deeply in an increasingly
- distracted world, while tens of thousands more subscribe to have these
- essays delivered directly to their inbox (see the sign-up form
- below). [52]To read more, you can browse more than 15 years of past
- essays in the archive.
- In the fall of 2022, Cal launched a new portal, [53]TheDeepLife.com, to
- serve as the online home for all other content relevant to the deep
- life movement he helped initiate. Here you can find all past episodes
- of Cal's popular podcast, Deep Questions, and explore an extensive
- library of original videos.
- __________________________________________________________________
+Cal launched the "Study Hacks" blog at calnewport.com in 2007, and has been
+regularly publishing essays here ever since. Over 2,000,000 people a year visit
+this site to read Cal's weekly posts about technology, productivity, and the
+quest to live and work deeply in an increasingly distracted world, while tens
+of thousands more subscribe to have these essays delivered directly to their
+inbox (see the sign-up form below). [57]To read more, you can browse more than
+15 years of past essays in the archive.
+In the fall of 2022, Cal launched a new portal, [58]TheDeepLife.com, to serve
+as the online home for all other content relevant to the deep life movement he
+helped initiate. Here you can find all past episodes of Cal's popular podcast,
+Deep Questions, and explore an extensive library of original videos.
- Cal Newport logo
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+Cal Newport logo
- This site is the online home for the computer science professor and
- bestselling author Cal Newport. Here you can learn more about Cal and
- both his general-audience and academic writing. You can also browse and
- subscribe to his long-running weekly essay series. For more on Cal's
- podcast, videos, and online courses, please visit his media
- portal, [54]TheDeepLife.com
+This site is the online home for the computer science professor and bestselling
+author Cal Newport. Here you can learn more about Cal and both his
+general-audience and academic writing. You can also browse and subscribe to his
+long-running weekly essay series. For more on Cal's podcast, videos, and online
+courses, please visit his media portal, [59]TheDeepLife.com
Contact Info
- Academic Communication
- [55][email protected]
+Academic Communication
+[60][email protected]
- Media Inquires
- [56][email protected]
+Media Inquires
+[61][email protected]
- All Other Requests
- [57]See Contact Page
+All Other Requests
+[62]See Contact Page
Quick Links
- * [58]Scholarship
- * [59]Writing
- * [60]Essays
- * [61]Press
- * [62]Contact
- * [63]Media Kit
- * [64]Podcast/Videos
+ • [63]Scholarship
+ • [64]Writing
+ • [65]Essays
+ • [66]Press
+ • [67]Contact
+ • [68]Media Kit
+ • [69]Podcast/Videos
- * [65]Privacy Policies
- * [66]Cookie Policy
- * [67]Terms of Service
- * [68]Accessibility Statement
+ • [70]Privacy Policies
+ • [71]Cookie Policy
+ • [72]Terms of Service
+ • [73]Accessibility Statement
- Copyright © 2024 Cal Newport, All rights reserved.
+Copyright © 2024 Cal Newport, All rights reserved.
+[74] Cleantalk Pixel
- Cleantalk Pixel
+References:
-References
-
- Visible links:
- 1. https://calnewport.com/feed/
- 2. https://calnewport.com/comments/feed/
- 3. https://calnewport.com/on-tools-and-the-aesthetics-of-work/feed/
- 4. https://calnewport.com/wp-json/wp/v2/posts/15503
- 5. https://calnewport.com/wp-json/oembed/1.0/embed?url=https://calnewport.com/on-tools-and-the-aesthetics-of-work/
- 6. https://calnewport.com/wp-json/oembed/1.0/embed?url=https://calnewport.com/on-tools-and-the-aesthetics-of-work/&format=xml
- 7. https://www.googletagmanager.com/ns.html?id=GTM-W6XZ4TH
- 8. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#content
- 9. https://calnewport.com/
- 10. https://calnewport.com/
- 11. https://calnewport.com/
- 12. https://calnewport.com/scholarship/
- 13. https://calnewport.com/writing/
- 14. https://calnewport.com/blog/
- 15. https://calnewport.com/press/
- 16. https://calnewport.com/contact/
- 17. https://calnewport.com/
- 18. https://calnewport.com/blog/
- 19. https://www.metmuseum.org/about-the-met/collection-areas/arms-and-armor
- 20. https://www.theverge.com/23841276/mythic-computer-keegan-mcnamara-pc-builder
- 21. https://www.mythic.computer/
- 22. https://www.amazon.com/Amusing-Ourselves-Death-Discourse-Business/dp/014303653X/
- 23. https://www.amazon.com/World-Without-Email-Reimagining-Communication/dp/0525536558/
- 24. https://www.amazon.com/Master-Change-Everything-Changing-Including/dp/006325316X
- 25. https://www.bradstulberg.com/
- 26. https://calnewport.com/we-dont-need-a-new-twitter/
- 27. https://calnewport.com/on-tire-pressure-and-productivity/
- 28. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75274
- 29. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75274
- 30. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75292
- 31. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75292
- 32. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75309
- 33. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75309
- 34. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76565
- 35. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76565
- 36. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75349
- 37. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75349
- 38. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-83574
- 39. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-83574
- 40. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75355
- 41. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75355
- 42. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75579
- 43. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75579
- 44. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75642
- 45. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75642
- 46. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76535
- 47. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76535
- 48. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-78315
- 49. https://writinguniverse.com/essay-writing-service/
- 50. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-78315
- 51. https://calnewport.com/on-tools-and-the-aesthetics-of-work/#respond
- 52. https://calnewport.com/archive/
- 53. https://www.thedeeplife.com/
- 54. https://www.thedeeplife.com/
- 55. https://calnewport.com/cdn-cgi/l/email-protection#f2919cc0c6cab295979d809597869d859cdc979687
- 56. https://calnewport.com/cdn-cgi/l/email-protection#9ffcfef3f1fae8eff0edebdfeffaf1f8eaf6f1edfef1fbf0f2f7f0eaecfab1fcf0f2
- 57. https://calnewport.com/contact/
- 58. https://calnewport.com/scholarship/
- 59. https://calnewport.com/writing/
- 60. https://calnewport.com/blog/
- 61. https://calnewport.com/press/
- 62. https://calnewport.com/contact/
- 63. https://calnewport.com/media-kit/
- 64. https://calnewport.com/podcasts/
- 65. https://calnewport.com/privacy-policies/
- 66. https://calnewport.com/cookie-policy/
- 67. https://calnewport.com/terms-of-service/
- 68. https://calnewport.com/accessibility-statement/
-
- Hidden links:
- 70. https://calnewport.com/on-tools-and-the-aesthetics-of-work/
+[1] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#content
+[2] https://calnewport.com/
+[4] https://calnewport.com/
+[6] https://calnewport.com/
+[7] https://calnewport.com/scholarship/
+[8] https://calnewport.com/writing/
+[9] https://calnewport.com/blog/
+[10] https://calnewport.com/press/
+[11] https://calnewport.com/contact/
+[12] https://calnewport.com/
+[13] https://calnewport.com/blog/
+[14] https://www.metmuseum.org/about-the-met/collection-areas/arms-and-armor
+[15] https://www.theverge.com/23841276/mythic-computer-keegan-mcnamara-pc-builder
+[16] https://www.mythic.computer/
+[17] https://www.amazon.com/Amusing-Ourselves-Death-Discourse-Business/dp/014303653X/
+[18] https://www.amazon.com/World-Without-Email-Reimagining-Communication/dp/0525536558/
+[19] https://www.amazon.com/Master-Change-Everything-Changing-Including/dp/006325316X
+[20] https://www.bradstulberg.com/
+[21] https://calnewport.com/we-dont-need-a-new-twitter/
+[22] https://calnewport.com/on-tire-pressure-and-productivity/
+[23] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75274
+[24] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75274
+[25] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75292
+[26] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75292
+[27] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75309
+[28] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75309
+[29] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76565
+[30] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76565
+[31] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75349
+[32] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75349
+[33] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-83574
+[34] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-83574
+[35] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75355
+[36] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75355
+[37] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75579
+[38] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75579
+[39] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75642
+[40] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-75642
+[41] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76535
+[42] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-76535
+[43] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-78315
+[44] https://writinguniverse.com/essay-writing-service/
+[45] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#comment-78315
+[46] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#respond
+[57] https://calnewport.com/archive/
+[58] https://www.thedeeplife.com/
+[59] https://www.thedeeplife.com/
+[60] https://calnewport.com/cdn-cgi/l/email-protection#34575a06000c7453515b465351405b435a1a515041
+[61] https://calnewport.com/cdn-cgi/l/email-protection#b8dbd9d4d6ddcfc8d7caccf8c8ddd6dfcdd1d6cad9d6dcd7d5d0d7cdcbdd96dbd7d5
+[62] https://calnewport.com/contact/
+[63] https://calnewport.com/scholarship/
+[64] https://calnewport.com/writing/
+[65] https://calnewport.com/blog/
+[66] https://calnewport.com/press/
+[67] https://calnewport.com/contact/
+[68] https://calnewport.com/media-kit/
+[69] https://calnewport.com/podcasts/
+[70] https://calnewport.com/privacy-policies/
+[71] https://calnewport.com/cookie-policy/
+[72] https://calnewport.com/terms-of-service/
+[73] https://calnewport.com/accessibility-statement/
+[74] https://calnewport.com/on-tools-and-the-aesthetics-of-work/#
diff --git a/static/archive/cerebralab-com-qy5zqs.txt b/static/archive/cerebralab-com-qy5zqs.txt
index 37d1662..8d74db9 100644
--- a/static/archive/cerebralab-com-qy5zqs.txt
+++ b/static/archive/cerebralab-com-qy5zqs.txt
@@ -1,331 +1,342 @@
- [book_front.svg] [book_back.svg]
- night mode
- ____________________ (BUTTON) Subscribe
+[book_front] [book_back]
+night mode
+[1][ ] Subscribe
+
+[3] RSS
+Add this blog to your rss feed
+[4] github logo
+Pollute your mind with some of my other missguided creations on Github
+[5] email icon
+Contact me at: george@cerebralab.com
+[6] twitter logo
+Publicly berate me on Twitter
- [1]RSS
- Add this blog to your rss feed
- [2]github logo
- Pollute your mind with some of my other missguided creations on Github
- [3]email icon
- Contact me at: george@cerebralab.com
- [4]twitter logo
- Publicly berate me on Twitter
+This blog is no longer active, you can find my new stuff at: [7]george3d6.com,
+[8]epistem.ink, [9]ontologi.cc, and [10]phenomenologi.cc
- This blog is no longer active, you can find my new stuff at:
- [5]george3d6.com, [6]epistem.ink, [7]ontologi.cc, and
- [8]phenomenologi.cc
- [9]Audio version (read by a tts bot)
+
+[11]Audio version (read by a tts bot)
Imaginary Problems Are the Root of Bad Software
- https://upload.wikimedia.org/wikipedia/commons/c/c0/De_Rebus_Bellicis%2
- C_XVth_Century_Miniature.JPG There are many factors which can be a
- catalyst for bad software: from the tools being used, to team
- communication, to the personal stake developers have in its success, to
- the testing methodology.
+https://upload.wikimedia.org/wikipedia/commons/c/c0/
+De_Rebus_Bellicis%2C_XVth_Century_Miniature.JPG There are many factors which
+can be a catalyst for bad software: from the tools being used, to team
+communication, to the personal stake developers have in its success, to the
+testing methodology.
- I propose that there is one problem chief among them, an impetus for
- bad software from which almost all others take root: imaginary
- problems.
+I propose that there is one problem chief among them, an impetus for bad
+software from which almost all others take root: imaginary problems.
- Most complicated or broken software is not designed to be overly
- complex or dysfunctional. It’s just designed to do something other than
- its intended purpose.
+Most complicated or broken software is not designed to be overly complex or
+dysfunctional. It’s just designed to do something other than its intended
+purpose.
- Let’s say you’re a podcast host who wants a custom website where you
- can sell your promotional products, make advertising money without a
- third party cutting in, and, most importantly, deliver podcasts,
- videos, and blogs to your audience.
+Let’s say you’re a podcast host who wants a custom website where you can sell
+your promotional products, make advertising money without a third party cutting
+in, and, most importantly, deliver podcasts, videos, and blogs to your
+audience.
- The requirements for your little web-app might look something like
- this:
- * Fast load time in North America, with real-time podcast streaming
- and downloads
- * Doesn’t crash or freeze in the first 15 minutes for 99.99 percent
- of users, preferably never crashes or freezes
- * Integrates well with Google Adwords and maybe some other
- third-party ad providers as well, if there’s time
- * Dynamically links to the latest products in my Zazzle shop and, if
- possible, gives recommendations to users based on the content
- they’ve consumed
- * Integrates with Facebook live player. If it’s easy to create an
- alternative solution for streaming that doesn’t require Facebook,
- even better
+The requirements for your little web-app might look something like this:
- You give these specs to a team of contractors, and you chat about them
- a bit. It seems that everyone is on the same page. Yet, when they
- return with the Minimum Viable Product two months later, your face
- turns red. You’ve just wasted $15,000 on a piece of garbage; you want
- your money back.
+ • Fast load time in North America, with real-time podcast streaming and
+ downloads
+ • Doesn’t crash or freeze in the first 15 minutes for 99.99 percent of users,
+ preferably never crashes or freezes
+ • Integrates well with Google Adwords and maybe some other third-party ad
+ providers as well, if there’s time
+ • Dynamically links to the latest products in my Zazzle shop and, if
+ possible, gives recommendations to users based on the content they’ve
+ consumed
+ • Integrates with Facebook live player. If it’s easy to create an alternative
+ solution for streaming that doesn’t require Facebook, even better
- The first time you open the app, the screen freezes. You ask how to
- select what kind of ads should be allowed to run on the site and are
- pointed to an ugly, hard-to-understand custom user interface (UI). Half
- the links to your merchandise on Zazzle are broken or missing images,
- and the Facebook livestream is laggy!
+You give these specs to a team of contractors, and you chat about them a bit.
+It seems that everyone is on the same page. Yet, when they return with the
+Minimum Viable Product two months later, your face turns red. You’ve just
+wasted $15,000 on a piece of garbage; you want your money back.
- But the development team is confused at your anger — rightfully so,
- from their point of view — because they’ve gone to hell and back for
- you.
+The first time you open the app, the screen freezes. You ask how to select what
+kind of ads should be allowed to run on the site and are pointed to an ugly,
+hard-to-understand custom user interface (UI). Half the links to your
+merchandise on Zazzle are broken or missing images, and the Facebook livestream
+is laggy!
- They’ve put their heart and soul into creating this app, and it has
- some amazing features:
- * A state of the art recommendation system
- * An algorithm generating the transcript of all your streams, in real
- time
- * Your front page loads in sub 200ms times all over the world
- * A streaming protocol and client build almost from scratch, in case
- you don’t want to rely on Facebook live
- * A service that allows you to easily integrate over 20 ad exchanges
+But the development team is confused at your anger — rightfully so, from their
+point of view — because they’ve gone to hell and back for you.
- The problem is that you thought you requested a core product with a
- couple of extra features, if they were easy enough to implement.
- Meanwhile, the dev team heard something else. They heard about some
- exciting challenges they could tackle… and a slew of boring, basic
- features they couldn’t be bothered to test properly or care about.
+They’ve put their heart and soul into creating this app, and it has some
+amazing features:
- Even worse, you didn’t communicate directly with the devs — you
- communicated through a game of Telephone. You spoke to a sales guy, who
- held a meeting with some middle management chap, who wrote some
- business specs and gave those to a PM, who wrote some technical specs
- and gave those to a team lead or architect, who then, at last, began to
- design the product with his team — each one of them putting a bit of
- his own twist on it along the way.
- __________________________________________________________________
+ • A state of the art recommendation system
+ • An algorithm generating the transcript of all your streams, in real time
+ • Your front page loads in sub 200ms times all over the world
+ • A streaming protocol and client build almost from scratch, in case you
+ don’t want to rely on Facebook live
+ • A service that allows you to easily integrate over 20 ad exchanges
- Imaginary problems are often more fun to solve than real ones.
- Extremely intelligent people play competitive games, construct and
- solve math problems, and write books that aim to answer abstract
- questions about the human condition, all of them for free. A mediocre
- programmer, however, will probably charge you a fair amount to build a
- simple Android app. That’s not because mediocre programmers are harder
- to find than geniuses, but because the former activities are all fun,
- while the latter can be quite boring.
+The problem is that you thought you requested a core product with a couple of
+extra features, if they were easy enough to implement. Meanwhile, the dev team
+heard something else. They heard about some exciting challenges they could
+tackle… and a slew of boring, basic features they couldn’t be bothered to test
+properly or care about.
- Most programmers want to get paid and have fun at the same time. Of
- course, the definition of “fun” is different for everyone, but for many
- engineers, it boils down to tackling interesting and challenging
- problems that are within the realm of solvability.
+Even worse, you didn’t communicate directly with the devs — you communicated
+through a game of Telephone. You spoke to a sales guy, who held a meeting with
+some middle management chap, who wrote some business specs and gave those to a
+PM, who wrote some technical specs and gave those to a team lead or architect,
+who then, at last, began to design the product with his team — each one of them
+putting a bit of his own twist on it along the way.
- Give a somewhat intelligent person too many boring tasks that are
- impossible to automate and you will eventually drive him mad. The human
- brain however, after billions of years of evolution, is quite talented
- at keeping its sanity. Much like victims of childhood hardship or abuse
- can find escape in fantasy books, victims of enterprise programming or
- freelance web development can find their escape in solving imaginary
- problems.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- The amount of imaginary problems a software engineer can create for
- themselves is a function of their imagination and of the difficulty of
- the real problems they’re supposed to solve.
+Imaginary problems are often more fun to solve than real ones. Extremely
+intelligent people play competitive games, construct and solve math problems,
+and write books that aim to answer abstract questions about the human
+condition, all of them for free. A mediocre programmer, however, will probably
+charge you a fair amount to build a simple Android app. That’s not because
+mediocre programmers are harder to find than geniuses, but because the former
+activities are all fun, while the latter can be quite boring.
- It should be noted that this issue isn’t unique to developers.
- Management, sales, HR, support, legal, and even accounting departments
- have their own unique ways of creating imaginary problems. They try to
- involve themselves too much in a decision, when their presence at a
- meeting is just a formality or wasn’t requested at all. They
- overemphasize a minute problem that is related to their role, or hire
- teams much larger than necessary to illustrate their importance.
+Most programmers want to get paid and have fun at the same time. Of course, the
+definition of “fun” is different for everyone, but for many engineers, it boils
+down to tackling interesting and challenging problems that are within the realm
+of solvability.
- When problems are dumb, intelligent individuals will find a way of
- coping.
- __________________________________________________________________
+Give a somewhat intelligent person too many boring tasks that are impossible to
+automate and you will eventually drive him mad. The human brain however, after
+billions of years of evolution, is quite talented at keeping its sanity. Much
+like victims of childhood hardship or abuse can find escape in fantasy books,
+victims of enterprise programming or freelance web development can find their
+escape in solving imaginary problems.
- But imaginary problems aren’t just the result of bored developers.
- They’re also the result of long chains of communication.
+[1]
- When I first began taking on freelance clients, I couldn’t afford to be
- particular. This means I’ve had email chains lasting for over a 100
- exchanges, discussing insignificant details about internal MVPs. I’ve
- had people change every single requirement on a project within the span
- of a week. I’ve had clients ask questions such as “Could this be
- ICO-ed?” or “Can we add some A.I. in here?”
+The amount of imaginary problems a software engineer can create for themselves
+is a function of their imagination and of the difficulty of the real problems
+they’re supposed to solve.
- Granted, most clients are savvier than that, but, even still, they
- often lack a bit of the knowledge necessary to articulate or construct
- some of their requirements. That is fine, as part of my job as “the
- computer guy” is to help people figure out what they do and don’t need
- based on their use cases. But it can become much harder to determine
- what’s needed when there are a few layers between you and the client.
+It should be noted that this issue isn’t unique to developers. Management,
+sales, HR, support, legal, and even accounting departments have their own
+unique ways of creating imaginary problems. They try to involve themselves too
+much in a decision, when their presence at a meeting is just a formality or
+wasn’t requested at all. They overemphasize a minute problem that is related to
+their role, or hire teams much larger than necessary to illustrate their
+importance.
- Requirements get changed because someone either misunderstood an
- intention or because someone was trying to cope with that
- aforementioned boredom
+When problems are dumb, intelligent individuals will find a way of coping.
- Most companies like having a sales guy who pitches potential customers,
- negotiates prices, and outlines possible features. They also have a
- [10]people person to discuss more in-depth requirements and details
- with the customer, usually another sales guy, but with a slightly
- different title. Then there’s the internal chain of command, various
- levels of management, and possibly some hierarchy, within the technical
- team.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- When a list of client requirements goes through so many people, even if
- those people have the best of intentions, some things will inevitably
- get lost in translation. Sometimes that change happens because the
- original requirement made no sense, or sometimes requirements need to
- be redefined. The sales guy might have told the client, “for only
- 39,999 extra we can do this on the Blockchain.” But that leaves
- everyone who encounters the requirements down the line wondering what
- the definition is of “doing it on the Blockchain.”
+But imaginary problems aren’t just the result of bored developers. They’re also
+the result of long chains of communication.
- More often than not, requirements get changed because someone either
- misunderstood an intention or because someone was trying to cope with
- that aforementioned boredom, trying to make his job or the work of his
- team more interesting and impressive.
+When I first began taking on freelance clients, I couldn’t afford to be
+particular. This means I’ve had email chains lasting for over a 100 exchanges,
+discussing insignificant details about internal MVPs. I’ve had people change
+every single requirement on a project within the span of a week. I’ve had
+clients ask questions such as “Could this be ICO-ed?” or “Can we add some A.I.
+in here?”
- Through all of this, the original requirements — the real problems that
- have to be solved — get lost. They are replaced with imaginary problems
- and with voids, and you’ve got plenty of people ready and willing to
- fill those voids with their own imaginary problems, because the
- problems they have to solve are boring, and filling the voids gives
- them a way of coping.
+Granted, most clients are savvier than that, but, even still, they often lack a
+bit of the knowledge necessary to articulate or construct some of their
+requirements. That is fine, as part of my job as “the computer guy” is to help
+people figure out what they do and don’t need based on their use cases. But it
+can become much harder to determine what’s needed when there are a few layers
+between you and the client.
+
+ Requirements get changed because someone either misunderstood an intention
+ or because someone was trying to cope with that aforementioned boredom
+
+Most companies like having a sales guy who pitches potential customers,
+negotiates prices, and outlines possible features. They also have a [12]people
+person to discuss more in-depth requirements and details with the customer,
+usually another sales guy, but with a slightly different title. Then there’s
+the internal chain of command, various levels of management, and possibly some
+hierarchy, within the technical team.
+
+When a list of client requirements goes through so many people, even if those
+people have the best of intentions, some things will inevitably get lost in
+translation. Sometimes that change happens because the original requirement
+made no sense, or sometimes requirements need to be redefined. The sales guy
+might have told the client, “for only 39,999 extra we can do this on the
+Blockchain.” But that leaves everyone who encounters the requirements down the
+line wondering what the definition is of “doing it on the Blockchain.”
+
+More often than not, requirements get changed because someone either
+misunderstood an intention or because someone was trying to cope with that
+aforementioned boredom, trying to make his job or the work of his team more
+interesting and impressive.
+
+Through all of this, the original requirements — the real problems that have to
+be solved — get lost. They are replaced with imaginary problems and with voids,
+and you’ve got plenty of people ready and willing to fill those voids with
+their own imaginary problems, because the problems they have to solve are
+boring, and filling the voids gives them a way of coping.
Overcomplexity and natural selection
- There can often be an even darker reason for the existence of imaginary
- problems: problems can help a team or a company grow, and can even
- become an integral part of its function.
+There can often be an even darker reason for the existence of imaginary
+problems: problems can help a team or a company grow, and can even become an
+integral part of its function.
- “People who are bred, selected, and compensated to find complicated
- solutions do not have an incentive to implement simplified ones.”
+ “People who are bred, selected, and compensated to find complicated
+ solutions do not have an incentive to implement simplified ones.”
- — Nassim Nicholas Taleb
+ — Nassim Nicholas Taleb
- Have you ever heard about those three web engineers who figured out
- that secure online banking is actually quite an easy problem to solve?
- They developed some flawless banking software from scratch, using a
- functional design methodology and memory safe languages, then started
- migrating major banks to their amazing infrastructure.
+Have you ever heard about those three web engineers who figured out that secure
+online banking is actually quite an easy problem to solve? They developed some
+flawless banking software from scratch, using a functional design methodology
+and memory safe languages, then started migrating major banks to their amazing
+infrastructure.
- Probably you haven’t heard of them, because they don’t exist. There
- are, however, plenty of teams of [11]thousands of developers, who are
- unable to grasp simple concepts such “rollbacks,” perpetually creating
- banking software.
+Probably you haven’t heard of them, because they don’t exist. There are,
+however, plenty of teams of [13]thousands of developers, who are unable to
+grasp simple concepts such “rollbacks,” perpetually creating banking software.
- The storage and transfer of numbers is not a particularly hard problem.
- Indexing the whole content of the internet and providing relevant
- results to natural language queries, in sub second times, is a hard
- problem. [12]But just a few smart guys managed to solve that problem.
+The storage and transfer of numbers is not a particularly hard problem.
+Indexing the whole content of the internet and providing relevant results to
+natural language queries, in sub second times, is a hard problem. [14]But just
+a few smart guys managed to solve that problem.
- The persistent problem for online banking is that the banking ecosystem
- has become really good at preserving its own money-grabbing hierarchy.
- Its leaders are [13]corrupt leeches who prey on society — but the
- leaders in an organization are just a symptom of its members.
+The persistent problem for online banking is that the banking ecosystem has
+become really good at preserving its own money-grabbing hierarchy. Its leaders
+are [15]corrupt leeches who prey on society — but the leaders in an
+organization are just a symptom of its members.
- I wouldn’t suggest that most underling workers for banks are evil or
- malicious in any way. Far from it. They are usually friendly lads,
- working to provide food, shelter, and an education for their families.
- But their chief incentive is not to fix the banking software, it is to
- stay employed. Losing your job in today’s economy is no joking matter
- for some; in the banking industry, a big mouth or too much initiative
- is an easy way find yourself in front of a disciplinary committee.
+I wouldn’t suggest that most underling workers for banks are evil or malicious
+in any way. Far from it. They are usually friendly lads, working to provide
+food, shelter, and an education for their families. But their chief incentive
+is not to fix the banking software, it is to stay employed. Losing your job in
+today’s economy is no joking matter for some; in the banking industry, a big
+mouth or too much initiative is an easy way find yourself in front of a
+disciplinary committee.
- So banking systems remain the same — not because the systems are
- efficient, but because of inertia. This inertia comes in the form of
- working on imaginary problems in order to avoid fixing real
- problems — real problems which, once pointed out, would threaten the
- jobs of other people. To focus on these real problems could lead to
- getting fired, or, in the case of some particularly nasty
- “institutions” like Goldman Sachs, [14]getting a few life-ruining brown
- envelopes sent to a few FBI officers and prompting a strange suicide.
+So banking systems remain the same — not because the systems are efficient, but
+because of inertia. This inertia comes in the form of working on imaginary
+problems in order to avoid fixing real problems — real problems which, once
+pointed out, would threaten the jobs of other people. To focus on these real
+problems could lead to getting fired, or, in the case of some particularly
+nasty “institutions” like Goldman Sachs, [16]getting a few life-ruining brown
+envelopes sent to a few FBI officers and prompting a strange suicide.
- “It is difficult to get a man to understand something, when his
- salary depends upon his not understanding it!”
+ “It is difficult to get a man to understand something, when his salary
+ depends upon his not understanding it!”
- — Upton Sinclair
+ — Upton Sinclair
- The [15]C-suite ignores the fact that their upper management workers
- spend 90 percent of their time on “client meetings” that involve
- tropical islands and million-dollar budgets for “other expenses.” Upper
- management, in return, turns a blind eye to corruption in C-suite.
+The [17]C-suite ignores the fact that their upper management workers spend 90
+percent of their time on “client meetings” that involve tropical islands and
+million-dollar budgets for “other expenses.” Upper management, in return, turns
+a blind eye to corruption in C-suite.
- Because middle management encourages them to live in their Wolf of Wall
- Street fantasies, upper management ignores middle managers who buy
- eccentric offices and hire themselves three secretaries and a dozen
- interns.
+Because middle management encourages them to live in their Wolf of Wall Street
+fantasies, upper management ignores middle managers who buy eccentric offices
+and hire themselves three secretaries and a dozen interns.
- Because line management doesn’t complain about their dictatorial power
- fantasies, middle management ignores the fact that line managers,
- instead of cutting costs, spend their time working on PowerPoint
- presentations about “Improving our Agile Methodology.”
+Because line management doesn’t complain about their dictatorial power
+fantasies, middle management ignores the fact that line managers, instead of
+cutting costs, spend their time working on PowerPoint presentations about
+“Improving our Agile Methodology.”
- Because the team leaders don’t seem to notice the fact that their
- superiors can’t even use Excel properly and only hit the office every
- few weeks, line managers ignore the team leaders and architects talking
- about “next generation interfacing between our systems using JRPC and
- microserviceization using Hibernate and Spring” when they should be
- getting those bloody Mysql queries to take less than a day.
+Because the team leaders don’t seem to notice the fact that their superiors
+can’t even use Excel properly and only hit the office every few weeks, line
+managers ignore the team leaders and architects talking about “next generation
+interfacing between our systems using JRPC and microserviceization using
+Hibernate and Spring” when they should be getting those bloody Mysql queries to
+take less than a day.
- Because the developers don’t seem to notice that their leaders don’t
- really write any code except DOT diagrams, team leaders don’t complain
- about their developers, instead of looking at an EXPLAIN for the
- aforementioned slow query, re-designing the UI for the tenth time that
- year using a new JavaScript framework.
+Because the developers don’t seem to notice that their leaders don’t really
+write any code except DOT diagrams, team leaders don’t complain about their
+developers, instead of looking at an EXPLAIN for the aforementioned slow query,
+re-designing the UI for the tenth time that year using a new JavaScript
+framework.
- It’s a vicious cycle of solving imaginary problems, from the CEO who
- doesn’t realize that stealing another 30 million won’t make his dad
- love him to the user-experience intern who doesn’t realize that
- redesigning the “submit” button using Angular-Material-Bootstrap
- 19.13.5 won’t make the fact that they store passwords in plain text
- (and use them as part of the auth cookie) go away.
+It’s a vicious cycle of solving imaginary problems, from the CEO who doesn’t
+realize that stealing another 30 million won’t make his dad love him to the
+user-experience intern who doesn’t realize that redesigning the “submit” button
+using Angular-Material-Bootstrap 19.13.5 won’t make the fact that they store
+passwords in plain text (and use them as part of the auth cookie) go away.
- But everyone needs to keep solving the imaginary problems, because if
- they stop creating and solving these problems, if they start focusing
- on the real problems, they might realize the whole system is broken.
- They might realize Debra has been sitting in that corner, staring at
- uptime graphs of the internal server farm for 10 years, despite the
- fact that the company moved to AWS five years ago. They might realize
- 99 percent of their job is to perpetuate the existence of someone
- else’s job. And that’s a hard realization to digest—impossible for
- most, I dare say. So, instead, most find a way of coping.
- __________________________________________________________________
+But everyone needs to keep solving the imaginary problems, because if they stop
+creating and solving these problems, if they start focusing on the real
+problems, they might realize the whole system is broken. They might realize
+Debra has been sitting in that corner, staring at uptime graphs of the internal
+server farm for 10 years, despite the fact that the company moved to AWS five
+years ago. They might realize 99 percent of their job is to perpetuate the
+existence of someone else’s job. And that’s a hard realization to
+digest—impossible for most, I dare say. So, instead, most find a way of coping.
- If you enjoyed this article you may also like:
- * [16]The Red Queen
- * [17]Stop future proofing software
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Published on: 2019-04-29
- __________________________________________________________________
+If you enjoyed this article you may also like:
- ____________________ (BUTTON) Subscribe
+ • [18]The Red Queen
+ • [19]Stop future proofing software
- Reactions:
+Published on: 2019-04-29
- angry
- loony
- pls
- sexy
- straigt-face
- __________________________________________________________________
- [18]twitter logo
- Share this article on twitter
- [19]linkedin logo
- Share this article on linkedin
- [20]Fb logo
- Share this article on facebook
-References
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 1. https://cerebralab.com/feed.xml
- 2. https://github.com/George3d6
- 3. mailto:george@cerebralab.com
- 4. https://twitter.com/Cerebralab2
- 5. https://george3d6.com/
- 6. https://epistem.ink/
- 7. https://ontologi.cc/
- 8. https://phenomenologi.cc/
- 9. https://youtu.be/9jODhmgkp3o
- 10. https://www.youtube.com/watch?v=hNuu9CpdjIo
- 11. https://www.theguardian.com/business/2018/apr/28/warning-signs-for-tsbs-it-meltdown-were-clear-a-year-ago-insider
- 12. https://en.wikipedia.org/wiki/History_of_Google
- 13. https://en.wikipedia.org/wiki/Ben_Bernanke
- 14. https://en.wikipedia.org/wiki/Sergey_Aleynikov
- 15. https://www.investopedia.com/terms/c/c-suite.asp
- 16. https://cerebralab.com/The Red Queen
- 17. https://cerebralab.com/Stop future proofing software
- 18. https://twitter.com/intent/tweet?text=A shameless content-promotion script has asked me to share with you this amazing article I just read: https://cerebralab.com
- 19. https://www.linkedin.com/shareArticle?mini=true&url=https://cerebralab.com&summary=A shameless content-promotion script has asked me to share with you this amazing article I just read&source=https://cerebralab.com
- 20. https://www.facebook.com/sharer/sharer.php?u=https://cerebralab.com
+
+[20][ ] Subscribe
+
+
+
+
+Reactions:
+
+angry
+loony
+pls
+sexy
+straigt-face
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[22] twitter logo
+Share this article on twitter
+[23] linkedin logo
+Share this article on linkedin
+[24] Fb logo
+Share this article on facebook
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+References:
+
+[3] https://cerebralab.com/feed.xml
+[4] https://github.com/George3d6
+[5] mailto:george@cerebralab.com
+[6] https://twitter.com/Cerebralab2
+[7] https://george3d6.com/
+[8] https://epistem.ink/
+[9] https://ontologi.cc/
+[10] https://phenomenologi.cc/
+[11] https://youtu.be/9jODhmgkp3o
+[12] https://www.youtube.com/watch?v=hNuu9CpdjIo
+[13] https://www.theguardian.com/business/2018/apr/28/warning-signs-for-tsbs-it-meltdown-were-clear-a-year-ago-insider
+[14] https://en.wikipedia.org/wiki/History_of_Google
+[15] https://en.wikipedia.org/wiki/Ben_Bernanke
+[16] https://en.wikipedia.org/wiki/Sergey_Aleynikov
+[17] https://www.investopedia.com/terms/c/c-suite.asp
+[18] https://cerebralab.com/The%20Red%20Queen
+[19] https://cerebralab.com/Stop%20future%20proofing%20software
+[22] https://twitter.com/intent/tweet?text=A%20shameless%20content-promotion%20script%20has%20asked%20me%20to%20share%20with%20you%20this%20amazing%20article%20I%20just%20read:%20https://cerebralab.com
+[23] https://www.linkedin.com/shareArticle?mini=true&url=https://cerebralab.com&summary=A%20shameless%20content-promotion%20script%20has%20asked%20me%20to%20share%20with%20you%20this%20amazing%20article%20I%20just%20read&source=https://cerebralab.com
+[24] https://www.facebook.com/sharer/sharer.php?u=https://cerebralab.com
diff --git a/static/archive/changelog-com-kqx1ni.txt b/static/archive/changelog-com-kqx1ni.txt
index 0381081..d10003f 100644
--- a/static/archive/changelog-com-kqx1ni.txt
+++ b/static/archive/changelog-com-kqx1ni.txt
@@ -1,512 +1,495 @@
- #[1]News Feed (The Proverbial Fire Hose) [2]Master Feed (All Shows)
- [3]Posts Feed [4]JSON News Feed
+[1]Changelog
- [5]Changelog
+ • [2]Podcasts
+ • [3]Beats
+ • [4]Posts
+ • [5]Community
+ • [6]Subscribe
+ • [7]Changelog++
- * [6]Podcasts
- * [7]Beats
- * [8]Posts
- * [9]Community
- * [10]Subscribe
- * [11]Changelog++
+ • [8]Live
+ • [9]Submit News
- * [12]Live
- * [13]Submit News
+ • [10]Sign In
- * [14]Sign In
+[11][ ]
+[13]Changelog
- ____________________
- (BUTTON)
+ • [14]Podcasts
+ • [15]Beats
+ • [16]Posts
+ • [17]Community
+ • [18]Subscribe
+ • [19]Changelog++
+ • [20]Submit News
- [15]Changelog
- * [16]Podcasts
- * [17]Beats
- * [18]Posts
- * [19]Community
- * [20]Subscribe
- * [21]Changelog++
- * [22]Submit News
-
- ____________________
-
- [23]Jerod Santo [24]changelog.com/posts
+[21][ ]
+[22] Jerod Santo [23]changelog.com/posts
There's still no silver bullet
a friendly reminder that you haven't found the panacea
- logged by [25]jerodsanto [26]2023-05-24T16:25:22Z [27]#practices +2
- * [28]#history
- * [29]#react
+logged by [24]jerodsanto [25]2023-05-24T16:25:22Z [26]#practices +2
- The late, great [30]Fred Brooks wrote many words about software
- engineering. You may have heard of [31]Brooks’s Law or read his seminal
- book, [32]The Mythical Man-Month. Even if you haven’t, you’ve probably
- heard at least one colleague proclaim:
+ • [27]#history
+ • [28]#react
- Nine women can’t make a baby in one month!
+The late, great [29]Fred Brooks wrote many words about software engineering.
+You may have heard of [30]Brooks’s Law or read his seminal book, [31]The
+Mythical Man-Month. Even if you haven’t, you’ve probably heard at least one
+colleague proclaim:
- This is a powerful metaphor for two reasons. First: it’s so vivid that
- it’s hard to forget (and easy to recall in a time of need). Second: it
- makes obvious a not-so-obvious conclusion. Which is:
+ Nine women can’t make a baby in one month!
- Adding manpower to a late software project makes it later.
+This is a powerful metaphor for two reasons. First: it’s so vivid that it’s
+hard to forget (and easy to recall in a time of need). Second: it makes obvious
+a not-so-obvious conclusion. Which is:
- That’s a hard pill to swallow, especially when your project is late.
- But it’s a truth pill, which makes it worth choking down. Here’s
- another truth pill that Brooks wrote in his paper [33]No Silver
- Bullet–Essence and Accident in Software Engineering:
+ Adding manpower to a late software project makes it later.
- There is no single development, in either technology or management
- technique, which by itself promises even one order of magnitude
- [tenfold] improvement within a decade in productivity, in
- reliability, in simplicity.
- __________________________________________________________________
+That’s a hard pill to swallow, especially when your project is late. But it’s a
+truth pill, which makes it worth choking down. Here’s another truth pill that
+Brooks wrote in his paper [32]No Silver Bullet–Essence and Accident in Software
+Engineering:
- For those who don’t understand the silver bullet reference… it’s
- [34]pulled from folklore where a bullet cast from silver is the only
- weapon that can kill a werewolf. Over time a silver bullet has come to
- represent “a simple, seemingly magical, solution to a difficult
- problem.” Brooks could have easily reached for [35]panacea instead, but
- I think the shiny characteristic of silver makes it the perfect analog
- to software solutions.
- __________________________________________________________________
+ There is no single development, in either technology or management
+ technique, which by itself promises even one order of magnitude [tenfold]
+ improvement within a decade in productivity, in reliability, in simplicity.
- I’ve found myself referencing this a [36]couple [37]times recently.
- Both of those conversations were in the context of [38]React, but the
- principle applies to every over-adopted technology.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- So, this post is a gentle reminder to my fellow software engineers:
- * Does a new tool promise to solve all your problems? It won’t
- * Do you think you’ve found the “one true tech”? You haven’t
- * Have a shiny hammer that looks great for hitting screws? It isn’t
+For those who don’t understand the silver bullet reference… it’s [33]pulled
+from folklore where a bullet cast from silver is the only weapon that can kill
+a werewolf. Over time a silver bullet has come to represent “a simple,
+seemingly magical, solution to a difficult problem.” Brooks could have easily
+reached for [34]panacea instead, but I think the shiny characteristic of silver
+makes it the perfect analog to software solutions.
- Please humor me while I [39]quote myself for a moment: (Hey, it’s
- easier than writing)
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- IFRAME: [40]https://www.youtube.com/embed/btIc-_dGz9k
+I’ve found myself referencing this a [35]couple [36]times recently. Both of
+those conversations were in the context of [37]React, but the principle applies
+to every over-adopted technology.
- Subscribe to [41]our YouTube channel for more clips like this, live
- show recordings, and more ✌️
+So, this post is a gentle reminder to my fellow software engineers:
- We tend to be kind of lazy and just take the big hammer and hit all
- the nails with it. Like, “Oh, I’ve found the panacea. This is gonna
- solve all my problems”, because it does solve some of your problems
- big-time.
+ • Does a new tool promise to solve all your problems? It won’t
+ • Do you think you’ve found the “one true tech”? You haven’t
+ • Have a shiny hammer that looks great for hitting screws? It isn’t
- But it’s also is gonna create other problems, and it’s also not
- gonna fit in every place that you can shove it. I mean, I know
- there’s React-based command line builders… And it’s like, okay, if
- you like components, cool. That makes sense. But why is React
- building your command-line app? I just don’t understand.
+Please humor me while I [38]quote myself for a moment: (Hey, it’s easier than
+writing)
- When I extemporaneously said “I just don’t understand”, I meant that
- the choice confounds me. But I do understand why people might make it.
+Subscribe to [39]our YouTube channel for more clips like this, live show
+recordings, and more ✌️
- Saying “use the right tool for the job” is easy, but actually selecting
- the right tool for the job is anything but. Good tools are hard to
- find, hard to evaluate, hard to learn. We have constraints, we have
- biases, we have shortcomings.
- But that’s all part of the work.
+ We tend to be kind of lazy and just take the big hammer and hit all the
+ nails with it. Like, “Oh, I’ve found the panacea. This is gonna solve all
+ my problems”, because it does solve some of your problems big-time.
- And if you “just use Go” or “just use React” or “just use Postgres” for
- every problem that crosses your keyboard, you’re just not putting in
- the work.
+ But it’s also is gonna create other problems, and it’s also not gonna fit
+ in every place that you can shove it. I mean, I know there’s React-based
+ command line builders… And it’s like, okay, if you like components, cool.
+ That makes sense. But why is React building your command-line app? I just
+ don’t understand.
- (And I say this as a guy who uses Postgres for most things! 😆)
- __________________________________________________________________
+When I extemporaneously said “I just don’t understand”, I meant that the choice
+confounds me. But I do understand why people might make it.
- If you enjoyed reading this, you’ll probably enjoy [42]Changelog News,
- my free weekly podcast + newsletter covering developer news worth your
- attention. I keep it brief (~8 min), entertaining & always on-point.
- Not so sure? Check out a [43]recent issue!
+Saying “use the right tool for the job” is easy, but actually selecting the
+right tool for the job is anything but. Good tools are hard to find, hard to
+evaluate, hard to learn. We have constraints, we have biases, we have
+shortcomings.
- Software moves fast. We help you keep up. Our weekly newsletter is
- brief, entertaining & always on-point.
- ____________________
- Get Changelog News
- (BUTTON)
- __________________________________________________________________
+But that’s all part of the work.
+
+And if you “just use Go” or “just use React” or “just use Postgres” for every
+problem that crosses your keyboard, you’re just not putting in the work.
+
+(And I say this as a guy who uses Postgres for most things! 😆)
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+If you enjoyed reading this, you’ll probably enjoy [40]Changelog News, my free
+weekly podcast + newsletter covering developer news worth your attention. I
+keep it brief (~8 min), entertaining & always on-point. Not so sure? Check out
+a [41]recent issue!
+
+Software moves fast. We help you keep up. Our weekly newsletter is brief,
+entertaining & always on-point.
+
+[42][ ]
+[43][Get Changelog News]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Discussion
- [44]Sign in or [45]Join to comment or subscribe
+[45]Sign in or [46]Join to comment or subscribe
- (BUTTON)
+Solomon Ucko
- (BUTTON) Solomon Ucko
+sollyucko
- sollyucko
- [46]Solomon Ucko
+[49] Solomon Ucko
- Solomon Ucko
+Solomon Ucko
- * [47]Twitter
- * [48]GitHub
- * [49]LinkedIn
+ • [50]Twitter
+ • [51]GitHub
+ • [52]LinkedIn
- [50]2023-05-25T03:42:39Z ago
+[53] 2023-05-25T03:42:39Z ago
- just use Rust, except possibly when you’re working with a platform
- designed for another language (e.g. web => HTML/CSS/JS, Android => Java
- or Kotlin, macOS/iOS => Objective-C or Swift, Microsoft Office macros
- => Visual Basic), though Rust does have FFI crates for all of these.
+just use Rust, except possibly when you’re working with a platform designed for
+another language (e.g. web => HTML/CSS/JS, Android => Java or Kotlin, macOS/iOS
+=> Objective-C or Swift, Microsoft Office macros => Visual Basic), though Rust
+does have FFI crates for all of these.
- [51]reply
+[54]reply
- (BUTTON)
+James Harr
- (BUTTON) James Harr
+jamesharr
- jamesharr
- [52]James Harr
+[57] James Harr
- James Harr
+James Harr
- * [53]GitHub
+ • [58]GitHub
- [54]2023-05-27T12:55:20Z ago
+[59] 2023-05-27T12:55:20Z ago
- Nine women can’t make a baby in one month!
+ Nine women can’t make a baby in one month!
- I quoted this to my wife once while trying to explain the concept from
- the book. She knew what I meant, but said (paraphrasing) it’s a micro
- aggression to pick out women and I might want to pick another example.
+I quoted this to my wife once while trying to explain the concept from the
+book. She knew what I meant, but said (paraphrasing) it’s a micro aggression to
+pick out women and I might want to pick another example.
- After some reflection and an initial knee jerk internal reaction of
- “no, it’s a fine example”, I agree with her. There’s no reason to
- change the book – it is what it is, it was written at a point in time,
- and it did it’s job of getting the readers to think. All that said, we
- can come up with a better example for the present and future. I don’t
- know what that example is, but I know we can do better.
+After some reflection and an initial knee jerk internal reaction of “no, it’s a
+fine example”, I agree with her. There’s no reason to change the book – it is
+what it is, it was written at a point in time, and it did it’s job of getting
+the readers to think. All that said, we can come up with a better example for
+the present and future. I don’t know what that example is, but I know we can do
+better.
- [55]reply
+[60]reply
- (BUTTON)
+Jerod Santo
- (BUTTON) Jerod Santo
+jerodsanto
- jerodsanto
- [56]Jerod Santo
+[63] Jerod Santo
- Jerod Santo
+Jerod Santo
- Omaha, Nebraska
+Omaha, Nebraska
- Jerod co-hosts [57]The Changelog, crashes [58]JS Party, and takes out
- the trash (his old code) once in awhile.
- * [59]Twitter
- * [60]GitHub
- * [61]LinkedIn
+Jerod co-hosts [64]The Changelog, crashes [65]JS Party, and takes out the trash
+(his old code) once in awhile.
- [62]2023-05-27T13:36:23Z ago
+ • [66]Twitter
+ • [67]GitHub
+ • [68]LinkedIn
- How is it a micro aggression? I do not understand.
+[69] 2023-05-27T13:36:23Z ago
- [63]reply
+How is it a micro aggression? I do not understand.
- (BUTTON)
+[70]reply
- (BUTTON) James Harr
+James Harr
- jamesharr
- [64]James Harr
+jamesharr
- James Harr
+[73] James Harr
- * [65]GitHub
+James Harr
- [66]2023-05-27T16:02:25Z ago
+ • [74]GitHub
- Well, maybe micro aggression isn’t the right term, but it’s something
- that left a bad taste in her mouth and I’m trying to remember exactly
- how she described it. I think you almost have to put your self in the
- shoes of someone who 1) has had to work upstream in an industry because
- of their gender 2) has had to deal with people in a society that see a
- women’s “job” is to bear children and careers come second at best 3)
- has had to deal with a lot of people having opinions over your body and
- what you do with it, most of which do not share your anatomy. After
- putting yourself in that position, the comparison starts to feel more
- icky.
+[75] 2023-05-27T16:02:25Z ago
- I’ll be honest, I’m defending a view I don’t entirely “get” and may not
- be capable of understanding. However, after seeing her reaction when I
- said that quote, this is one of those times where I’m going to say “I
- believe you”. I’ve been incredibly privileged in this world as a white
- male, and that’s a pretty big blindspot, so I’m putting trust in
- someone else to see what’s there.
+Well, maybe micro aggression isn’t the right term, but it’s something that left
+a bad taste in her mouth and I’m trying to remember exactly how she described
+it. I think you almost have to put your self in the shoes of someone who 1) has
+had to work upstream in an industry because of their gender 2) has had to deal
+with people in a society that see a women’s “job” is to bear children and
+careers come second at best 3) has had to deal with a lot of people having
+opinions over your body and what you do with it, most of which do not share
+your anatomy. After putting yourself in that position, the comparison starts to
+feel more icky.
- I’m not going to fault anyone for quoting it and you have nothing to
- apologize for; Part of the reason that quote works so effectively is
- how ridiculous it is. I’m just going to challenge people to do better,
- and it’s going to be hard.
+I’ll be honest, I’m defending a view I don’t entirely “get” and may not be
+capable of understanding. However, after seeing her reaction when I said that
+quote, this is one of those times where I’m going to say “I believe you”. I’ve
+been incredibly privileged in this world as a white male, and that’s a pretty
+big blindspot, so I’m putting trust in someone else to see what’s there.
- [67]reply
+I’m not going to fault anyone for quoting it and you have nothing to apologize
+for; Part of the reason that quote works so effectively is how ridiculous it
+is. I’m just going to challenge people to do better, and it’s going to be hard.
- (BUTTON)
+[76]reply
- (BUTTON) Jerod Santo
+Jerod Santo
- jerodsanto
- [68]Jerod Santo
+jerodsanto
- Jerod Santo
+[79] Jerod Santo
- Omaha, Nebraska
+Jerod Santo
- Jerod co-hosts [69]The Changelog, crashes [70]JS Party, and takes out
- the trash (his old code) once in awhile.
- * [71]Twitter
- * [72]GitHub
- * [73]LinkedIn
+Omaha, Nebraska
- [74]2023-05-28T12:43:12Z ago
+Jerod co-hosts [80]The Changelog, crashes [81]JS Party, and takes out the trash
+(his old code) once in awhile.
- I’ll be honest, I’m defending a view I don’t entirely “get” and may
- not be capable of understanding. However, after seeing her reaction
- when I said that quote, this is one of those times where I’m going
- to say “I believe you”
+ • [82]Twitter
+ • [83]GitHub
+ • [84]LinkedIn
- That’s a fair stance to take, but it doesn’t produce much of a
- convincing argument that will drive people to change. If you want
- people to starting using a better metaphor, I challenge you to come up
- with one.
+[85] 2023-05-28T12:43:12Z ago
- [75]reply
+ I’ll be honest, I’m defending a view I don’t entirely “get” and may not be
+ capable of understanding. However, after seeing her reaction when I said
+ that quote, this is one of those times where I’m going to say “I believe
+ you”
- (BUTTON)
+That’s a fair stance to take, but it doesn’t produce much of a convincing
+argument that will drive people to change. If you want people to starting using
+a better metaphor, I challenge you to come up with one.
- (BUTTON) Bryan Betts
+[86]reply
- bryan-ffd
- [76]Bryan Betts
+Bryan Betts
- Bryan Betts
+bryan-ffd
- * [77]GitHub
+[89] Bryan Betts
- [78]2023-06-28T12:58:27Z ago
+Bryan Betts
- “Over time a silver bullet has come to represent “a simple, seemingly
- magical, solution to a difficult problem.”
- Well, maybe - but what you’re actually referring to here is a magic
- bullet, or Zauberkugel. Over time, some people - yes, including
- award-winning engineers and scientists - have come to confuse the two.
+ • [90]GitHub
- [79]reply
+[91] 2023-06-28T12:58:27Z ago
- (BUTTON) Hide Overlay
+“Over time a silver bullet has come to represent “a simple, seemingly magical,
+solution to a difficult problem.”
+Well, maybe - but what you’re actually referring to here is a magic bullet, or
+Zauberkugel. Over time, some people - yes, including award-winning engineers
+and scientists - have come to confuse the two.
- * [80]About
- * [81]Contact
- * [82]888-974-CHLG (2454)
+[92]reply
- * [83]Twitter Icon
- * [84]Mastodon Icon
- * [85]LinkedIn Icon
- * [86]GitHub Icon
- * [87]YouTube Icon
- * [88]Instagram Icon
- * [89]TikTok Icon
+Hide Overlay
-[90]Podcasts
+ • [94]About
+ • [95]Contact
+ • [96]888-974-CHLG (2454)
- * [91]The Changelog
- * [92]Practical AI
- * [93]JS Party
- * [94]Ship It!
- * [95]Founders Talk
- * [96]Go Time
- * [97]Changelog Master Feed
- * ---
- * [98]Request For Commits
- * [99]Brain Science
- * [100]Away from Keyboard
- * [101]Backstage
- * [102]Spotlight
+ • [97] Twitter Icon
+ • [98] Mastodon Icon
+ • [99] LinkedIn Icon
+ • [100] GitHub Icon
+ • [101] YouTube Icon
+ • [102] Instagram Icon
+ • [103] TikTok Icon
+
+[104]Podcasts
+
+ • [105]The Changelog
+ • [106]Practical AI
+ • [107]JS Party
+ • [108]Ship It!
+ • [109]Founders Talk
+ • [110]Go Time
+ • [111]Changelog Master Feed
+ • ---
+ • [112]Request For Commits
+ • [113]Brain Science
+ • [114]Away from Keyboard
+ • [115]Spotlight
+ • [116]Backstage
Social
- * [103]Twitter
- * [104]Mastodon
- * [105]LinkedIn
- * [106]GitHub
- * [107]YouTube
- * [108]Instagram
- * [109]TikTok
+ • [117]Twitter
+ • [118]Mastodon
+ • [119]LinkedIn
+ • [120]GitHub
+ • [121]YouTube
+ • [122]Instagram
+ • [123]TikTok
Community
- * [110]Merch Shop
- * [111]Join the Community
- * [112]Code of Conduct
- * [113]Sign in to Slack
- * ---
- * [114]Request Episode
- * [115]Submit News
+ • [124]Merch Shop
+ • [125]Join the Community
+ • [126]Code of Conduct
+ • [127]Sign in to Slack
+ • ---
+ • [128]Request Episode
+ • [129]Submit News
Etc.
- * [116]Beats
- * [117]Posts
- * [118]Changelog Nightly
- * [119]Sponsor
- * [120]Search
- * [121]View Source
- * ---
- * [122]Report an Issue
- * [123]Terms & Conditions
- * [124]Privacy Policy
- * ---
- * [125]Status
+ • [130]Beats
+ • [131]Posts
+ • [132]Changelog Nightly
+ • [133]Sponsor
+ • [134]Search
+ • [135]View Source
+ • ---
+ • [136]Report an Issue
+ • [137]Terms & Conditions
+ • [138]Privacy Policy
+ • ---
+ • [139]Status
- [126]
+[140]
- Bandwidth
- Fastly
- [127]
+Bandwidth
- Hosting
- Fly
- [128]
+Fastly
+[141]
- Search
- Typesense
+Hosting
- (BUTTON) (BUTTON) (BUTTON)
- Player art
- (BUTTON) Previous Chapter (BUTTON) (BUTTON) (BUTTON) (BUTTON) Next
- Chapter
- (BUTTON) [1X] 0:00 ____________________ / 0:00
+Fly
+[142]
-References
+Search
- 1. https://changelog.com/feed
- 2. https://changelog.com/master/feed
- 3. https://changelog.com/posts/feed
- 4. https://changelog.com/feed.json
- 5. https://changelog.com/
- 6. https://changelog.com/
- 7. https://changelog.com/beats
- 8. https://changelog.com/posts
- 9. https://changelog.com/community
- 10. https://changelog.com/subscribe
- 11. https://changelog.com/++
- 12. https://changelog.com/live
- 13. https://changelog.com/news/submit
- 14. https://changelog.com/in
- 15. https://changelog.com/
- 16. https://changelog.com/podcasts
- 17. https://changelog.com/beats
- 18. https://changelog.com/posts
- 19. https://changelog.com/community
- 20. https://changelog.com/subscribe
- 21. https://changelog.com/++
- 22. https://changelog.com/news/submit
- 23. https://changelog.com/person/jerodsanto
- 24. https://changelog.com/posts
- 25. https://changelog.com/person/jerodsanto
- 26. https://changelog.com/posts/still-no-silver-bullet
- 27. https://changelog.com/topic/practices
- 28. https://changelog.com/topic/history
- 29. https://changelog.com/topic/react
- 30. https://en.wikipedia.org/wiki/Fred_Brooks
- 31. https://en.wikipedia.org/wiki/Brooks's_law
- 32. https://en.wikipedia.org/wiki/The_Mythical_Man-Month
- 33. http://worrydream.com/refs/Brooks-NoSilverBullet.pdf
- 34. https://en.wikipedia.org/wiki/Silver_bullet
- 35. https://en.wikipedia.org/wiki/Panacea_(medicine)
- 36. https://youtube.com/shorts/m5A8eQaaG8o
- 37. https://jsparty.fm/269#transcript-237
- 38. https://reactjs.org/
- 39. https://jsparty.fm/269#transcript-237
- 40. https://www.youtube.com/embed/btIc-_dGz9k
- 41. https://youtube.com/changelog
- 42. https://changelog.com/news
- 43. https://changelog.com/news/45/email
- 44. https://changelog.com/in
- 45. https://changelog.com/join
- 46. https://twitter.com/SolomonUcko
- 47. https://twitter.com/SolomonUcko
- 48. https://github.com/sollyucko
- 49. https://www.linkedin.com/in/solomon-ucko-143853155
- 50. https://changelog.com/posts/still-no-silver-bullet#comment-YX1k
- 51. javascript:void(0)
- 52. https://changelog.com/person/jamesharr
- 53. https://github.com/jamesharr
- 54. https://changelog.com/posts/still-no-silver-bullet#comment-yW7b
- 55. javascript:void(0)
- 56. https://changelog.com/person/jerodsanto
- 57. https://changelog.com/podcast
- 58. https://changelog.com/jsparty
- 59. https://twitter.com/jerodsanto
- 60. https://github.com/jerodsanto
- 61. https://www.linkedin.com/in/jerodsanto
- 62. https://changelog.com/posts/still-no-silver-bullet#comment-V31e
- 63. javascript:void(0)
- 64. https://changelog.com/person/jamesharr
- 65. https://github.com/jamesharr
- 66. https://changelog.com/posts/still-no-silver-bullet#comment-Zqom
- 67. javascript:void(0)
- 68. https://changelog.com/person/jerodsanto
- 69. https://changelog.com/podcast
- 70. https://changelog.com/jsparty
- 71. https://twitter.com/jerodsanto
- 72. https://github.com/jerodsanto
- 73. https://www.linkedin.com/in/jerodsanto
- 74. https://changelog.com/posts/still-no-silver-bullet#comment-qGM2
- 75. javascript:void(0)
- 76. https://github.com/bryan-ffd
- 77. https://github.com/bryan-ffd
- 78. https://changelog.com/posts/still-no-silver-bullet#comment-J3nq
- 79. javascript:void(0)
- 80. https://changelog.com/about
- 81. https://changelog.com/contact
- 82. tel:+1-888-974-2454
- 83. https://twitter.com/changelog
- 84. https://changelog.social/
- 85. https://linkedin.com/company/changelog
- 86. https://github.com/thechangelog
- 87. https://www.youtube.com/changelog
- 88. https://www.instagram.com/changelog_
- 89. https://www.tiktok.com/@changelog.com
- 90. https://changelog.com/podcasts
- 91. https://changelog.com/podcast
- 92. https://changelog.com/practicalai
- 93. https://changelog.com/jsparty
- 94. https://changelog.com/shipit
- 95. https://changelog.com/founderstalk
- 96. https://changelog.com/gotime
- 97. https://changelog.com/master
- 98. https://changelog.com/rfc
- 99. https://changelog.com/brainscience
- 100. https://changelog.com/afk
- 101. https://changelog.com/backstage
- 102. https://changelog.com/spotlight
- 103. https://twitter.com/changelog
- 104. https://changelog.social/
- 105. https://linkedin.com/company/changelog
- 106. https://github.com/thechangelog
- 107. https://www.youtube.com/changelog
- 108. https://www.instagram.com/changelog_
- 109. https://www.tiktok.com/@changelog.com
- 110. https://merch.changelog.com/
- 111. https://changelog.com/community
- 112. https://changelog.com/coc
- 113. https://changelog.slack.com/
- 114. https://changelog.com/request
- 115. https://changelog.com/news/submit
- 116. https://changelog.com/beats
- 117. https://changelog.com/posts
- 118. https://changelog.com/nightly
- 119. https://changelog.com/sponsor
- 120. https://changelog.com/search
- 121. https://github.com/thechangelog/changelog.com
- 122. https://github.com/thechangelog/changelog.com/issues/new
- 123. https://changelog.com/terms
- 124. https://changelog.com/privacy
- 125. https://status.changelog.com/
- 126. https://www.fastly.com/?utm_source=changelog
- 127. https://fly.io/
- 128. https://typesense.org/?utm_source=changelog&utm_campaign=changelog-search&utm_medium=referral
+Typesense
+Player art
+Previous Chapter Next Chapter
+[152][0 ]
+ [153][] [1X] 0:00[155][ ] / 0:00
+
+References:
+
+[1] https://changelog.com/
+[2] https://changelog.com/
+[3] https://changelog.com/beats
+[4] https://changelog.com/posts
+[5] https://changelog.com/community
+[6] https://changelog.com/subscribe
+[7] https://changelog.com/++
+[8] https://changelog.com/live
+[9] https://changelog.com/news/submit
+[10] https://changelog.com/in
+[13] https://changelog.com/
+[14] https://changelog.com/podcasts
+[15] https://changelog.com/beats
+[16] https://changelog.com/posts
+[17] https://changelog.com/community
+[18] https://changelog.com/subscribe
+[19] https://changelog.com/++
+[20] https://changelog.com/news/submit
+[22] https://changelog.com/person/jerodsanto
+[23] https://changelog.com/posts
+[24] https://changelog.com/person/jerodsanto
+[25] https://changelog.com/posts/still-no-silver-bullet
+[26] https://changelog.com/topic/practices
+[27] https://changelog.com/topic/history
+[28] https://changelog.com/topic/react
+[29] https://en.wikipedia.org/wiki/Fred_Brooks
+[30] https://en.wikipedia.org/wiki/Brooks%27s_law
+[31] https://en.wikipedia.org/wiki/The_Mythical_Man-Month
+[32] http://worrydream.com/refs/Brooks-NoSilverBullet.pdf
+[33] https://en.wikipedia.org/wiki/Silver_bullet
+[34] https://en.wikipedia.org/wiki/Panacea_(medicine)
+[35] https://youtube.com/shorts/m5A8eQaaG8o
+[36] https://jsparty.fm/269#transcript-237
+[37] https://reactjs.org/
+[38] https://jsparty.fm/269#transcript-237
+[39] https://youtube.com/changelog
+[40] https://changelog.com/news
+[41] https://changelog.com/news/45/email
+[45] https://changelog.com/in
+[46] https://changelog.com/join
+[49] https://twitter.com/SolomonUcko
+[50] https://twitter.com/SolomonUcko
+[51] https://github.com/sollyucko
+[52] https://www.linkedin.com/in/solomon-ucko-143853155
+[53] https://changelog.com/posts/still-no-silver-bullet#comment-YX1k
+[54] javascript:void(0)
+[57] https://changelog.com/person/jamesharr
+[58] https://github.com/jamesharr
+[59] https://changelog.com/posts/still-no-silver-bullet#comment-yW7b
+[60] javascript:void(0)
+[63] https://changelog.com/person/jerodsanto
+[64] https://changelog.com/podcast
+[65] https://changelog.com/jsparty
+[66] https://twitter.com/jerodsanto
+[67] https://github.com/jerodsanto
+[68] https://www.linkedin.com/in/jerodsanto
+[69] https://changelog.com/posts/still-no-silver-bullet#comment-V31e
+[70] javascript:void(0)
+[73] https://changelog.com/person/jamesharr
+[74] https://github.com/jamesharr
+[75] https://changelog.com/posts/still-no-silver-bullet#comment-Zqom
+[76] javascript:void(0)
+[79] https://changelog.com/person/jerodsanto
+[80] https://changelog.com/podcast
+[81] https://changelog.com/jsparty
+[82] https://twitter.com/jerodsanto
+[83] https://github.com/jerodsanto
+[84] https://www.linkedin.com/in/jerodsanto
+[85] https://changelog.com/posts/still-no-silver-bullet#comment-qGM2
+[86] javascript:void(0)
+[89] https://github.com/bryan-ffd
+[90] https://github.com/bryan-ffd
+[91] https://changelog.com/posts/still-no-silver-bullet#comment-J3nq
+[92] javascript:void(0)
+[94] https://changelog.com/about
+[95] https://changelog.com/contact
+[96] tel:+1-888-974-2454
+[97] https://twitter.com/changelog
+[98] https://changelog.social/
+[99] https://linkedin.com/company/changelog
+[100] https://github.com/thechangelog
+[101] https://www.youtube.com/changelog
+[102] https://www.instagram.com/changelog_
+[103] https://www.tiktok.com/@changelog.com
+[104] https://changelog.com/podcasts
+[105] https://changelog.com/podcast
+[106] https://changelog.com/practicalai
+[107] https://changelog.com/jsparty
+[108] https://changelog.com/shipit
+[109] https://changelog.com/founderstalk
+[110] https://changelog.com/gotime
+[111] https://changelog.com/master
+[112] https://changelog.com/rfc
+[113] https://changelog.com/brainscience
+[114] https://changelog.com/afk
+[115] https://changelog.com/spotlight
+[116] https://changelog.com/backstage
+[117] https://twitter.com/changelog
+[118] https://changelog.social/
+[119] https://linkedin.com/company/changelog
+[120] https://github.com/thechangelog
+[121] https://www.youtube.com/changelog
+[122] https://www.instagram.com/changelog_
+[123] https://www.tiktok.com/@changelog.com
+[124] https://merch.changelog.com/
+[125] https://changelog.com/community
+[126] https://changelog.com/coc
+[127] https://changelog.slack.com/
+[128] https://changelog.com/request
+[129] https://changelog.com/news/submit
+[130] https://changelog.com/beats
+[131] https://changelog.com/posts
+[132] https://changelog.com/nightly
+[133] https://changelog.com/sponsor
+[134] https://changelog.com/search
+[135] https://github.com/thechangelog/changelog.com
+[136] https://github.com/thechangelog/changelog.com/issues/new
+[137] https://changelog.com/terms
+[138] https://changelog.com/privacy
+[139] https://status.changelog.com/
+[140] https://www.fastly.com/?utm_source=changelog
+[141] https://fly.io/
+[142] https://typesense.org/?utm_source=changelog&utm_campaign=changelog-search&utm_medium=referral
diff --git a/static/archive/chrisnotes-io-ijc95x.txt b/static/archive/chrisnotes-io-ijc95x.txt
index b0c6e5b..129d5b5 100644
--- a/static/archive/chrisnotes-io-ijc95x.txt
+++ b/static/archive/chrisnotes-io-ijc95x.txt
@@ -1,442 +1,422 @@
- #[1]Notes from your friend Chris
-
- [2]Notes from your friend Chris
- [3]Home [4]Archives [5]Search [6]Feed
+[1] Notes from your friend Chris
+[2]Home [3]Archives [4]Search [5]Feed
Digital Notetaking Stack
- So I use a paper notebook. To be more specific, I use a notebook binder
- with three separate notebooks in it. Each notebook serves a specific
- purpose. The first one is for tasks and to-dos. The second one is just
- a scratch pad for absolutely anything under the sun: drawings,
- thoughts, somebody’s phone number, anything. The last one is a very
- regimented journal where I reflect on personal experiences.
+So I use a paper notebook. To be more specific, I use a notebook binder with
+three separate notebooks in it. Each notebook serves a specific purpose. The
+first one is for tasks and to-dos. The second one is just a scratch pad for
+absolutely anything under the sun: drawings, thoughts, somebody’s phone number,
+anything. The last one is a very regimented journal where I reflect on personal
+experiences.
- Sure, I could just use a single notebook for all of these purposes.
- Hell, I could use a stack of printer paper for all these purposes; but
- it would be clunky, it would be difficult, and I wouldn’t really want
- to use it because it wouldn’t be very satisfying.
+Sure, I could just use a single notebook for all of these purposes. Hell, I
+could use a stack of printer paper for all these purposes; but it would be
+clunky, it would be difficult, and I wouldn’t really want to use it because it
+wouldn’t be very satisfying.
- So, I’ve developed a system that works for taking paper notes. It’s
- custom tailored to my goals and how my brain works. And as a cherry on
- top, I picked a notebook binder and pen that I really enjoy touching
- and looking at, which makes the whole system just that much better.
+So, I’ve developed a system that works for taking paper notes. It’s custom
+tailored to my goals and how my brain works. And as a cherry on top, I picked a
+notebook binder and pen that I really enjoy touching and looking at, which
+makes the whole system just that much better.
- Similarly, I use a set of different apps for different purposes when
- I’m taking notes in my digital world.
+Similarly, I use a set of different apps for different purposes when I’m taking
+notes in my digital world.
- Yes, I could probably stick to just using the default notes app on my
- phone, but it would be clunky, there would be friction, it would not
- adapt to the way my brain works, and I would end up using it less. Plus
- it isn’t really that satisfying to look at… but that’s just my opinion.
+Yes, I could probably stick to just using the default notes app on my phone,
+but it would be clunky, there would be friction, it would not adapt to the way
+my brain works, and I would end up using it less. Plus it isn’t really that
+satisfying to look at… but that’s just my opinion.
- So instead, after nearly a decade of trial and error, I’ve developed a
- system and way of working with my notes in my digital world that brings
- me immense satisfaction and works well with the way my brain works and
- the way my lifestyle is currently set up.
+So instead, after nearly a decade of trial and error, I’ve developed a system
+and way of working with my notes in my digital world that brings me immense
+satisfaction and works well with the way my brain works and the way my
+lifestyle is currently set up.
- DISCLAIMERS:
- * This is not me trying to convince you to use the apps that I use.
- This is what works for me, and is very tailored to my brain and
- life. I’m not here to tell you what to use. But if hearing about my
- setup gives you ideas, that’s great!
- * This is something I will continue to change and improve. It’s been
- a long evolution to land on this setup. Trial and error was
- involved, and will continue to be. I think there’s an ebb and flow
- to changing your setup. If you do it too often, you lose
- productivity. If you don’t do it enough, your setup may stagnate
- and fail to match your lifestyle.
- * This is a values-based notetaking setup. I believe in owning my own
- data, having an easily exportable format (markdown), and using
- tools that are extensible & hackable. For someone who doesn’t share
- these values, this may seem overbuilt or convoluted or not native
- enough or something.
- * This is not written for the PKM enthusiast community. It’s a basic,
- balanced setup using tools that are widely known. If you’re a
- longtime Personal Knowledge Management guru, there won’t be
- anything new for you here. This is written for the layman who is
- dissatisfied with their current setup and looking for inspiration.
+DISCLAIMERS:
- Anyway, if digital notetaking is something that never really clicked
- for you, or if you currently have a workflow that you’re not pleased
- with, this might be a blog article for you. Let me know on [7]Mastodon!
+ • This is not me trying to convince you to use the apps that I use. This is
+ what works for me, and is very tailored to my brain and life. I’m not here
+ to tell you what to use. But if hearing about my setup gives you ideas,
+ that’s great!
+ • This is something I will continue to change and improve. It’s been a long
+ evolution to land on this setup. Trial and error was involved, and will
+ continue to be. I think there’s an ebb and flow to changing your setup. If
+ you do it too often, you lose productivity. If you don’t do it enough, your
+ setup may stagnate and fail to match your lifestyle.
+ • This is a values-based notetaking setup. I believe in owning my own data,
+ having an easily exportable format (markdown), and using tools that are
+ extensible & hackable. For someone who doesn’t share these values, this may
+ seem overbuilt or convoluted or not native enough or something.
+ • This is not written for the PKM enthusiast community. It’s a basic,
+ balanced setup using tools that are widely known. If you’re a longtime
+ Personal Knowledge Management guru, there won’t be anything new for you
+ here. This is written for the layman who is dissatisfied with their current
+ setup and looking for inspiration.
+
+Anyway, if digital notetaking is something that never really clicked for you,
+or if you currently have a workflow that you’re not pleased with, this might be
+a blog article for you. Let me know on [6]Mastodon!
Overview
- i. Intake / Short-term notes
- ii. Long-term notes
- iii. Shared / Published notes
- iv. Collaborative notes
- v. Closing thoughts
+ i. Intake / Short-term notes
+ii. Long-term notes
+iii. Shared / Published notes
+iv. Collaborative notes
+ v. Closing thoughts
Intake / Short-term notes
- One of the most important parts of my setup is my intake app. I hope
- you’ve never had to experience this feeling:
+One of the most important parts of my setup is my intake app. I hope you’ve
+never had to experience this feeling:
- Your friend names a cool restaurant or book for you to look up
- later. You hastily pull up your notes app to write it down. But
- wait. Where should you make the note? Does restaurant fall under
- your travel folder? Or your food folder? What should you title it?
- Do you need to make a new folder? While you’re fiddling with your
- app your friend has already started talking about that other boba
- place you should explore. Should that go in a whole other note? Oh
- god.
+ Your friend names a cool restaurant or book for you to look up later. You
+ hastily pull up your notes app to write it down. But wait. Where should you
+ make the note? Does restaurant fall under your travel folder? Or your food
+ folder? What should you title it? Do you need to make a new folder? While
+ you’re fiddling with your app your friend has already started talking about
+ that other boba place you should explore. Should that go in a whole other
+ note? Oh god.
- I feel like a lot of people give up after going through this a couple
- times and their notes app just ends up being a hodge-podge of
- unorganized, random shit that they dread looking back at later.
+I feel like a lot of people give up after going through this a couple times and
+their notes app just ends up being a hodge-podge of unorganized, random shit
+that they dread looking back at later.
- This is exactly why I use an intake app, and my app of choice for this
- incredibly important role is, of course, Drafts.
+This is exactly why I use an intake app, and my app of choice for this
+incredibly important role is, of course, Drafts.
- [8]✨Drafts✨
+[7]✨Drafts✨
- Drafts is made for this exact purpose. By default, it opens to a blank
- new note. Whatever you type as the first line is considered the title.
- And it has this insane concept called Actions that lets you quickly
- process your notes by moving them elsewhere through deep interactions
- with your other existing apps.
+Drafts is made for this exact purpose. By default, it opens to a blank new
+note. Whatever you type as the first line is considered the title. And it has
+this insane concept called Actions that lets you quickly process your notes by
+moving them elsewhere through deep interactions with your other existing apps.
- Let’s look at some pictures:
+Let’s look at some pictures:
- [723b4f53-202a-41b6-981c-d1e2710d6e47.png]
+[723b4f53-202a-41b6-981c-d1e2710d6e47]
- [896a49c3-ec20-4dff-89ac-33f9cf1e6120.png]
+[896a49c3-ec20-4dff-89ac-33f9cf1e6120]
- [78912a4e-95cc-463f-af64-5e55f4ddb395.png]
+[78912a4e-95cc-463f-af64-5e55f4ddb395]
- In the leftmost image, you can see where I keep Drafts. Front and
- center, only app in my bottom drawer.
+In the leftmost image, you can see where I keep Drafts. Front and center, only
+app in my bottom drawer.
- Middle image, you have the first thing you see when the app opens: a
- blank note to write that restaurant / song / boba place.
+Middle image, you have the first thing you see when the app opens: a blank note
+to write that restaurant / song / boba place.
- Rightmost image, you have the actions pane.
+Rightmost image, you have the actions pane.
- The actions in this pane are customized to my workflow. You are able to
- configure multiple pages, but I’m content with just one for now.
+The actions in this pane are customized to my workflow. You are able to
+configure multiple pages, but I’m content with just one for now.
- Drafting a text to your mom? Send it as a text message after you’ve
- perfected it. Shopping list? Export straight into wherever you keep
- that (for me it’s Things). Deep thought that’s perhaps a little too
- deep? File it away in Day One where it will never see the light of day.
+Drafting a text to your mom? Send it as a text message after you’ve perfected
+it. Shopping list? Export straight into wherever you keep that (for me it’s
+Things). Deep thought that’s perhaps a little too deep? File it away in Day One
+where it will never see the light of day.
- Basic tagging, shortcuts integration, and an archive folder really tie
- everything together. Process a ton of drafts at once by selecting them
- in the app and then doing a batch operation.
+Basic tagging, shortcuts integration, and an archive folder really tie
+everything together. Process a ton of drafts at once by selecting them in the
+app and then doing a batch operation.
- Drafts comes with a pretty comprehensive set of actions right out of
- the box, but the true power here comes from tapping into the [9]Drafts
- Directory: a massive repository of actions sourced from the Drafts
- community (as well as many written by the creator).
+Drafts comes with a pretty comprehensive set of actions right out of the box,
+but the true power here comes from tapping into the [8]Drafts Directory: a
+massive repository of actions sourced from the Drafts community (as well as
+many written by the creator).
- Every app you could imagine is in this directory.
+Every app you could imagine is in this directory.
- And the best part: if your app isn’t in there you can write your own
- action!
+And the best part: if your app isn’t in there you can write your own action!
- Drafts could honestly take up a whole series of blog posts so I’ll stop
- there for now. I haven’t even scratched the surface of what it can do,
- but you really don’t need to dive very deep to reap the benefits.
+Drafts could honestly take up a whole series of blog posts so I’ll stop there
+for now. I haven’t even scratched the surface of what it can do, but you really
+don’t need to dive very deep to reap the benefits.
- Let’s table Drafts for now. It’ll come up later with how it pipes into
- my other systems.
+Let’s table Drafts for now. It’ll come up later with how it pipes into my other
+systems.
Long-term notes
- So you may have picked up on the fact that notes don’t stay in Drafts
- long. They either get exported or archived.
+So you may have picked up on the fact that notes don’t stay in Drafts long.
+They either get exported or archived.
- Not every note is worthy of a permanent place in your note-taking
- kingdom. Embracing this concept was a huge step in cleaning up my
- digital world and starting to build a meaningful notes database for my
- life.
+Not every note is worthy of a permanent place in your note-taking kingdom.
+Embracing this concept was a huge step in cleaning up my digital world and
+starting to build a meaningful notes database for my life.
- As I continued to acclimate to digital notes, I noticed that certain
- note categories began to make themselves known.
+As I continued to acclimate to digital notes, I noticed that certain note
+categories began to make themselves known.
- [11b85744-48ac-4c2d-a817-6e813929b837.png]
+[11b85744-48ac-4c2d-a817-6e813929b837]
- The middle 3 folders are the important ones to note here.
+The middle 3 folders are the important ones to note here.
Core
- My core folder is where deeply personal stuff goes. Longterm goals,
- journal entries, guiding principles and personal mantras. I wouldn’t
- expect you to understand mine, but I’d encourage anyone to explore this
- category of notes for themselves.
+My core folder is where deeply personal stuff goes. Longterm goals, journal
+entries, guiding principles and personal mantras. I wouldn’t expect you to
+understand mine, but I’d encourage anyone to explore this category of notes for
+themselves.
- The notes in this folder don’t change much. But I recently started
- recording a daily voice note diary of my day that I then transcribe and
- summarize with AI.
+The notes in this folder don’t change much. But I recently started recording a
+daily voice note diary of my day that I then transcribe and summarize with AI.
- I also do yearly, quarterly, monthly, and weekly planning sessions, and
- the artifacts from these sessions often end up in here.
+I also do yearly, quarterly, monthly, and weekly planning sessions, and the
+artifacts from these sessions often end up in here.
Projects
- Projects is my favorite folder in my long-term notes.
+Projects is my favorite folder in my long-term notes.
- For me, this is a place for all kinds of things. Packing lists +
- itineraries + other details for an upcoming trip, startup ideas,
- potential blog posts, plans and details for my numerous hobbies.
+For me, this is a place for all kinds of things. Packing lists + itineraries +
+other details for an upcoming trip, startup ideas, potential blog posts, plans
+and details for my numerous hobbies.
- Notes in here often originate in Drafts and get quickly exported to my
- projects folder via Drafts actions.
+Notes in here often originate in Drafts and get quickly exported to my projects
+folder via Drafts actions.
- Projects are usually temporary, and get moved to my archive folder when
- they’re completed (or when I get bored and move onto the next hobby).
+Projects are usually temporary, and get moved to my archive folder when they’re
+completed (or when I get bored and move onto the next hobby).
Reference
- This is for lists and information that I will want to keep as
- reference. Quotes, wishlists, movie bucket list, books to read, etc.
+This is for lists and information that I will want to keep as reference.
+Quotes, wishlists, movie bucket list, books to read, etc.
- I used to maintain a personal wiki of information on different topics.
- Zettelkasten-esque, my knowledge wiki is currently in need of cleanup
- and will likely be featured in its own blog post if I continue to work
- on it.
+I used to maintain a personal wiki of information on different topics.
+Zettelkasten-esque, my knowledge wiki is currently in need of cleanup and will
+likely be featured in its own blog post if I continue to work on it.
Other folders
- Archive is self-explanatory. Old notes go in here.
+Archive is self-explanatory. Old notes go in here.
- Templates is for fill-in-the-blank templates for notes that I take
- often. Like those yearly/quarterly/etc check-ins and certain types of
- projects. There’s an Obsidian plugin that has some functionality to
- take advantage of these, but right now I just duplicate and move
- markdown files manually as-needed. Nothing fancy.
- __________________________________________________________________
+Templates is for fill-in-the-blank templates for notes that I take often. Like
+those yearly/quarterly/etc check-ins and certain types of projects. There’s an
+Obsidian plugin that has some functionality to take advantage of these, but
+right now I just duplicate and move markdown files manually as-needed. Nothing
+fancy.
- I find this setup to be just enough. My main folders allow plenty of
- flexibility within them for me to develop all kinds of systems to match
- how my brain works.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+I find this setup to be just enough. My main folders allow plenty of
+flexibility within them for me to develop all kinds of systems to match how my
+brain works.
Apps and stuff
- Yes, yes, we’ll talk about the app I use, but that’s much less
- important than the underlying foundation.
+Yes, yes, we’ll talk about the app I use, but that’s much less important than
+the underlying foundation.
- My long-term note-taking system is really just two things:
- * A collection of markdown files
- * A syncing service that circulates these files between my devices
+My long-term note-taking system is really just two things:
- If you commit to using the first, you can choose whatever you want for
- the second and migrate between syncing providers at-will with minimal
- headache. I’m not going to say much more on that, since others have
- covered it very well ([10]File over App from one of the people
- responsible for Obsidian).
+ • A collection of markdown files
+ • A syncing service that circulates these files between my devices
- And as long as you have these two, you can access all of your notes on
- all of your devices with whatever Markdown tools you’d like. Ultimate
- freedom, extensibility, and hackability.
+If you commit to using the first, you can choose whatever you want for the
+second and migrate between syncing providers at-will with minimal headache. I’m
+not going to say much more on that, since others have covered it very well ([9]
+File over App from one of the people responsible for Obsidian).
- That said, I use Obsidian.
+And as long as you have these two, you can access all of your notes on all of
+your devices with whatever Markdown tools you’d like. Ultimate freedom,
+extensibility, and hackability.
- [11]✨Obsidian✨
+That said, I use Obsidian.
- My go-to sync tool was Dropbox for a long time, but after committing
- fully to Obsidian as my default app across Mac / iPad / iPhone I’ve
- switched over to Obsidian Sync for the E2E encryption, longer note
- history, and seamless integration with Obsidian.
+[10]✨Obsidian✨
- It basically works like Dropbox used to before the weird Apple OS
- integration stuff. Obsidian Sync downloads all the files onto your
- device, so you still can access them with any markdown editor that has
- access to the filesystem.
+My go-to sync tool was Dropbox for a long time, but after committing fully to
+Obsidian as my default app across Mac / iPad / iPhone I’ve switched over to
+Obsidian Sync for the E2E encryption, longer note history, and seamless
+integration with Obsidian.
- Drafts can export to my longterm notes via both the OS filesystem and
- Obsidian app urls. Same for Shortcuts, which I’ll get to later.
+It basically works like Dropbox used to before the weird Apple OS integration
+stuff. Obsidian Sync downloads all the files onto your device, so you still can
+access them with any markdown editor that has access to the filesystem.
- Obsidian also plays nicely with iCloud, and supports Dropbox / Google
- Drive / S3 through its community plugins. I have it connected to my
- Dropbox for publishing / sharing notes, which I’ll get into in a bit.
+Drafts can export to my longterm notes via both the OS filesystem and Obsidian
+app urls. Same for Shortcuts, which I’ll get to later.
- My main reasons for using Obsidian are:
- * It has command palette
- * It has quick open
- * It’s hackable & has community plugins
+Obsidian also plays nicely with iCloud, and supports Dropbox / Google Drive /
+S3 through its community plugins. I have it connected to my Dropbox for
+publishing / sharing notes, which I’ll get into in a bit.
- Honestly, the specific app here doesn’t really matter as much as the
- underlying system. I could switch to using Ulysses or 1Writer or Byword
- or nvAlt or something else entirely if I wanted.
+My main reasons for using Obsidian are:
- I will say, like Drafts, Obsidian is a product of thoughtful design.
- You don’t need to dive to deep to reap the benefits. But if you want to
- be a power user, there’s a LOT it can do. For me, the important thing
- is that I can open files and do stuff with them easily, and I can hack
- it to accommodate to pretty much any use case my weird brain comes up
- with.
+ • It has command palette
+ • It has quick open
+ • It’s hackable & has community plugins
- Obsidian really knocks it out of the park for me, so I use it almost
- exclusively right now (for long-term notes).
+Honestly, the specific app here doesn’t really matter as much as the underlying
+system. I could switch to using Ulysses or 1Writer or Byword or nvAlt or
+something else entirely if I wanted.
+
+I will say, like Drafts, Obsidian is a product of thoughtful design. You don’t
+need to dive to deep to reap the benefits. But if you want to be a power user,
+there’s a LOT it can do. For me, the important thing is that I can open files
+and do stuff with them easily, and I can hack it to accommodate to pretty much
+any use case my weird brain comes up with.
+
+Obsidian really knocks it out of the park for me, so I use it almost
+exclusively right now (for long-term notes).
Published / shared notes
- I’m not going to shit on Notion in this post (not much, at least), but
- one thing I really missed from migrating from it was the
- ease-of-sharing.
+I’m not going to shit on Notion in this post (not much, at least), but one
+thing I really missed from migrating from it was the ease-of-sharing.
- I would put together an itinerary, packing list, cost breakdown, and
- car-pooling plan for group camping trips in minutes, hit the share
- button, and fire it off to my group chat of friends with no hiccups.
+I would put together an itinerary, packing list, cost breakdown, and
+car-pooling plan for group camping trips in minutes, hit the share button, and
+fire it off to my group chat of friends with no hiccups.
- I had been craving that functionality in my new note-taking system, so
- I built it. Kind of.
+I had been craving that functionality in my new note-taking system, so I built
+it. Kind of.
- Before we get to that, let’s talk about my workflow for posting blog
- articles.
+Before we get to that, let’s talk about my workflow for posting blog articles.
Publishing blog posts
- Remember how I said I use Dropbox still for sharing / publishing?
+Remember how I said I use Dropbox still for sharing / publishing?
- I do that with help from a service called Blot.
+I do that with help from a service called Blot.
- [12]✨Blot✨
+[11]✨Blot✨
- Blot turns a folder in your Dropbox account into a fully functioning
- blog.
+Blot turns a folder in your Dropbox account into a fully functioning blog.
- Their website explains it all, but basically to publish this article I
- literally just dropped it into a folder in my Dropbox, which I can do
- without leaving Obsidian.
+Their website explains it all, but basically to publish this article I
+literally just dropped it into a folder in my Dropbox, which I can do without
+leaving Obsidian.
- I wouldn’t say this is anything groundbreaking, but I find it immensely
- satisfying.
+I wouldn’t say this is anything groundbreaking, but I find it immensely
+satisfying.
Sharing notes
- Okay, back to Notion-esque sharing.
+Okay, back to Notion-esque sharing.
- Let’s say I put together a travel itinerary for a camping trip in my
- Projects folder. It has a list of everyone attending, cost breakdown,
- directions, packing list, and pictures of the campsite to drum up hype.
+Let’s say I put together a travel itinerary for a camping trip in my Projects
+folder. It has a list of everyone attending, cost breakdown, directions,
+packing list, and pictures of the campsite to drum up hype.
- It’s all ready to go, but I need to share it out to my friends.
+It’s all ready to go, but I need to share it out to my friends.
- Enter Blot. Same service, different folder. This time, instead of
- having Blot publish to chrisnotes.io, I have a separate domain I use
- only for this purpose. I move the note to the shared folder and shoot
- my friends the link.
+Enter Blot. Same service, different folder. This time, instead of having Blot
+publish to chrisnotes.io, I have a separate domain I use only for this purpose.
+I move the note to the shared folder and shoot my friends the link.
- The end. No fuss, no need for them to have an account, it’s just
- published to a non-indexed domain that I use as an external
- file/note-share.
+The end. No fuss, no need for them to have an account, it’s just published to a
+non-indexed domain that I use as an external file/note-share.
- ”But it’s not collaborative!” Yeah, and it’s not meant to be.
+”But it’s not collaborative!” Yeah, and it’s not meant to be.
Collaborative notes
- Okay, so once in a blue moon I have a valid reason to collaborate on a
- note with someone. It’s incredibly rare, and usually a very niche
- use-case.
+Okay, so once in a blue moon I have a valid reason to collaborate on a note
+with someone. It’s incredibly rare, and usually a very niche use-case.
- If it’s like a Resume or something, I use Google Drive, because the
- output artifact is a document.
+If it’s like a Resume or something, I use Google Drive, because the output
+artifact is a document.
- If it’s for brainstorming or something, Figma.
+If it’s for brainstorming or something, Figma.
- If it’s project tracking, Notion.
+If it’s project tracking, Notion.
- These aren’t really notes anymore. This is a one-off collaboration with
- a specific outcome in mind, so it doesn’t really fall into the purview
- of this post.
+These aren’t really notes anymore. This is a one-off collaboration with a
+specific outcome in mind, so it doesn’t really fall into the purview of this
+post.
- To be honest, I don’t think my personal notes database is something
- that would ever require collaboration. My notes are deeply personal,
- and I like it that way. I can publish if I need to, and there are
- plenty of collaborative tools that work for other tasks. But I have yet
- to need real-time collaboration on my actual notes.
+To be honest, I don’t think my personal notes database is something that would
+ever require collaboration. My notes are deeply personal, and I like it that
+way. I can publish if I need to, and there are plenty of collaborative tools
+that work for other tasks. But I have yet to need real-time collaboration on my
+actual notes.
My gripe with Notion
- Okay fine, quick note on Notion. While it’s a powerful tool that sparks
- creativity in a very attractive interface, it goes against my core
- values. You don’t own your data, it’s on their servers the entire time.
- Offline mode barely works. Exporting is a mess because while they
- present themselves as Markdown-esque, their stuff is so custom it’s a
- mess to port to other apps.
+Okay fine, quick note on Notion. While it’s a powerful tool that sparks
+creativity in a very attractive interface, it goes against my core values. You
+don’t own your data, it’s on their servers the entire time. Offline mode barely
+works. Exporting is a mess because while they present themselves as
+Markdown-esque, their stuff is so custom it’s a mess to port to other apps.
- You get punished as soon as you try to leave.
+You get punished as soon as you try to leave.
- Best of luck to anyone entangled in that system. It took some work to
- get my notes out of Notion, and I will not be going back.
+Best of luck to anyone entangled in that system. It took some work to get my
+notes out of Notion, and I will not be going back.
Closing thoughts
- You made it to the end!
+You made it to the end!
- Personally, after having tried a lot of tools with varying levels of
- depth and complexity, I find this setup very balanced.
+Personally, after having tried a lot of tools with varying levels of depth and
+complexity, I find this setup very balanced.
- It does just enough. I haven’t gone too deep into any of the tools.
- It’s still portable. I could still switch stuff around with very little
- overhead if I wanted to.
+It does just enough. I haven’t gone too deep into any of the tools. It’s still
+portable. I could still switch stuff around with very little overhead if I
+wanted to.
- Being candid, my sync system is the one thing I am considering
- changing. I don’t like that Obsidian Sync has no way to run headless,
- and has no API access for other apps to tap into. If I wanted to change
- editor, I’d need to switch back to Dropbox. It wouldn’t take much to
- make the switch: maybe 5 minutes to update the config across all my
- devices.
+Being candid, my sync system is the one thing I am considering changing. I
+don’t like that Obsidian Sync has no way to run headless, and has no API access
+for other apps to tap into. If I wanted to change editor, I’d need to switch
+back to Dropbox. It wouldn’t take much to make the switch: maybe 5 minutes to
+update the config across all my devices.
- But that’s the only thing I’m really not happy with right now. I find
- this system pretty seamless to work with. It has structure and
- organization, without being so confined that it limits creativity.
+But that’s the only thing I’m really not happy with right now. I find this
+system pretty seamless to work with. It has structure and organization, without
+being so confined that it limits creativity.
Bonus goodies
- If you made it this far, you’re either really into notetaking systems
- or you’re friends with me. Either way, you might get a kick out of some
- of the cool functionality that comes from a system like this.
+If you made it this far, you’re either really into notetaking systems or you’re
+friends with me. Either way, you might get a kick out of some of the cool
+functionality that comes from a system like this.
Custom share sheet actions
- Any time I’m browsing the web and come across something I want to buy
- later, I can instantly append it to my Wishlist note using a share
- sheet action that uses Obsidian’s deep-linking.
+Any time I’m browsing the web and come across something I want to buy later, I
+can instantly append it to my Wishlist note using a share sheet action that
+uses Obsidian’s deep-linking.
- I could easily replicate this functionality using the OS filesystem in
- shortcuts.
+I could easily replicate this functionality using the OS filesystem in
+shortcuts.
- Or, if I was using Dropbox, I could do it with Dropbox’s shortcut
- integrations.
+Or, if I was using Dropbox, I could do it with Dropbox’s shortcut integrations.
- I have a similar shortcut action for prepending selected text to my
- Quotes note.
+I have a similar shortcut action for prepending selected text to my Quotes
+note.
- If I wanted, I could have an automation that downloads the current
- weather and top news stories to a daily note for me to review when I
- start my morning.
+If I wanted, I could have an automation that downloads the current weather and
+top news stories to a daily note for me to review when I start my morning.
- With a little scripting, you can really bend any of these tools / files
- to do whatever you want because of the format.
+With a little scripting, you can really bend any of these tools / files to do
+whatever you want because of the format.
- Anyway, thanks so much for reading this far. I hope you got something
- from it. And if you have any input, please let me know. I’m not going
- to pretend I’m any kind of guru, and I love learning new things. If you
- have suggestions or ideas or feedback, please send them my way on
- [13]Mastodon!
- __________________________________________________________________
+Anyway, thanks so much for reading this far. I hope you got something from it.
+And if you have any input, please let me know. I’m not going to pretend I’m any
+kind of guru, and I love learning new things. If you have suggestions or ideas
+or feedback, please send them my way on [12]Mastodon!
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Date
- September 4, 2023
+September 4, 2023
-References
+References:
- 1. https://chrisnotes.io/feed.rss
- 2. https://chrisnotes.io/
- 3. https://chrisnotes.io/
- 4. https://chrisnotes.io/archives
- 5. https://chrisnotes.io/search
- 6. https://chrisnotes.io/feed.rss
- 7. https://mastodon.social/@chrisnotes
- 8. https://getdrafts.com/
- 9. https://directory.getdrafts.com/
- 10. https://stephanango.com/file-over-app
- 11. http://obsidian.md/
- 12. https://blot.im/
- 13. https://mastodon.social/@chrisnotes
+[1] https://chrisnotes.io/
+[2] https://chrisnotes.io/
+[3] https://chrisnotes.io/archives
+[4] https://chrisnotes.io/search
+[5] https://chrisnotes.io/feed.rss
+[6] https://mastodon.social/@chrisnotes
+[7] https://getdrafts.com/
+[8] https://directory.getdrafts.com/
+[9] https://stephanango.com/file-over-app
+[10] http://obsidian.md/
+[11] https://blot.im/
+[12] https://mastodon.social/@chrisnotes
diff --git a/static/archive/cloud-google-com-windxx.txt b/static/archive/cloud-google-com-windxx.txt
index c5be667..9946a02 100644
--- a/static/archive/cloud-google-com-windxx.txt
+++ b/static/archive/cloud-google-com-windxx.txt
@@ -1,367 +1,359 @@
- #[1]home
+[1]Jump to Content
+[2]
+Cloud
+[4]Blog
+[5]Contact sales [6]Get started for free
+[7][ ]
+[13]
+Cloud
+[14]Blog
- [2]Jump to Content
+ • Solutions & technology
+ □ [15]AI & Machine Learning
+ □ [16]API Management
+ □ [17]Application Development
+ □ [18]Application Modernization
+ □ [19]Chrome Enterprise
+ □ [20]Compute
+ □ [21]Containers & Kubernetes
+ □ [22]Data Analytics
+ □ [23]Databases
+ □ [24]DevOps & SRE
+ □ [25]Maps & Geospatial
+ □ [26]Security & Identity
+ □ [27]Infrastructure
+ □ [28]Infrastructure Modernization
+ □ [29]Networking
+ □ [30]Productivity & Collaboration
+ □ [31]SAP on Google Cloud
+ □ [32]Storage & Data Transfer
+ □ [33]Sustainability
+ • Ecosystem
+ □ [34]IT Leaders
+ □ Industries
+ ☆ [35]Financial Services
+ ☆ [36]Healthcare & Life Sciences
+ ☆ [37]Manufacturing
+ ☆ [38]Media & Entertainment
+ ☆ [39]Public Sector
+ ☆ [40]Retail
+ ☆ [41]Supply Chain
+ ☆ [42]Telecommunications
+ □ [43]Partners
+ □ [44]Startups & SMB
+ □ [45]Training & Certifications
+ □ [46]Inside Google Cloud
+ □ [47]Google Cloud Next & Events
+ □ [48]Google Maps Platform
+ □ [49]Google Workspace
+ • [50]Developers & Practitioners
+ • [51]Transform with Google Cloud
- Cloud
- (BUTTON)
- [3]Blog
- [4]Contact sales [5]Get started for free
- ____________________
+[52]Contact sales [53]Get started for free
+[54][ ]
+Application Modernization
- Cloud
- [6]Blog
+Why I love Go
- * Solutions & technology
- + [7]AI & Machine Learning
- + [8]API Management
- + [9]Application Development
- + [10]Application Modernization
- + [11]Chrome Enterprise
- + [12]Compute
- + [13]Containers & Kubernetes
- + [14]Data Analytics
- + [15]Databases
- + [16]DevOps & SRE
- + [17]Maps & Geospatial
- + [18]Security & Identity
- + [19]Infrastructure
- + [20]Infrastructure Modernization
- + [21]Networking
- + [22]Productivity & Collaboration
- + [23]SAP on Google Cloud
- + [24]Storage & Data Transfer
- + [25]Sustainability
- * Ecosystem
- + [26]IT Leaders
- + Industries
- o [27]Financial Services
- o [28]Healthcare & Life Sciences
- o [29]Manufacturing
- o [30]Media & Entertainment
- o [31]Public Sector
- o [32]Retail
- o [33]Supply Chain
- o [34]Telecommunications
- + [35]Partners
- + [36]Startups & SMB
- + [37]Training & Certifications
- + [38]Inside Google Cloud
- + [39]Google Cloud Next & Events
- + [40]Google Maps Platform
- + [41]Google Workspace
- * [42]Developers & Practitioners
- * [43]Transform with Google Cloud
+September 12, 2022
- [44]Contact sales [45]Get started for free
- ____________________
-
- Application Modernization
-
- Why I love Go
- September 12, 2022
- *
- *
- *
- *
+ • [60]
+ • [61]
+ • [62]
+ • [63]
David Yach
- Director of Engineering at Google Cloud
+Director of Engineering at Google Cloud
- I’ve been building software over the last four decades, as a developer,
- manager and executive in both small and large software companies. I
- started my career working on commercial compilers, first BASIC and then
- C. I have written a lot of code in many different languages, and
- managed teams with even broader language usage.
+I’ve been building software over the last four decades, as a developer, manager
+and executive in both small and large software companies. I started my career
+working on commercial compilers, first BASIC and then C. I have written a lot
+of code in many different languages, and managed teams with even broader
+language usage.
- I learned Go about 5 years ago when I was CTO at a startup/scaleup. At
- the time, we were looking to move to a microservice architecture, and
- that shift gave us the opportunity to consider moving away from the
- incumbent language (Scala). As I read through the Go tutorials, my
- compiler-writing background came back to me and I found myself
- repeatedly thinking “That’s cool – I know why the Go team did that!” So
- I got hooked on the language design.
+I learned Go about 5 years ago when I was CTO at a startup/scaleup. At the
+time, we were looking to move to a microservice architecture, and that shift
+gave us the opportunity to consider moving away from the incumbent language
+(Scala). As I read through the Go tutorials, my compiler-writing background
+came back to me and I found myself repeatedly thinking “That’s cool – I know
+why the Go team did that!” So I got hooked on the language design.
Learning
- I have worked with many different computer languages over the years, so
- I was not surprised I could quickly get started writing Go programs
- after reading through the online documents and tutorials. But then when
- I saw a new co-op student (a.k.a. intern) learn Go and write a
- substantial prototype in their first two weeks on the job, it became
- clear that Go was much easier to learn than many other languages.
+I have worked with many different computer languages over the years, so I was
+not surprised I could quickly get started writing Go programs after reading
+through the online documents and tutorials. But then when I saw a new co-op
+student (a.k.a. intern) learn Go and write a substantial prototype in their
+first two weeks on the job, it became clear that Go was much easier to learn
+than many other languages.
Writing code
- As I started writing my first Go programs, the first thing that struck
- me was the blazing compiler speed. It was as fast or faster starting my
- application than many interpreted languages, yet it was a compiled
- program with a strongly typed language. (I have an affinity for
- strongly typed languages – I have spent way too much time tracking down
- obscure issues in my own code in dynamic typed languages, where the
- same issue would have been a compile error in a strongly typed
- language.) Even better, in Go I often don’t need to declare the type –
- the compiler figures it out.
+As I started writing my first Go programs, the first thing that struck me was
+the blazing compiler speed. It was as fast or faster starting my application
+than many interpreted languages, yet it was a compiled program with a strongly
+typed language. (I have an affinity for strongly typed languages – I have spent
+way too much time tracking down obscure issues in my own code in dynamic typed
+languages, where the same issue would have been a compile error in a strongly
+typed language.) Even better, in Go I often don’t need to declare the type –
+the compiler figures it out.
- I was impressed with the standard Go library – it included many of the
- capabilities required by modern applications – things like HTTP
- support, JSON handling and encryption. Many other languages required
- you to use a third-party library for these features, and often there
- were multiple competing libraries to choose from, adding another
- decision point for the developer. With Go, I could go to the standard
- library GoDoc and get started right away.
+I was impressed with the standard Go library – it included many of the
+capabilities required by modern applications – things like HTTP support, JSON
+handling and encryption. Many other languages required you to use a third-party
+library for these features, and often there were multiple competing libraries
+to choose from, adding another decision point for the developer. With Go, I
+could go to the standard library GoDoc and get started right away.
- There were a few other language decisions that I found helpful. One is
- that the compiler figures out if you are returning a pointer to a
- local, and behind the scenes allocates the memory rather than using the
- stack. This prevents bugs, and I find the code more readable.
+There were a few other language decisions that I found helpful. One is that the
+compiler figures out if you are returning a pointer to a local, and behind the
+scenes allocates the memory rather than using the stack. This prevents bugs,
+and I find the code more readable.
- I also like that you don’t declare that you support an interface. I
- wasn’t sure I would like this at first because it isn’t obvious if a
- type implements a particular interface, but I found greater value in
- the fact that I wasn’t dependent on the code author (even if it was
- me!) to declare that the interface is implemented. This first hit home
- when I used fmt.Println() and it automatically used the String() method
- I had implemented even though it hadn’t occurred to me that I was
- implementing the Stringer interface.
+I also like that you don’t declare that you support an interface. I wasn’t sure
+I would like this at first because it isn’t obvious if a type implements a
+particular interface, but I found greater value in the fact that I wasn’t
+dependent on the code author (even if it was me!) to declare that the interface
+is implemented. This first hit home when I used fmt.Println() and it
+automatically used the String() method I had implemented even though it hadn’t
+occurred to me that I was implementing the Stringer interface.
- The last feature I’ll note is the ability to do concurrent programming
- through channels and goroutines. The model is simple to understand yet
- powerful.
+The last feature I’ll note is the ability to do concurrent programming through
+channels and goroutines. The model is simple to understand yet powerful.
Reading code
- After writing more Go code and starting to incorporate third party
- libraries, I had a realization that had never occurred to me before –
- as a developer, I spend a lot of time reading code. In fact, I probably
- spend more time reading code than writing it, once you start counting
- code reviews, debugging, and evaluating third-party libraries.
+After writing more Go code and starting to incorporate third party libraries, I
+had a realization that had never occurred to me before – as a developer, I
+spend a lot of time reading code. In fact, I probably spend more time reading
+code than writing it, once you start counting code reviews, debugging, and
+evaluating third-party libraries.
- What was different about reading Go code? I would summarize it by “it
- all looks the same.” What do I mean by that? Go format ensures all the
- braces are in the same spot; capitalized identifiers are exported;
- there are no implicit conversions, even of internal types; and there is
- no overloading of operators, functions or methods. That means that with
- Go code, “what you see is what you get” with no hidden meaning. Of
- course, it doesn’t help me to understand a complicated algorithm, but
- it does mean that I can concentrate more on that algorithm because I
- don’t have to understand whether ‘+’ is overloaded, for example.
+What was different about reading Go code? I would summarize it by “it all looks
+the same.” What do I mean by that? Go format ensures all the braces are in the
+same spot; capitalized identifiers are exported; there are no implicit
+conversions, even of internal types; and there is no overloading of operators,
+functions or methods. That means that with Go code, “what you see is what you
+get” with no hidden meaning. Of course, it doesn’t help me to understand a
+complicated algorithm, but it does mean that I can concentrate more on that
+algorithm because I don’t have to understand whether ‘+’ is overloaded, for
+example.
- I was also pleasantly surprised when I used GoDoc on one of my
- projects, and discovered that I had semi-reasonable documentation
- without doing anything while writing the code other than adding
- comments on my functions and methods based on nagging from the IDE I
- was using. I did spend some time cleaning up the comments after that,
- but I’m not sure I would have even started that work if Go hadn’t given
- me a great starting point.
+I was also pleasantly surprised when I used GoDoc on one of my projects, and
+discovered that I had semi-reasonable documentation without doing anything
+while writing the code other than adding comments on my functions and methods
+based on nagging from the IDE I was using. I did spend some time cleaning up
+the comments after that, but I’m not sure I would have even started that work
+if Go hadn’t given me a great starting point.
Testing code
- Go test is part of the standard Go tools and supported by IDEs, making
- it easy to get started creating unit tests for my code. And like the
- standard Go library, having a standard way to do tests means I don’t
- have to evaluate external testing frameworks and select one. I can also
- understand the tests when I’m evaluating a third party library.
+Go test is part of the standard Go tools and supported by IDEs, making it easy
+to get started creating unit tests for my code. And like the standard Go
+library, having a standard way to do tests means I don’t have to evaluate
+external testing frameworks and select one. I can also understand the tests
+when I’m evaluating a third party library.
- Even better, the default behavior running package tests in VSCode is to
- enable Go’s built-in code coverage. I had never taken code coverage
- seriously working in other languages, partly because it was often
- difficult to set up. But the immediate feedback (helped by the blazing
- compile speed) gamified this for me, and I found myself adding tests to
- increase code coverage (and finding new bugs along the way).
+Even better, the default behavior running package tests in VSCode is to enable
+Go’s built-in code coverage. I had never taken code coverage seriously working
+in other languages, partly because it was often difficult to set up. But the
+immediate feedback (helped by the blazing compile speed) gamified this for me,
+and I found myself adding tests to increase code coverage (and finding new bugs
+along the way).
- Go doesn’t allow circular dependencies between packages. While this has
- caused me some rethinking while writing code, I find it makes my
- testing regimen easier to think about – if I depend on a package, I can
- rely on that package to have its own tests covering its capabilities.
+Go doesn’t allow circular dependencies between packages. While this has caused
+me some rethinking while writing code, I find it makes my testing regimen
+easier to think about – if I depend on a package, I can rely on that package to
+have its own tests covering its capabilities.
Deploying code
- I learned Go at the same time we were migrating towards container-based
- microservices. In that environment, the fact that Go produces a single,
- self-contained executable makes it much easier and more efficient to
- build and manage containers. I can build a container layer with one
- single file, which is often a single-digit number of MB in size,
- compared to our prior JVM-based containers which started with hundreds
- of MB for the Java runtime then another layer for our application. (It
- is easy to forget how much this overhead ends up costing in production,
- particularly if you have hundreds or thousands of containers running).
+I learned Go at the same time we were migrating towards container-based
+microservices. In that environment, the fact that Go produces a single,
+self-contained executable makes it much easier and more efficient to build and
+manage containers. I can build a container layer with one single file, which is
+often a single-digit number of MB in size, compared to our prior JVM-based
+containers which started with hundreds of MB for the Java runtime then another
+layer for our application. (It is easy to forget how much this overhead ends up
+costing in production, particularly if you have hundreds or thousands of
+containers running).
- Second, Go has built-in cross compiling capabilities so our development
- machines, containers and cloud hardware don’t all have to all be on the
- same processor or operating system. For example, I can use a Linux
- build machine to produce client executables for Linux, Mac and Windows.
- Again, this takes away a complicated decision process due to artificial
- constraints.
+Second, Go has built-in cross compiling capabilities so our development
+machines, containers and cloud hardware don’t all have to all be on the same
+processor or operating system. For example, I can use a Linux build machine to
+produce client executables for Linux, Mac and Windows. Again, this takes away a
+complicated decision process due to artificial constraints.
- Finally, Go has established a well defined set of principles for
- versioning and compatibility. While not all pieces of this are
- enforced, having the principles from an authoritative source helps
- manage the real life challenges of keeping your software supply chain
- up to date. For example, it is strongly recommended that breaking
- changes require a new major version number. While not enforced, it
- leads the community to call out any open source package that violates
- this principle.
+Finally, Go has established a well defined set of principles for versioning and
+compatibility. While not all pieces of this are enforced, having the principles
+from an authoritative source helps manage the real life challenges of keeping
+your software supply chain up to date. For example, it is strongly recommended
+that breaking changes require a new major version number. While not enforced,
+it leads the community to call out any open source package that violates this
+principle.
What do I miss?
- I did miss generics; thankfully Go 1.18 added support. And I do wish
- the standard library offered immutable collections (like Scala and
- other functional languages). Embedding instead of inheritance works
- pretty much the same in many cases, but requires some deep thinking
- sometimes.
+I did miss generics; thankfully Go 1.18 added support. And I do wish the
+standard library offered immutable collections (like Scala and other functional
+languages). Embedding instead of inheritance works pretty much the same in many
+cases, but requires some deep thinking sometimes.
- My most frequent coding mistake is when I should have used a pointer
- receiver for a method and didn’t, then modify the receiver expecting
- the changes to be visible when the method returns. The code looks
- correct, the right values get assigned if I use a debugger to step
- through or issue prints, but the changes disappear after the method
- returns. I think I would have preferred if receivers were immutable, it
- would have caught these errors at compile time, and in the few
- remaining cases where I wanted to modify the receiver I would have
- copied it to a local variable.
+My most frequent coding mistake is when I should have used a pointer receiver
+for a method and didn’t, then modify the receiver expecting the changes to be
+visible when the method returns. The code looks correct, the right values get
+assigned if I use a debugger to step through or issue prints, but the changes
+disappear after the method returns. I think I would have preferred if receivers
+were immutable, it would have caught these errors at compile time, and in the
+few remaining cases where I wanted to modify the receiver I would have copied
+it to a local variable.
In conclusion
- As you can tell, I am a huge fan of Go, from even before I joined
- Google. I am impressed by the language and ecosystem design, and by the
- implementation. For me, Go makes me a more productive developer and I’m
- more confident in the quality of the code I produce.
+As you can tell, I am a huge fan of Go, from even before I joined Google. I am
+impressed by the language and ecosystem design, and by the implementation. For
+me, Go makes me a more productive developer and I’m more confident in the
+quality of the code I produce.
- Go, give it a [46]try!
+Go, give it a [64]try!
- Posted in
- * [47]Application Modernization
- * [48]Application Development
- * [49]Open Source
+Posted in
+
+ • [65]Application Modernization
+ • [66]Application Development
+ • [67]Open Source
Related articles
- https://storage.googleapis.com/gweb-cloudblog-publish/images/containers
- _2022_anH39my.max-700x700.jpg
- DevOps & SRE
+[68]
+https://storage.googleapis.com/gweb-cloudblog-publish/images/
+containers_2022_anH39my.max-700x700.jpg
+DevOps & SRE
Best practices for consuming public Docker Hub content
- By Rishi Mukhopadhyay • 2-minute read
+By Rishi Mukhopadhyay • 2-minute read
- https://storage.googleapis.com/gweb-cloudblog-publish/images/General-GC
- _Blog_header_2436x1200-v1.max-700x700.jpg
- Google Cloud
+[69]
+https://storage.googleapis.com/gweb-cloudblog-publish/images/
+General-GC_Blog_header_2436x1200-v1.max-700x700.jpg
+Google Cloud
The overwhelmed person’s guide to Google Cloud: week of Dec 18
- By Forrest Brazeal • 2-minute read
+By Forrest Brazeal • 2-minute read
- https://storage.googleapis.com/gweb-cloudblog-publish/images/Google_Clo
- ud_AIML_thumbnail.max-700x700.jpg
- AI & Machine Learning
+[70]
+https://storage.googleapis.com/gweb-cloudblog-publish/images/
+Google_Cloud_AIML_thumbnail.max-700x700.jpg
+AI & Machine Learning
Have the AI build your app for you!
- By Max Saltonstall • 2-minute read
+By Max Saltonstall • 2-minute read
- https://storage.googleapis.com/gweb-cloudblog-publish/images/DO_NOT_USE
- _Wfx45fA.max-700x700.jpg
- Application Modernization
+[71]
+https://storage.googleapis.com/gweb-cloudblog-publish/images/
+DO_NOT_USE_Wfx45fA.max-700x700.jpg
+Application Modernization
-Apollo24|7: Migrating a complex microservices application to Google Cloud
-with zero downtime
+Apollo24|7: Migrating a complex microservices application to Google Cloud with
+zero downtime
- By Nishu Saxena • 4-minute read
+By Nishu Saxena • 4-minute read
- Footer Links
+Footer Links
Follow us
- *
- *
- *
- *
- *
+ • [72]
+ • [73]
+ • [74]
+ • [75]
+ • [76]
- * [50]Google Cloud
- * [51]Google Cloud Products
- * [52]Privacy
- * [53]Terms
- * [54]Cookies management controls
+[77]
- * [55]Help
- * [English__..]
+ • [78]Google Cloud
+ • [79]Google Cloud Products
+ • [80]Privacy
+ • [81]Terms
+ • [82]Cookies management controls
-References
+ • [83]Help
+ • [84][Language ]
- Visible links:
- 1. https://cloud.google.com/?lfhs=2
- 2. https://cloud.google.com/blog/#content
- 3. https://cloud.google.com/blog
- 4. https://cloud.google.com/contact/
- 5. https://console.cloud.google.com/freetrial/
- 6. https://cloud.google.com/blog
- 7. https://cloud.google.com/blog/products/ai-machine-learning
- 8. https://cloud.google.com/blog/products/api-management
- 9. https://cloud.google.com/blog/products/application-development
- 10. https://cloud.google.com/blog/products/application-modernization
- 11. https://cloud.google.com/blog/products/chrome-enterprise
- 12. https://cloud.google.com/blog/products/compute
- 13. https://cloud.google.com/blog/products/containers-kubernetes
- 14. https://cloud.google.com/blog/products/data-analytics
- 15. https://cloud.google.com/blog/products/databases
- 16. https://cloud.google.com/blog/products/devops-sre
- 17. https://cloud.google.com/blog/topics/maps-geospatial
- 18. https://cloud.google.com/blog/products/identity-security
- 19. https://cloud.google.com/blog/products/infrastructure
- 20. https://cloud.google.com/blog/products/infrastructure-modernization
- 21. https://cloud.google.com/blog/products/networking
- 22. https://cloud.google.com/blog/products/productivity-collaboration
- 23. https://cloud.google.com/blog/products/sap-google-cloud
- 24. https://cloud.google.com/blog/products/storage-data-transfer
- 25. https://cloud.google.com/blog/topics/sustainability
- 26. https://cloud.google.com/transform
- 27. https://cloud.google.com/blog/topics/financial-services
- 28. https://cloud.google.com/blog/topics/healthcare-life-sciences
- 29. https://cloud.google.com/blog/topics/manufacturing
- 30. https://cloud.google.com/blog/products/media-entertainment
- 31. https://cloud.google.com/blog/topics/public-sector
- 32. https://cloud.google.com/blog/topics/retail
- 33. https://cloud.google.com/blog/topics/supply-chain-logistics
- 34. https://cloud.google.com/blog/topics/telecommunications
- 35. https://cloud.google.com/blog/topics/partners
- 36. https://cloud.google.com/blog/topics/startups
- 37. https://cloud.google.com/blog/topics/training-certifications
- 38. https://cloud.google.com/blog/topics/inside-google-cloud
- 39. https://cloud.google.com/blog/topics/google-cloud-next
- 40. https://cloud.google.com/blog/products/maps-platform
- 41. https://workspace.google.com/blog
- 42. https://cloud.google.com/blog/topics/developers-practitioners
- 43. https://cloud.google.com/transform
- 44. https://cloud.google.com/contact/
- 45. https://console.cloud.google.com/freetrial/
- 46. https://go.dev/tour/list
- 47. https://cloud.google.com/blog/products/application-modernization
- 48. https://cloud.google.com/blog/products/application-development
- 49. https://cloud.google.com/blog/products/open-source
- 50. https://cloud.google.com/
- 51. https://cloud.google.com/products/
- 52. https://myaccount.google.com/privacypolicy?hl=en-US
- 53. https://myaccount.google.com/termsofservice?hl=en-US
- 54. https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
- 55. https://support.google.com/
- Hidden links:
- 57. https://cloud.google.com/
- 58. https://cloud.google.com/
- 59. https://twitter.com/intent/tweet?text=Why%20I%20love%20Go%20@googlecloud&url=https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
- 60. https://www.linkedin.com/shareArticle?mini=true&url=https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go&title=Why%20I%20love%20Go
- 61. https://www.facebook.com/sharer/sharer.php?caption=Why%20I%20love%20Go&u=https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
- 62. mailto:?subject=Why%20I%20love%20Go&body=Check%20out%20this%20article%20on%20the%20Cloud%20Blog:%0A%0AWhy%20I%20love%20Go%0A%0ALearn%20all%20the%20reasons%20David%20Yach,%20industry%20veteran%20and%20Director%20of%20Engineering%20at%20Google%20Cloud,%20loves%20to%20use%20Go%20for%20software%20development.%0A%0Ahttps://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
- 63. https://cloud.google.com/blog/products/devops-sre/using-authenticated-logins-for-docker-hub-in-google-cloud
- 64. https://cloud.google.com/blog/products/gcp/the-overwhelmed-persons-guide-to-google-cloud
- 65. https://cloud.google.com/blog/products/ai-machine-learning/have-duet-ai-make-your-next-app-using-conversation
- 66. https://cloud.google.com/blog/products/application-modernization/migrating-a-microservices-application-with-no-downtime
- 67. https://www.twitter.com/googlecloud
- 68. https://www.youtube.com/googlecloud
- 69. https://www.linkedin.com/showcase/google-cloud
- 70. https://www.instagram.com/googlecloud/
- 71. https://www.facebook.com/googlecloud/
- 72. https://cloud.google.com/
+References:
+
+[1] https://cloud.google.com/blog/#content
+[2] https://cloud.google.com/
+[4] https://cloud.google.com/blog
+[5] https://cloud.google.com/contact/
+[6] https://console.cloud.google.com/freetrial/
+[13] https://cloud.google.com/
+[14] https://cloud.google.com/blog
+[15] https://cloud.google.com/blog/products/ai-machine-learning
+[16] https://cloud.google.com/blog/products/api-management
+[17] https://cloud.google.com/blog/products/application-development
+[18] https://cloud.google.com/blog/products/application-modernization
+[19] https://cloud.google.com/blog/products/chrome-enterprise
+[20] https://cloud.google.com/blog/products/compute
+[21] https://cloud.google.com/blog/products/containers-kubernetes
+[22] https://cloud.google.com/blog/products/data-analytics
+[23] https://cloud.google.com/blog/products/databases
+[24] https://cloud.google.com/blog/products/devops-sre
+[25] https://cloud.google.com/blog/topics/maps-geospatial
+[26] https://cloud.google.com/blog/products/identity-security
+[27] https://cloud.google.com/blog/products/infrastructure
+[28] https://cloud.google.com/blog/products/infrastructure-modernization
+[29] https://cloud.google.com/blog/products/networking
+[30] https://cloud.google.com/blog/products/productivity-collaboration
+[31] https://cloud.google.com/blog/products/sap-google-cloud
+[32] https://cloud.google.com/blog/products/storage-data-transfer
+[33] https://cloud.google.com/blog/topics/sustainability
+[34] https://cloud.google.com/transform
+[35] https://cloud.google.com/blog/topics/financial-services
+[36] https://cloud.google.com/blog/topics/healthcare-life-sciences
+[37] https://cloud.google.com/blog/topics/manufacturing
+[38] https://cloud.google.com/blog/products/media-entertainment
+[39] https://cloud.google.com/blog/topics/public-sector
+[40] https://cloud.google.com/blog/topics/retail
+[41] https://cloud.google.com/blog/topics/supply-chain-logistics
+[42] https://cloud.google.com/blog/topics/telecommunications
+[43] https://cloud.google.com/blog/topics/partners
+[44] https://cloud.google.com/blog/topics/startups
+[45] https://cloud.google.com/blog/topics/training-certifications
+[46] https://cloud.google.com/blog/topics/inside-google-cloud
+[47] https://cloud.google.com/blog/topics/google-cloud-next
+[48] https://cloud.google.com/blog/products/maps-platform
+[49] https://workspace.google.com/blog
+[50] https://cloud.google.com/blog/topics/developers-practitioners
+[51] https://cloud.google.com/transform
+[52] https://cloud.google.com/contact/
+[53] https://console.cloud.google.com/freetrial/
+[60] https://twitter.com/intent/tweet?text=Why%20I%20love%20Go%20@googlecloud&url=https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
+[61] https://www.linkedin.com/shareArticle?mini=true&url=https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go&title=Why%20I%20love%20Go
+[62] https://www.facebook.com/sharer/sharer.php?caption=Why%20I%20love%20Go&u=https://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
+[63] mailto:?subject=Why%20I%20love%20Go&body=Check%20out%20this%20article%20on%20the%20Cloud%20Blog:%0A%0AWhy%20I%20love%20Go%0A%0ALearn%20all%20the%20reasons%20David%20Yach,%20industry%20veteran%20and%20Director%20of%20Engineering%20at%20Google%20Cloud,%20loves%20to%20use%20Go%20for%20software%20development.%0A%0Ahttps://cloud.google.com/blog/products/application-modernization/why-david-yach-loves-go
+[64] https://go.dev/tour/list
+[65] https://cloud.google.com/blog/products/application-modernization
+[66] https://cloud.google.com/blog/products/application-development
+[67] https://cloud.google.com/blog/products/open-source
+[68] https://cloud.google.com/blog/products/devops-sre/using-authenticated-logins-for-docker-hub-in-google-cloud
+[69] https://cloud.google.com/blog/products/gcp/the-overwhelmed-persons-guide-to-google-cloud
+[70] https://cloud.google.com/blog/products/ai-machine-learning/have-duet-ai-make-your-next-app-using-conversation
+[71] https://cloud.google.com/blog/products/application-modernization/migrating-a-microservices-application-with-no-downtime
+[72] https://www.twitter.com/googlecloud
+[73] https://www.youtube.com/googlecloud
+[74] https://www.linkedin.com/showcase/google-cloud
+[75] https://www.instagram.com/googlecloud/
+[76] https://www.facebook.com/googlecloud/
+[77] https://cloud.google.com/
+[78] https://cloud.google.com/
+[79] https://cloud.google.com/products/
+[80] https://myaccount.google.com/privacypolicy?hl=en-US
+[81] https://myaccount.google.com/termsofservice?hl=en-US
+[82] https://cloud.google.com/blog/#
+[83] https://support.google.com/
diff --git a/static/archive/codefol-io-bskabg.txt b/static/archive/codefol-io-bskabg.txt
index 9162397..db4da47 100644
--- a/static/archive/codefol-io-bskabg.txt
+++ b/static/archive/codefol-io-bskabg.txt
@@ -1,374 +1,360 @@
- [1]Codefol.io book logo
+[1]Codefol.io book logo
[2]Codefol.io
- * [3]All Articles
- * [4]Articles by Topic
- * [5]Favourite Articles
- * [6]RSS
- * [7]About
+ • [3]All Articles
+ • [4]Articles by Topic
+ • [5]Favourite Articles
+ • [6]RSS
+ • [7]About
When Should You NOT Use Rails?
- A chimpanzee in a white coat types at a keyboard lit by glowing LEDs.
- He's gorgeous, yes. But is his talent natural… or is it Ruby on Rails?
+A chimpanzee in a white coat types at a keyboard lit by glowing LEDs.
+He's gorgeous, yes. But is his talent natural… or is it Ruby on Rails?
- I was [8]recently on Jason Swett’s podcast again. He’s a great
- interviewer and I always have fun with him.
+I was [8]recently on Jason Swett’s podcast again. He’s a great interviewer and
+I always have fun with him.
- By Twitter request we talked about… When would you not use Rails? It’s
- a great question.
+By Twitter request we talked about… When would you not use Rails? It’s a great
+question.
- For the entertaining version, [9]listen to the podcast. For the
- just-the-facts extra-complete version, I’m writing this post.
+For the entertaining version, [9]listen to the podcast. For the just-the-facts
+extra-complete version, I’m writing this post.
When Is Rails the Wrong Choice?
- I’ll start with a few simple, obvious times you wouldn’t use Rails, and
- then I’ll talk about some technically interesting times.
+I’ll start with a few simple, obvious times you wouldn’t use Rails, and then
+I’ll talk about some technically interesting times.
- First, and most important, is team familiarity. If your team doesn’t
- already know Rails and isn’t especially interested in learning it then
- Rails is the wrong choice. This should be obvious, but it still
- deserves first billing.
+First, and most important, is team familiarity. If your team doesn’t already
+know Rails and isn’t especially interested in learning it then Rails is the
+wrong choice. This should be obvious, but it still deserves first billing.
- Second, when you know some other framework fits better. I’ll talk more
- below about when that is. But sometimes you have a specific concern
- that trumps everything else. If you need to use a Java-language machine
- learning library and you don’t want to use JRuby for some reason, Rails
- isn’t your framework. If you’re writing a WordPress plugin, you’ll be
- doing it in PHP. Often there’s one specific compatibility concern that
- overrides everything else.
+Second, when you know some other framework fits better. I’ll talk more below
+about when that is. But sometimes you have a specific concern that trumps
+everything else. If you need to use a Java-language machine learning library
+and you don’t want to use JRuby for some reason, Rails isn’t your framework. If
+you’re writing a WordPress plugin, you’ll be doing it in PHP. Often there’s one
+specific compatibility concern that overrides everything else.
- You can also think of it as: use it where Rails’ good points hold and
- its bad points don’t. So we’ll also talk about the good and bad points.
+You can also think of it as: use it where Rails’ good points hold and its bad
+points don’t. So we’ll also talk about the good and bad points.
- Separately: you’d normally only use Rails as an HTTP server, so some
- tasks just aren’t Rails-shaped.
+Separately: you’d normally only use Rails as an HTTP server, so some tasks just
+aren’t Rails-shaped.
When is Rails Too Much?
- [10]A pirate puppet with an eyepatch, safety goggles and a huge
- scraggly mustache watches over a purple crystal ball at his feet.' He’s
- too much lab assistant for your lab.
+[10] A pirate puppet with an eyepatch, safety goggles and a huge scraggly
+mustache watches over a purple crystal ball at his feet.' He’s too much lab
+assistant for your lab.
- Some places not to use Rails can include:
+Some places not to use Rails can include:
- Really Small Tasks that Won’t Grow: if a server does very little, Rails
- is often too much. Not going to touch a database? Then the DB setup
- isn’t helping you, is it? Just a tiny low-traffic intermediate server
- with no caching? A lot of Rails is more trouble than it’s worth.
+Really Small Tasks that Won’t Grow: if a server does very little, Rails is
+often too much. Not going to touch a database? Then the DB setup isn’t helping
+you, is it? Just a tiny low-traffic intermediate server with no caching? A lot
+of Rails is more trouble than it’s worth.
- Be careful with tasks that grow, though — making a tiny server scale up
- to do a lot more can be ugly. If you’re already serving HTTP pages to a
- human with a web browser, consider that you may have to add features to
- it later. Something like that is already fairly large from the word
- “go”.
+Be careful with tasks that grow, though — making a tiny server scale up to do a
+lot more can be ugly. If you’re already serving HTTP pages to a human with a
+web browser, consider that you may have to add features to it later. Something
+like that is already fairly large from the word “go”.
- When It’s ‘Just’ an API Server: Rails has less to offer an API server
- that speaks JSON over the wire. A lot of its HTTP security doesn’t
- matter for that case: CSRF protection is entirely about dealing with
- HTML and Javascript. Many kinds of XSS attacks are dependent on a
- browser as the weak link, or on putting unescaped user input into HTML.
- Redirection vulnerabilities assume automatic redirection, which APIs
- usually don’t do. You can prevent SQL injection attacks with just an
- ORM, a simpler ORM, or even the raw Ruby MySQL and Postgres gems, which
- support question-mark arguments.
+When It’s ‘Just’ an API Server: Rails has less to offer an API server that
+speaks JSON over the wire. A lot of its HTTP security doesn’t matter for that
+case: CSRF protection is entirely about dealing with HTML and Javascript. Many
+kinds of XSS attacks are dependent on a browser as the weak link, or on putting
+unescaped user input into HTML. Redirection vulnerabilities assume automatic
+redirection, which APIs usually don’t do. You can prevent SQL injection attacks
+with just an ORM, a simpler ORM, or even the raw Ruby MySQL and Postgres gems,
+which support question-mark arguments.
- Rails security really shines when you’re navigating the bewildering
- world of HTML and browser security. Small projects that mostly speak a
- structured format read by machines will get less from Rails. Securing
- something like an integer ID or a hash of strings is just easier than
- ensuring your HTML contains no script tags or anything exploitable.
+Rails security really shines when you’re navigating the bewildering world of
+HTML and browser security. Small projects that mostly speak a structured format
+read by machines will get less from Rails. Securing something like an integer
+ID or a hash of strings is just easier than ensuring your HTML contains no
+script tags or anything exploitable.
- Related to that is when you’re doing in-browser rendering and Rails is
- ‘just’ serving JSON. It’s a weird kind of in-between case. A lot of
- Rails security and convenience functions no longer help you, but you’re
- still doing things where internal libraries (ActiveRecord, ActiveJob,
- ActionMailer) can be highly useful. But if you’re never rendering HTML
- on the server and you’re very sure you never will, Rails will probably
- help you less.
+Related to that is when you’re doing in-browser rendering and Rails is ‘just’
+serving JSON. It’s a weird kind of in-between case. A lot of Rails security and
+convenience functions no longer help you, but you’re still doing things where
+internal libraries (ActiveRecord, ActiveJob, ActionMailer) can be highly
+useful. But if you’re never rendering HTML on the server and you’re very sure
+you never will, Rails will probably help you less.
When Is Rails Not Enough?
- Rails is also designed for a small team and a medium-sized codebase. A
- huge team (lots of programmers) or a huge codebase (lots of
- controllers, models and/or lines of code) will tend to drag down the
- standard Rails-app structure.
+Rails is also designed for a small team and a medium-sized codebase. A huge
+team (lots of programmers) or a huge codebase (lots of controllers, models and/
+or lines of code) will tend to drag down the standard Rails-app structure.
- Ruby allows for a lot of [11]non-local effects. Whether that’s
- monkeypatching, writing to a database or creating new types at runtime,
- Ruby isn’t designed for a team of 200 programmers where you don’t trust
- some of them. There are too many ways for them to cause you trouble.
- You can use [12]good tooling to scale Ruby to larger teams, but even
- that will [13]tend to have exceptions and difficulties. That’s not
- really Ruby’s sweet spot.
+Ruby allows for a lot of [11]non-local effects. Whether that’s monkeypatching,
+writing to a database or creating new types at runtime, Ruby isn’t designed for
+a team of 200 programmers where you don’t trust some of them. There are too
+many ways for them to cause you trouble. You can use [12]good tooling to scale
+Ruby to larger teams, but even that will [13]tend to have exceptions and
+difficulties. That’s not really Ruby’s sweet spot.
- In most cases you can cut up a large project into smaller projects. If
- one Rails app is too big, you can often separate it into multiple apps,
- or a thinner app with more back-end services, or an app and a separate
- microservice, or… One way or another there is usually a way to separate
- out smaller pieces. Ruby strongly encourages that, as do I.
+In most cases you can cut up a large project into smaller projects. If one
+Rails app is too big, you can often separate it into multiple apps, or a
+thinner app with more back-end services, or an app and a separate microservice,
+or… One way or another there is usually a way to separate out smaller pieces.
+Ruby strongly encourages that, as do I.
- There are also not-quite-Rails structures that can scale better. Avdi
- Grimm’s (now retired) [14]Objects on Rails was an attempt in that
- direction, as is [15]the Hexagonal architecture for Rails, which in
- turn has a lot in common with the older and more general [16]N-tier
- architecture.
+There are also not-quite-Rails structures that can scale better. Avdi Grimm’s
+(now retired) [14]Objects on Rails was an attempt in that direction, as is [15]
+the Hexagonal architecture for Rails, which in turn has a lot in common with
+the older and more general [16]N-tier architecture.
- But at some point you might want to consider a different framework.
- [17]Hanami is an obvious choice, designed to be less quick and nimble
- than Rails for getting a tiny app off the ground, but more scalable if
- you want to use the same code with a lot more contributors.
+But at some point you might want to consider a different framework. [17]Hanami
+is an obvious choice, designed to be less quick and nimble than Rails for
+getting a tiny app off the ground, but more scalable if you want to use the
+same code with a lot more contributors.
- I’d still start out in Rails, personally. If you’re building something
- quickly to see if anybody cares, I know of no framework that comes
- close to its productivity. Wait to rewrite (in a more rigid framework)
- until you’re successful and you can afford the drag on your development
- speed.
+I’d still start out in Rails, personally. If you’re building something quickly
+to see if anybody cares, I know of no framework that comes close to its
+productivity. Wait to rewrite (in a more rigid framework) until you’re
+successful and you can afford the drag on your development speed.
- The other worry here can be performance. If you’re rewriting a project
- that is already as large as the current Basecamp… then you’re
- [18]actually fine for performance. Rails still scales great for them.
- But if you’re looking at something a hundred times larger (which by
- definition means B2C, not B2B) then you might have a situation where
- your server costs are substantially greater than your engineering
- payroll. In that case it can make sense to slow down your engineers to
- pay lower server costs. To check this, see what your EC2-or-equivalent
- costs are just for your application servers, which are what run Rails.
- And check your payroll just for web engineers, which is who writes in
- Rails. Normally the engineering payroll is much larger and you should
- stick with trading cheap machine time for expensive engineering time.
- But at some point the balance may tip and you should consider raising
- your engineering payroll to cut your server costs.
+The other worry here can be performance. If you’re rewriting a project that is
+already as large as the current Basecamp… then you’re [18]actually fine for
+performance. Rails still scales great for them. But if you’re looking at
+something a hundred times larger (which by definition means B2C, not B2B) then
+you might have a situation where your server costs are substantially greater
+than your engineering payroll. In that case it can make sense to slow down your
+engineers to pay lower server costs. To check this, see what your
+EC2-or-equivalent costs are just for your application servers, which are what
+run Rails. And check your payroll just for web engineers, which is who writes
+in Rails. Normally the engineering payroll is much larger and you should stick
+with trading cheap machine time for expensive engineering time. But at some
+point the balance may tip and you should consider raising your engineering
+payroll to cut your server costs.
When Does Rails Have the Wrong Assumptions?
- [19]A pirate, a bear and a chimp sit at a wicker table. The bear looks
- into a very old-fashioned microscope as the other two look on. They’re
- checking the microscope for real-world use cases where Rails might be
- wrong.
+[19] A pirate, a bear and a chimp sit at a wicker table. The bear looks into a
+very old-fashioned microscope as the other two look on. They’re checking the
+microscope for real-world use cases where Rails might be wrong.
- Before checking if Rails’ assumptions are right for you, we should see
- what those assumptions actually are.
+Before checking if Rails’ assumptions are right for you, we should see what
+those assumptions actually are.
- Before you take my word for it, I recommend taking [20]David Heinemeier
- Hansson’s word for it in the form of The Rails Doctrine. It’s a great
- document and it covers a lot of ground.
+Before you take my word for it, I recommend taking [20]David Heinemeier
+Hansson’s word for it in the form of The Rails Doctrine. It’s a great document
+and it covers a lot of ground.
- Indeed, if you want to better understand why Rails isn’t amazing for
- large, low-trust teams, you should read [21]“Provide Sharp Knives” in
- the Rails Doctrine several times. A lot of Rails’ tradeoffs are
- entirely by design.
+Indeed, if you want to better understand why Rails isn’t amazing for large,
+low-trust teams, you should read [21]“Provide Sharp Knives” in the Rails
+Doctrine several times. A lot of Rails’ tradeoffs are entirely by design.
- Rails also has some simpler assumptions: it assumes you’re writing an
- interactive app with server-rendered HTML. It assumes that security is
- vital (Rails trades a lot for security) but that you don’t want to
- build your own custom security system in most cases. And it assumes
- that you either have a small, excellent team doing prototyping work
- (“Provide Sharp Knives”) or that you have a possibly-mediocre team that
- needs powerful built-in guidelines ([22]“The Menu is Omakase.”)
+Rails also has some simpler assumptions: it assumes you’re writing an
+interactive app with server-rendered HTML. It assumes that security is vital
+(Rails trades a lot for security) but that you don’t want to build your own
+custom security system in most cases. And it assumes that you either have a
+small, excellent team doing prototyping work (“Provide Sharp Knives”) or that
+you have a possibly-mediocre team that needs powerful built-in guidelines ([22]
+“The Menu is Omakase.”)
- Rails also assumes you want high developer velocity at a cost of
- technical debt. In other words, it’s designed for building very
- quickly. That makes sense when technical execution is not your biggest
- risk. For instance: if you’re building a small startup, and you’re
- pretty sure you can build the site but people may not buy your product,
- you are dominated by market risk. That’s when Rails is perfect. You
- want to build very quickly. And even if you build perfectly, you’re
- probably going to have to throw away the result for nontechnical
- reasons, like “people don’t want to buy it.”
+Rails also assumes you want high developer velocity at a cost of technical
+debt. In other words, it’s designed for building very quickly. That makes sense
+when technical execution is not your biggest risk. For instance: if you’re
+building a small startup, and you’re pretty sure you can build the site but
+people may not buy your product, you are dominated by market risk. That’s when
+Rails is perfect. You want to build very quickly. And even if you build
+perfectly, you’re probably going to have to throw away the result for
+nontechnical reasons, like “people don’t want to buy it.”
- As part of “high dev velocity, technical debt is okay” Rails assumes
- things like, “you’ll want to use a lot of gems” and “dependencies that
- work are fine if they speed you up.”
+As part of “high dev velocity, technical debt is okay” Rails assumes things
+like, “you’ll want to use a lot of gems” and “dependencies that work are fine
+if they speed you up.”
- Rails assumes you don’t mind scaling out application servers
- horizontally (by bringing more of them online.) It’s designed to scale
- well if you can do that. Rails assumes CPU is fairly cheap and it’s
- usually right about that. Relatedly, Rails assumes that the database is
- usually your most serious performance bottleneck, which is how web
- applications usually work.
+Rails assumes you don’t mind scaling out application servers horizontally (by
+bringing more of them online.) It’s designed to scale well if you can do that.
+Rails assumes CPU is fairly cheap and it’s usually right about that. Relatedly,
+Rails assumes that the database is usually your most serious performance
+bottleneck, which is how web applications usually work.
- Rails also assumes you’ll have some calculation or data transformation
- in your application. It assumes that it’s okay to use some CPU because
- you’ll be doing that anyway.
+Rails also assumes you’ll have some calculation or data transformation in your
+application. It assumes that it’s okay to use some CPU because you’ll be doing
+that anyway.
- (When does that last assumption matter? Let’s talk about Evented
- Servers and see.)
+(When does that last assumption matter? Let’s talk about Evented Servers and
+see.)
What Isn’t Rails Good At?
- [23]The Node.js logo. Sometimes you need it, or something like it.
+[23] The Node.js logo. Sometimes you need it, or something like it.
- While Rails is great at a lot of things, there’s one particular task
- that it’s not amazing for: shim servers.
+While Rails is great at a lot of things, there’s one particular task that it’s
+not amazing for: shim servers.
- By “shim servers” I mean servers that do very little calculation but
- integrate answers from a few other back-end services and relay the
- result. Imagine a server that queries two JSON services and combines
- the result with simple string-manipulation, for instance. It does very
- little calculation, but it juggles a lot of events.
+By “shim servers” I mean servers that do very little calculation but integrate
+answers from a few other back-end services and relay the result. Imagine a
+server that queries two JSON services and combines the result with simple
+string-manipulation, for instance. It does very little calculation, but it
+juggles a lot of events.
- And that’s the relevant word: “events.”
+And that’s the relevant word: “events.”
- There is a specific kind of app architecture embodied by Node.js and
- its relatives called “Evented” programming. It can support many
- thousands, or even millions, of simultaneous connections with a tiny
- amount of server resources. It can be both high-throughput and
- low-latency. Its benchmark numbers are matchless… for the cases where
- it works.
+There is a specific kind of app architecture embodied by Node.js and its
+relatives called “Evented” programming. It can support many thousands, or even
+millions, of simultaneous connections with a tiny amount of server resources.
+It can be both high-throughput and low-latency. Its benchmark numbers are
+matchless… for the cases where it works.
- Rails can’t match Evented programming at what Evented programming is
- good at. Basically no framework can. There are Evented frameworks for
- Ruby (e.g. [24]EventMachine, [25]Async.) Rails is built differently.
+Rails can’t match Evented programming at what Evented programming is good at.
+Basically no framework can. There are Evented frameworks for Ruby (e.g. [24]
+EventMachine, [25]Async.) Rails is built differently.
- If Evented is so much better, why don’t we use it for everything?
- Because it doesn’t work for everything. I emphasise calculation
- per-request because an Evented server will fall down and die if you try
- to make it do very much calculation per-request. Having one server
- handle a million connections is no good if each connection winds up
- using a hundred milliseconds of CPU time — that’s simply too many
- connections and the latency will be terrible.
+If Evented is so much better, why don’t we use it for everything? Because it
+doesn’t work for everything. I emphasise calculation per-request because an
+Evented server will fall down and die if you try to make it do very much
+calculation per-request. Having one server handle a million connections is no
+good if each connection winds up using a hundred milliseconds of CPU time —
+that’s simply too many connections and the latency will be terrible.
- In other words, Rails and Node.js are different tools for different
- projects. If you’re thinking, “I should either use Rails or Node for
- this” I would recommend looking deeper into your project (and/or your
- framework) until it’s obvious which one is the right answer. They do
- different things.
+In other words, Rails and Node.js are different tools for different projects.
+If you’re thinking, “I should either use Rails or Node for this” I would
+recommend looking deeper into your project (and/or your framework) until it’s
+obvious which one is the right answer. They do different things.
Look, I Just Scroll to the Bottom for the Summary and Criticise It On Reddit
- [26]A chimpanzee in a lab coat stares down at his lap, containing
- sections of wooden train track, and his hand holding a toy train. I’m
- sure this is the right answer, but I have forgotten the question.
+[26] A chimpanzee in a lab coat stares down at his lap, containing sections of
+wooden train track, and his hand holding a toy train. I’m sure this is the
+right answer, but I have forgotten the question.
- Rails is the wrong choice if your team doesn’t want to use it or
- doesn’t know how.
+Rails is the wrong choice if your team doesn’t want to use it or doesn’t know
+how.
- Rails is the wrong choice in cases where a different framework is
- specifically better, or you have a specific library you need to be
- compatible with that isn’t Rails-friendly.
+Rails is the wrong choice in cases where a different framework is specifically
+better, or you have a specific library you need to be compatible with that
+isn’t Rails-friendly.
- Rails might be the wrong choice if you’re not rendering HTML on the
- server, especially if your project is very small and/or doesn’t use a
- database.
+Rails might be the wrong choice if you’re not rendering HTML on the server,
+especially if your project is very small and/or doesn’t use a database.
- Rails is the wrong choice is you’re not doing prototyping-flavoured
- work, preferably with a small, highly-competent team.
+Rails is the wrong choice is you’re not doing prototyping-flavoured work,
+preferably with a small, highly-competent team.
- Rails is the wrong choice if your dev team or your app code is too big
- and you can’t subdivide the project.
+Rails is the wrong choice if your dev team or your app code is too big and you
+can’t subdivide the project.
- Rails is the wrong choice if your project wants an Evented server like
- Node.js or EventMachine.
+Rails is the wrong choice if your project wants an Evented server like Node.js
+or EventMachine.
- This article is the wrong choice if you’d rather [27]listen to an
- entertaining podcast on the same topic.
+This article is the wrong choice if you’d rather [27]listen to an entertaining
+podcast on the same topic.
- If you’re wondering when Rails is the right choice, [28]the Rails
- Doctrine is a great first step.
- Aug 6 2020
- [29]ruby [30]rails
+If you’re wondering when Rails is the right choice, [28]the Rails Doctrine is a
+great first step.
+
+Aug 6 2020
+[29]ruby [30]rails
You Hunger to Get Better
- Subscribe to get free ebook chapters and an emailed coding class now,
- plus videos and articles a few times a month.
+Subscribe to get free ebook chapters and an emailed coding class now, plus
+videos and articles a few times a month.
- Why this specific newsletter? You want to be an expert. Expertise comes
- from learning the fundamentals, deeply. And that comes from the best
- kind of practice. I write with that in mind. I won't waste your time.
+Why this specific newsletter? You want to be an expert. Expertise comes from
+learning the fundamentals, deeply. And that comes from the best kind of
+practice. I write with that in mind. I won't waste your time.
- (Yes, I also sell things. They're good, but I'm fine if you don't buy
- them.)
- ____________________ ____________________ (BUTTON) Sign-up
+(Yes, I also sell things. They're good, but I'm fine if you don't buy them.)
+[32][ ][33][ ] Sign-up
Comments
- Please enable JavaScript to view the [31]comments powered by Disqus.
- [32]comments powered by Disqus
+Please enable JavaScript to view the [35]comments powered by Disqus. [36]
+comments powered by Disqus
Read Next
-[33]Computer Science: Just the Useful Bits
+[37]Computer Science: Just the Useful Bits
- [34]ruby [35]rails
- [36]Computer Science: Just the Useful Bits
+[38]ruby [39]rails
-[37]Let's Build Course Software: Email Reminders
+[40] Computer Science: Just the Useful Bits
- [38]ruby [39]rails [40]letsbuild [41]rubymadscience
- [42]Let's Build Course Software: Email Reminders
+[41]Let's Build Course Software: Email Reminders
-[43]Free Rebuilding Rails Video Chapters
+[42]ruby [43]rails [44]letsbuild [45]rubymadscience
- [44]career
+[46] Let's Build Course Software: Email Reminders
-[45]The Urban Legend of the 10X Developer
+[47]Free Rebuilding Rails Video Chapters
- [46]career
- [47]The Urban Legend of the 10X Developer
+[48]career
- [48]Mastodon [49]GitHub [50]Linkedin [51]Mastodon
+[49]The Urban Legend of the 10X Developer
- [52]Codefol.io © 2020 . Horace theme by [53]JustGoodThemes..
+[50]career
- [54]Back to top
+[51] The Urban Legend of the 10X Developer
-References
+[52] Mastodon [53] GitHub [54] Linkedin [55]Mastodon
- 1. https://codefol.io/
- 2. https://codefol.io/
- 3. https://codefol.io/posts
- 4. https://codefol.io/topics
- 5. https://codefol.io/tags/favourite
- 6. https://codefol.io/feed.xml
- 7. https://codefol.io/about
- 8. https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
- 9. https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
- 10. https://rubymadscience.com/img/assistant_pirate_with_sphere_bigthumb.png
- 11. https://en.wikipedia.org/wiki/Side_effect_(computer_science)
- 12. https://sorbet.org/
- 13. https://sorbet.org/docs/troubleshooting#escape-hatches
- 14. https://www.goodreads.com/book/show/13481927-objects-on-rails
- 15. https://medium.com/@vsavkin/hexagonal-architecture-for-rails-developers-8b1fee64a613
- 16. https://en.wikipedia.org/wiki/Multitier_architecture
- 17. https://hanamirb.org/
- 18. https://m.signalvnoise.com/only-15-of-the-basecamp-operations-budget-is-spent-on-ruby/
- 19. https://rubymadscience.com/img/dr_bear_microscope_bigthumb.png
- 20. https://rubyonrails.org/doctrine/
- 21. https://rubyonrails.org/doctrine/#provide-sharp-knives
- 22. https://rubyonrails.org/doctrine/#omakase
- 23. https://codefol.io/posts/when-should-you-not-use-rails/node_js_logo.png
- 24. https://github.com/eventmachine/eventmachine
- 25. https://github.com/socketry/async
- 26. http://rubymadscience.com/img/rails_internals_bigthumb.png
- 27. https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
- 28. https://rubyonrails.org/doctrine/
- 29. https://codefol.io/tags/ruby/
- 30. https://codefol.io/tags/rails/
- 31. http://disqus.com/?ref_noscript
- 32. http://disqus.com/
- 33. https://codefol.io/posts/introducing-computer-science-just-the-useful-bits/
- 34. https://codefol.io/tags/ruby/
- 35. https://codefol.io/tags/rails/
- 36. https://codefol.io/posts/introducing-computer-science-just-the-useful-bits/
- 37. https://codefol.io/posts/series-build-coding-course-email-reminders/
- 38. https://codefol.io/tags/ruby/
- 39. https://codefol.io/tags/rails/
- 40. https://codefol.io/tags/letsbuild/
- 41. https://codefol.io/tags/rubymadscience/
- 42. https://codefol.io/posts/series-build-coding-course-email-reminders/
- 43. https://codefol.io/posts/free-rr-video-chapters/
- 44. https://codefol.io/tags/career/
- 45. https://codefol.io/posts/urban-legend-of-the-10x-developer/
- 46. https://codefol.io/tags/career/
- 47. https://codefol.io/posts/urban-legend-of-the-10x-developer/
- 48. https://ruby.social/@codefolio
- 49. https://github.com/noahgibbs
- 50. https://www.linkedin.com/in/noahgibbs
- 51. https://ruby.social/@codefolio
- 52. https://codefol.io/posts/when-should-you-not-use-rails/
- 53. https://justgoodthemes.com/
- 54. https://codefol.io/posts/when-should-you-not-use-rails/#page
+[56]Codefol.io © 2020 . Horace theme by [57]JustGoodThemes..
+
+[58] Back to top
+
+
+References:
+
+[1] https://codefol.io/
+[2] https://codefol.io/
+[3] https://codefol.io/posts
+[4] https://codefol.io/topics
+[5] https://codefol.io/tags/favourite
+[6] https://codefol.io/feed.xml
+[7] https://codefol.io/about
+[8] https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
+[9] https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
+[10] https://rubymadscience.com/img/assistant_pirate_with_sphere_bigthumb.png
+[11] https://en.wikipedia.org/wiki/Side_effect_(computer_science)
+[12] https://sorbet.org/
+[13] https://sorbet.org/docs/troubleshooting#escape-hatches
+[14] https://www.goodreads.com/book/show/13481927-objects-on-rails
+[15] https://medium.com/@vsavkin/hexagonal-architecture-for-rails-developers-8b1fee64a613
+[16] https://en.wikipedia.org/wiki/Multitier_architecture
+[17] https://hanamirb.org/
+[18] https://m.signalvnoise.com/only-15-of-the-basecamp-operations-budget-is-spent-on-ruby/
+[19] https://rubymadscience.com/img/dr_bear_microscope_bigthumb.png
+[20] https://rubyonrails.org/doctrine/
+[21] https://rubyonrails.org/doctrine/#provide-sharp-knives
+[22] https://rubyonrails.org/doctrine/#omakase
+[23] https://codefol.io/posts/when-should-you-not-use-rails/node_js_logo.png
+[24] https://github.com/eventmachine/eventmachine
+[25] https://github.com/socketry/async
+[26] http://rubymadscience.com/img/rails_internals_bigthumb.png
+[27] https://www.codewithjason.com/rails-with-jason-podcast/noah-gibbs-3/
+[28] https://rubyonrails.org/doctrine/
+[29] https://codefol.io/tags/ruby/
+[30] https://codefol.io/tags/rails/
+[35] http://disqus.com/?ref_noscript
+[36] http://disqus.com/
+[37] https://codefol.io/posts/introducing-computer-science-just-the-useful-bits/
+[38] https://codefol.io/tags/ruby/
+[39] https://codefol.io/tags/rails/
+[40] https://codefol.io/posts/introducing-computer-science-just-the-useful-bits/
+[41] https://codefol.io/posts/series-build-coding-course-email-reminders/
+[42] https://codefol.io/tags/ruby/
+[43] https://codefol.io/tags/rails/
+[44] https://codefol.io/tags/letsbuild/
+[45] https://codefol.io/tags/rubymadscience/
+[46] https://codefol.io/posts/series-build-coding-course-email-reminders/
+[47] https://codefol.io/posts/free-rr-video-chapters/
+[48] https://codefol.io/tags/career/
+[49] https://codefol.io/posts/urban-legend-of-the-10x-developer/
+[50] https://codefol.io/tags/career/
+[51] https://codefol.io/posts/urban-legend-of-the-10x-developer/
+[52] https://ruby.social/@codefolio
+[53] https://github.com/noahgibbs
+[54] https://www.linkedin.com/in/noahgibbs
+[55] https://ruby.social/@codefolio
+[56] https://codefol.io/posts/when-should-you-not-use-rails/#
+[57] https://justgoodthemes.com/
+[58] https://codefol.io/posts/when-should-you-not-use-rails/#page
diff --git a/static/archive/craigmod-com-xfi1ge.txt b/static/archive/craigmod-com-xfi1ge.txt
index fd56bdf..2fca1a2 100644
--- a/static/archive/craigmod-com-xfi1ge.txt
+++ b/static/archive/craigmod-com-xfi1ge.txt
@@ -1,406 +1,403 @@
- #[1]Craig Mod — Writer + Photographer
-
- [2]About Craig
- [3]Books & [4]Essays
- [5]Membership
- [6]Shop!
- [7]“Special Projects” Membership
- Podcasts:🎧 [8]On Margins & [9]SW945
- [10]Newsletters:📩 [11]Roden & [12]Ridgeline
-
- Header image for Electric Bike, Stupid Love of My Life
-
+[1]
+[2]About Craig
+[3]Books & [4]Essays
+[5]Membership
+[6]Shop!
+[7]“Special Projects” Membership
+Podcasts:🎧 [8]On Margins & [9]SW945
+[10]Newsletters:📩 [11]Roden & [12]Ridgeline
+[13]
+[14]
+[15]
+Header image for Electric Bike, Stupid Love of My Life
+
Electric Bike, Stupid Love of My Life
Reflections on eighteen months of electric bike ownership
+
- My electric bike sings, emits a nearly imperceptible hum from its tiny
- motor. I love its song. A song of peace and magic. Has money ever
- bought as much delight as the delight of an electric bike?
+My electric bike sings, emits a nearly imperceptible hum from its tiny motor. I
+love its song. A song of peace and magic. Has money ever bought as much delight
+as the delight of an electric bike?
- The first time I rode one was nearly a decade ago, in Kyoto. The
- electric bike I rented was huge and unwieldy, but that tug of its motor
- never left my mind. I went to climb a hill and it felt as if a giant
- had gently placed his hand on my back and pushed me forward. That
- stupid smile has been on my face ever since.
+The first time I rode one was nearly a decade ago, in Kyoto. The electric bike
+I rented was huge and unwieldy, but that tug of its motor never left my mind. I
+went to climb a hill and it felt as if a giant had gently placed his hand on my
+back and pushed me forward. That stupid smile has been on my face ever since.
- Two years ago I rented another one. This one smaller, lighter, the
- motor more powerful. I was convinced. This is the way. Eighteen months
- ago, in the heart of the pandemic, I committed and bought my first
- electric bike and have never looked back.
- __________________________________________________________________
+Two years ago I rented another one. This one smaller, lighter, the motor more
+powerful. I was convinced. This is the way. Eighteen months ago, in the heart
+of the pandemic, I committed and bought my first electric bike and have never
+looked back.
- Indulge me — a summer afternoon: Soaring down the coast, the ocean to
- one side and a strand of old pines to the other. The afternoon sun
- beats down but it feels cool and there’s something irrationally
- stirring — downright emotional — about the efficiency of this dumb
- machine beneath my body. The motor looks too small — just a black
- cylinder on the hub of the wheel. And yet it moves. It sings that song.
- A subtle hum. A beautiful hum. It makes me want to ride and ride,
- ridiculous distances, nonsensical distances. I don’t want to get to
- where I’m going because I want the ride to last longer. I want to
- linger in this space as long as possible, this space of smooth and
- efficient movement through the world, gliding in near total mechanical
- silence, just the sound of rubber on the pavement, wind in my ears,
- breaking waves, salt, the smell of pine. This is what electric bikes
- do: They drive you insane with the poetry of the world.
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- A strange trio A few of my old bikes: A mamachari, carbon fiber road
- bike, and Kalavinka
+Indulge me — a summer afternoon: Soaring down the coast, the ocean to one side
+and a strand of old pines to the other. The afternoon sun beats down but it
+feels cool and there’s something irrationally stirring — downright emotional —
+about the efficiency of this dumb machine beneath my body. The motor looks too
+small — just a black cylinder on the hub of the wheel. And yet it moves. It
+sings that song. A subtle hum. A beautiful hum. It makes me want to ride and
+ride, ridiculous distances, nonsensical distances. I don’t want to get to where
+I’m going because I want the ride to last longer. I want to linger in this
+space as long as possible, this space of smooth and efficient movement through
+the world, gliding in near total mechanical silence, just the sound of rubber
+on the pavement, wind in my ears, breaking waves, salt, the smell of pine. This
+is what electric bikes do: They drive you insane with the poetry of the world.
-[13]#So Many Bikes
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+A strange trio A few of my old bikes: A mamachari, carbon fiber road bike, and
+Kalavinka
- All my standing life, I’ve biked. As a kid I rode a K-Mart Huffy to a
- rusted nub and then managed to nab a Haro Group 1. As an adult, bikes
- have been one of my few material indulgences (unwittingly,
- organically). In the past twenty years alone I’ve owned some fifteen
- bikes. I’ve had aluminum and carbon Bianchi road bikes. I’ve had steel
- Kalavinka keirin bikes with gorgeous head badges. I’ve had folding
- Dahon and Birdy BD-1s. I’ve had a handful of beloved brandless
- throwaway mamacharis — shopping bikes — that have proven hearty and fun
- in their own ways, and have each died uniquely. I’ve gone out of my way
- to get a handmade Arrow cruiser from a builder in Ogikubo. I still have
- a custom orange Moulton that I’ve modified into a single-speed city
- bomber that goes remarkably fast while floating atop its simple
- suspension.
+[16]#So Many Bikes
- And on and on — bikes. Why? Because as any bike lover will tell you, to
- be ensorcelled by the bike is to crave one and only one thing: More
- bike. Each new bike is like riding once again for the first time.
- Exploring a city on a mamachari is different than a BD-1 is different
- than a Moulton. All thrilling. The bikes change, and so, too does your
- relationship to the pavement. My love for bikes has no categorical
- allegiances; if it has two wheels, and pedals, I’m interested. I want
- to ride them all.
- A Moulton Tiny, but fast, nearly flawless as a city machine — a Moulton
- with converted stem, Sugino cranks, coaster brake
- __________________________________________________________________
+All my standing life, I’ve biked. As a kid I rode a K-Mart Huffy to a rusted
+nub and then managed to nab a Haro Group 1. As an adult, bikes have been one of
+my few material indulgences (unwittingly, organically). In the past twenty
+years alone I’ve owned some fifteen bikes. I’ve had aluminum and carbon Bianchi
+road bikes. I’ve had steel Kalavinka keirin bikes with gorgeous head badges.
+I’ve had folding Dahon and Birdy BD-1s. I’ve had a handful of beloved brandless
+throwaway mamacharis — shopping bikes — that have proven hearty and fun in
+their own ways, and have each died uniquely. I’ve gone out of my way to get a
+handmade Arrow cruiser from a builder in Ogikubo. I still have a custom orange
+Moulton that I’ve modified into a single-speed city bomber that goes remarkably
+fast while floating atop its simple suspension.
- Summers in most of Japan have never been easy. The temperatures England
- flirted with in 2022 are temperatures Tokyoites have contended with for
- centuries (and now contend with ones even higher). Crushing heat
- coupled with suffocating humidity. A three-shower-a-day kinda summer.
- Watch an Ozu film and observe the languid and supine impulse of its
- inhabitants during summertime scenes — that’s not affect, it’s
- survival. In Japan’s August, you simply can’t walk a block without
- losing most of your moisture.
+And on and on — bikes. Why? Because as any bike lover will tell you, to be
+ensorcelled by the bike is to crave one and only one thing: More bike. Each new
+bike is like riding once again for the first time. Exploring a city on a
+mamachari is different than a BD-1 is different than a Moulton. All thrilling.
+The bikes change, and so, too does your relationship to the pavement. My love
+for bikes has no categorical allegiances; if it has two wheels, and pedals, I’m
+interested. I want to ride them all.
- Bikes have always helped. A bicycle generates a microclimate with
- minimal effort. Standing on a street corner you may be soaked, but on a
- bike, the wind whooshing past, you are crisp(er) and dry(er). An
- electric bike only amplifies the effect.
+A Moulton Tiny, but fast, nearly flawless as a city machine — a Moulton with
+converted stem, Sugino cranks, coaster brake
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- When I was a child I dreamt of having a personal helicopter. Powered by
- my feet and a bit of magic (certainly not gasoline, oddly, thinking
- back on it now). I imagined quietly gliding over the city in this tiny
- contraption, floating from home to video rental shop to diner, stopping
- by a friend’s house along the way. An electric bike gets me most of the
- way to this feeling.
+Summers in most of Japan have never been easy. The temperatures England flirted
+with in 2022 are temperatures Tokyoites have contended with for centuries (and
+now contend with ones even higher). Crushing heat coupled with suffocating
+humidity. A three-shower-a-day kinda summer. Watch an Ozu film and observe the
+languid and supine impulse of its inhabitants during summertime scenes — that’s
+not affect, it’s survival. In Japan’s August, you simply can’t walk a block
+without losing most of your moisture.
- In the past eighteen months I’ve put several thousand kilometers on my
- electric bikes. It feels like cheating in every best possible way. I
- live in a seaside town south of Tokyo and traffic can get ridiculous,
- its ancient roads sized for horses, not cars. The electric bike swoops
- between and alongside these stale processions of heat and burning fuel.
- Drifting behind a gas-powered scooter or moped feels like observing
- some Victorian contraption — inefficient and loud and clunky and
- burdensome and pollutant. And not much faster (often much slower) or
- more useful than an electric bike.
- __________________________________________________________________
+Bikes have always helped. A bicycle generates a microclimate with minimal
+effort. Standing on a street corner you may be soaked, but on a bike, the wind
+whooshing past, you are crisp(er) and dry(er). An electric bike only amplifies
+the effect.
- A Vanmoof and a BESV My friend's S3 and my BESV (the X3 looks like a
- slightly smaller version of the S3)
+When I was a child I dreamt of having a personal helicopter. Powered by my feet
+and a bit of magic (certainly not gasoline, oddly, thinking back on it now). I
+imagined quietly gliding over the city in this tiny contraption, floating from
+home to video rental shop to diner, stopping by a friend’s house along the way.
+An electric bike gets me most of the way to this feeling.
-[14]#Electrics
+In the past eighteen months I’ve put several thousand kilometers on my electric
+bikes. It feels like cheating in every best possible way. I live in a seaside
+town south of Tokyo and traffic can get ridiculous, its ancient roads sized for
+horses, not cars. The electric bike swoops between and alongside these stale
+processions of heat and burning fuel. Drifting behind a gas-powered scooter or
+moped feels like observing some Victorian contraption — inefficient and loud
+and clunky and burdensome and pollutant. And not much faster (often much
+slower) or more useful than an electric bike.
- I own two electric bikes. My first purchase was the strangely named
- BESV PSA1 — which is a smaller wheeled (20"), rear-wheel drive machine,
- with mostly off-the-shelf components allowing you to customize it to
- your liking. ^[15]1 And then, because I was so enamored by the BESV —
- so seduced by its small motor of umph, so wanting more and different
- electric bike experiences — I went and picked up a front-wheel drive
- Vanmoof X3 — the smaller-wheeled brother (24") to Vanmoof’s (quite
- frankly) giant S3 — just a few months later.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+A Vanmoof and a BESV My friend's S3 and my BESV (the X3 looks like a slightly
+smaller version of the S3)
- I love them both like damaged brothers, because both of these bikes are
- flawed in frustrating ways.
+[17]#Electrics
- The electronic brain on the BESV is as dumb as they come.^[16]2 The
- settings reset each time you turn the bike on. The acceleration curves
- feel unrefined — herky-jerky, you might say. Its app is the worst app I
- have on my phone — badly designed, nearly functionally useless, clearly
- engineered without love. And yet. Despite these flaws I put hundreds of
- kilometers on this thing in the first month. The front and rear
- suspension turn every road to glass, and are even fine for dirt trails;
- I find myself hunting down paths through parks I’d never otherwise
- think about. Suddenly every hilly road is a thing demanding to be
- explored. Up up up the little machine yells, and you follow its
- command.
+I own two electric bikes. My first purchase was the strangely named BESV PSA1 —
+which is a smaller wheeled (20"), rear-wheel drive machine, with mostly
+off-the-shelf components allowing you to customize it to your liking. ^[18]1
+And then, because I was so enamored by the BESV — so seduced by its small motor
+of umph, so wanting more and different electric bike experiences — I went and
+picked up a front-wheel drive Vanmoof X3 — the smaller-wheeled brother (24") to
+Vanmoof’s (quite frankly) giant S3 — just a few months later.
- Guests who stay at my studio are given the BESV to ride. We take it
- down the coast. It never fails to amaze. One friend felt compelled to
- pet it upon dismount, saying, Good job, buddy, so quick and deep was
- the affection for the thing.
+I love them both like damaged brothers, because both of these bikes are flawed
+in frustrating ways.
- The Vanmoof is much smarter — the brain and software within it are
- refined, the app good, the acceleration curves smooth — but the bike is
- all custom components, and they aren’t the highest quality at that. The
- automatic shifting mechanism on mine failed twice in the first two
- months, requiring shipping the bike to the Vanmoof store.^[17]3 The
- seat post bolt broke off in the post. The original plastic pedals felt
- cheap and flimsy (pedals are one of the few things you can swap for
- your own). The aluminum frame is too stiff for the speed the bike
- generates — it can feel like you’ve been rattled to death after a bumpy
- road. (And stiffness mitigation by lowering tire pressure seems to only
- increase possibility of puncture.) But, more than all that, the design
- of the bike has a dangerous fundamental flaw: The bottom bracket is
- simply too low.
+The electronic brain on the BESV is as dumb as they come.^[19]2 The settings
+reset each time you turn the bike on. The acceleration curves feel unrefined —
+herky-jerky, you might say. Its app is the worst app I have on my phone — badly
+designed, nearly functionally useless, clearly engineered without love. And
+yet. Despite these flaws I put hundreds of kilometers on this thing in the
+first month. The front and rear suspension turn every road to glass, and are
+even fine for dirt trails; I find myself hunting down paths through parks I’d
+never otherwise think about. Suddenly every hilly road is a thing demanding to
+be explored. Up up up the little machine yells, and you follow its command.
- Of all my many, many bikes, I’ve never had a pedal bottom out. On this
- Vanmoof X3? Dozens of times. Most critically during a turn at speed —
- the pedal hit the pavement, jumped the bike sideways, and sent me
- flying. It’s the only bad crash I’ve had in decades. So I’ve had to
- modify the way I ride — no pedaling into or out of turns, hyper
- awareness of deviations in lateral road slope — because, despite all
- this, I can’t stop riding this stupid thing. It sings — that hum. It is
- joy. I reach for it daily and it takes me around the peninsula and
- makes me happy to be alive.
- __________________________________________________________________
+Guests who stay at my studio are given the BESV to ride. We take it down the
+coast. It never fails to amaze. One friend felt compelled to pet it upon
+dismount, saying, Good job, buddy, so quick and deep was the affection for the
+thing.
- BESV @ Lee's Bread, Oiso I've written about three electric bike rides
- for Papersky Magazine: Misaki, Oiso, and Yokosuka.
+The Vanmoof is much smarter — the brain and software within it are refined, the
+app good, the acceleration curves smooth — but the bike is all custom
+components, and they aren’t the highest quality at that. The automatic shifting
+mechanism on mine failed twice in the first two months, requiring shipping the
+bike to the Vanmoof store.^[20]3 The seat post bolt broke off in the post. The
+original plastic pedals felt cheap and flimsy (pedals are one of the few things
+you can swap for your own). The aluminum frame is too stiff for the speed the
+bike generates — it can feel like you’ve been rattled to death after a bumpy
+road. (And stiffness mitigation by lowering tire pressure seems to only
+increase possibility of puncture.) But, more than all that, the design of the
+bike has a dangerous fundamental flaw: The bottom bracket is simply too low.
- Allow me to share a dirty secret: More often than not, at midnight I
- can’t repress the impulse — I have to take a bike out. Out the bike
- comes and together we head into the empty streets of my town and hum
- our way all over, visiting temples in total silence. There are no cars.
- Often no people. It feels illicit — this slipping around town, this
- sliding into temple parking lots in the shroud of the night, looking at
- their old beams, feeling ten years old and grateful for both the
- ability and awareness to be doing just this very thing at this very
- moment.
- __________________________________________________________________
+Of all my many, many bikes, I’ve never had a pedal bottom out. On this Vanmoof
+X3? Dozens of times. Most critically during a turn at speed — the pedal hit the
+pavement, jumped the bike sideways, and sent me flying. It’s the only bad crash
+I’ve had in decades. So I’ve had to modify the way I ride — no pedaling into or
+out of turns, hyper awareness of deviations in lateral road slope — because,
+despite all this, I can’t stop riding this stupid thing. It sings — that hum.
+It is joy. I reach for it daily and it takes me around the peninsula and makes
+me happy to be alive.
- I’ve long since posited world peace could be achieved if you bought
- everyone in the world a bike, but now I want those bikes to be
- electric. I want everyone to feel this silliness, this punch-drunk
- stupidity of pure love, this sense of cheating the rules, the norms,
- this sense of ever-present delight. At our worst, humans mindlessly
- consume, sear the earth and each other, fill our bodies with poisons.
- At our best we invent electric bikes. Batteries have gotten more
- efficient, motors smaller and more powerful. The last decade has
- brought great efficiency to these machines, and the next ten years will
- only double down on these gains. Electric bike numbers are up, year
- over year over year. Tremendously so. Those who know, proselytize. We
- can’t help it. The charm is too great. The game non- zero sum. The more
- people who know, the better the world. It’s a wild notion, this sense
- of goodness to be had if you just reach out for it. Goodness with no
- real downside. Like solar panels or wind turbines, electric bikes are
- machines that buoy the spirit and the earth.
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+BESV @ Lee's Bread, Oiso I've written about three electric bike rides for
+Papersky Magazine: Misaki, Oiso, and Yokosuka.
- Buy the best electric bike you can within your budget. Stretch if
- possible. Usually, the more you spend the lighter the machine, the more
- powerful the motor, the longer-lasting the battery. Depending on which
- country you live in top speeds will differ. In Japan the bike’s are
- capped at 24km/h. In America, 32km/h. Some places only allow for
- pedal-assist — meaning the motor only works when pedaling. Others allow
- throttles, blurring the line between bike and scooter. Laws will change
- in the coming years as more people adopt the machines and cities
- themselves adapt. This is just the start. Ten years ago it was fairly
- rare to see an electric bike around Tokyo. Today, it seems as if every
- parent hauling their kids is doing so electrically.
+Allow me to share a dirty secret: More often than not, at midnight I can’t
+repress the impulse — I have to take a bike out. Out the bike comes and
+together we head into the empty streets of my town and hum our way all over,
+visiting temples in total silence. There are no cars. Often no people. It feels
+illicit — this slipping around town, this sliding into temple parking lots in
+the shroud of the night, looking at their old beams, feeling ten years old and
+grateful for both the ability and awareness to be doing just this very thing at
+this very moment.
- A good strategy: Find a local bike shop that will let you try out
- several electric bikes. Some have front-hub motors, others rear-hub
- motors. Others, the motor sits in the center, between the cranks. Each
- has a subtly different feel. Going up a hill, a front-motor’d machine
- may skip or slip as you pull back on the handlebars, but on flat land
- will feel more like being tugged through the world.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Sure, electric bikes aren’t cheap. But I believe they’re a rare object
- to be well worth the cost. This in spite of their annoying flaws, their
- often bad software, their defective geometries. Because they open the
- world. Whatever world may have been nearby, an electric bike brings it
- nearer. This is worth more than you might estimate. These bikes sing
- their little songs and the smile on your face makes you look like a
- village idiot, but what a wonderful idiot to be.
- __________________________________________________________________
+I’ve long since posited world peace could be achieved if you bought everyone in
+the world a bike, but now I want those bikes to be electric. I want everyone to
+feel this silliness, this punch-drunk stupidity of pure love, this sense of
+cheating the rules, the norms, this sense of ever-present delight. At our
+worst, humans mindlessly consume, sear the earth and each other, fill our
+bodies with poisons. At our best we invent electric bikes. Batteries have
+gotten more efficient, motors smaller and more powerful. The last decade has
+brought great efficiency to these machines, and the next ten years will only
+double down on these gains. Electric bike numbers are up, year over year over
+year. Tremendously so. Those who know, proselytize. We can’t help it. The charm
+is too great. The game non- zero sum. The more people who know, the better the
+world. It’s a wild notion, this sense of goodness to be had if you just reach
+out for it. Goodness with no real downside. Like solar panels or wind turbines,
+electric bikes are machines that buoy the spirit and the earth.
- A summer night: Biking home alongside a river. The air is thick with
- humidity and cicadas vibrate wildly in the distance. The moon is out.
- My choices: straight home along the shimmering moonlit river, or take a
- detour, up into the dark mountains, doubling the distance. To my
- surprise, I choose the mountains almost every time. More! That tiny
- child who fantasized about helicopters yells. More of this, whatever
- this is. More more more. And so I feed that impulse, an impulse
- generated and nurtured by the electric bike. Into the shadow mountains
- we go, up, pushed by the hand of that giant, always present, always
- ready to help. It is a ridiculous thing. A thing of peace and magic. An
- owl hoots. The smile has never left my face.
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-[18]#Noted:
- __________________________________________________________________
+Buy the best electric bike you can within your budget. Stretch if possible.
+Usually, the more you spend the lighter the machine, the more powerful the
+motor, the longer-lasting the battery. Depending on which country you live in
+top speeds will differ. In Japan the bike’s are capped at 24km/h. In America,
+32km/h. Some places only allow for pedal-assist — meaning the motor only works
+when pedaling. Others allow throttles, blurring the line between bike and
+scooter. Laws will change in the coming years as more people adopt the machines
+and cities themselves adapt. This is just the start. Ten years ago it was
+fairly rare to see an electric bike around Tokyo. Today, it seems as if every
+parent hauling their kids is doing so electrically.
- 1. I upgraded my BESV to an SRAM drivetrain and Paul brake levers and
- Klamper disc calipers, some MKS pedals, and a set of Brooks grips
- and saddle and it feels wonderful through and through. These Paul
- Klampers are mechanical. The Vanmoof uses (generic?) hydraulic
- brakes. After thousands of kilometers, my conclusion is: hydraulics
- feel nice, but they are fussy (and perhaps Vanmoof’s chosen
- components are sub-optimal) and difficult (?) to tune on your own.
- In the end, I just don’t think they’re worth it. Too “delicate.”
- The Pauls feel as fresh today as the day I put them on, whereas the
- hydraulics have required much bikeshop tuning over the course of
- the last eighteen months. Were the Vanmoof more flexible, I’d
- happily swap out for mechanicals. This lack of flexibility is a
- bummer because, unlike an Apple iPhone, for example, where the
- components tend to be best of class (think: modem, CPU, camera
- unit, etc), the physical components on a Vanmoof most definitely
- aren’t — nor do they offer the option to pay more to get better
- components. [19]↩︎
- 2. Oh, how I wish this thing was open source, hackable — because it’s
- so close to great. Sadly — and I don’t know how else to frame this
- — it feels like the engineers behind the software don’t ride bikes.
- At least not this one. The software flaws are so fundamentally
- obvious, that anyone who had a) access to the code, and b) rode the
- bike, couldn’t NOT fix these obvious issues. What I really wish,
- though, is that I could slap the Vanmoof brain onto the BESV body
- and, well, then we’d be in Electric Bike Elysium. [20]↩︎
- 3. I’ve since learned — the drive train of the Vanmoof is not to be
- “ridden” like a “bike” but rather, “feathered” like a delicate sand
- castle — assume the gears could explode at any moment and apply the
- least amount of pressure you can; the motor is strong enough to
- take care of most of the rest. In this way, the Vanmoof feels more
- like a moped that uses “pedal assist” as a suggestion than a pure
- electric-assist bike — a smart way to get around motorcycle laws in
- most countries, which I assume is the main point. Not to say you
- don’t get a workout on the Vanmoof, you do, but not nearly as much
- as the more classically committed BESV — which really does require
- you to pedal.
- Maybe this is a good place to bring up the question: Why not just
- get an electric scooter? I think it mainly comes down to
- flexibility and philosophy. With a pedal assist bike (even if the
- pedaling required is minimal) you simply have more flexibility in
- parking, in riding, in “lightness” of transportation, than with an
- electric scooter. Also: Insurance costs, maintenance, and higher
- base cost. And philosophically, being able to still use the bike as
- a “bike” without power feels like an aspect of these machines we
- shouldn’t be so quick to toss aside. [21]↩︎
+A good strategy: Find a local bike shop that will let you try out several
+electric bikes. Some have front-hub motors, others rear-hub motors. Others, the
+motor sits in the center, between the cranks. Each has a subtly different feel.
+Going up a hill, a front-motor’d machine may skip or slip as you pull back on
+the handlebars, but on flat land will feel more like being tugged through the
+world.
- This essay, published September 2022. Thoughts? Email
- [22]me@craigmod.com.
- [23]Craig Mod, his head, floating at the bottom of the article
+Sure, electric bikes aren’t cheap. But I believe they’re a rare object to be
+well worth the cost. This in spite of their annoying flaws, their often bad
+software, their defective geometries. Because they open the world. Whatever
+world may have been nearby, an electric bike brings it nearer. This is worth
+more than you might estimate. These bikes sing their little songs and the smile
+on your face makes you look like a village idiot, but what a wonderful idiot to
+be.
- [24]Craig Mod is a writer and photographer based in Japan. He's the
- author of the books [25]Things Become Other Things and [26]Kissa by
- Kissa and is a MacDowell, Ragdale, and VCCA writing fellow. His essays
- and articles have appeared in The New York Times, Eater, The Atlantic,
- California Sunday Magazine, Wired, Aeon, New Scientist, Virginia
- Quarterly Review, The New Yorker, The Morning News, Codex: Journal of
- Typography, and elsewhere.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- He writes newsletters, oh yes, [27]newsletters: [28]Roden &
- [29]Ridgeline.
+A summer night: Biking home alongside a river. The air is thick with humidity
+and cicadas vibrate wildly in the distance. The moon is out. My choices:
+straight home along the shimmering moonlit river, or take a detour, up into the
+dark mountains, doubling the distance. To my surprise, I choose the mountains
+almost every time. More! That tiny child who fantasized about helicopters
+yells. More of this, whatever this is. More more more. And so I feed that
+impulse, an impulse generated and nurtured by the electric bike. Into the
+shadow mountains we go, up, pushed by the hand of that giant, always present,
+always ready to help. It is a ridiculous thing. A thing of peace and magic. An
+owl hoots. The smile has never left my face.
- The work on this site is supported in part by [30]paid memberships.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Whatever you do, don't follow @craigmod on [31]Threads or
- [32]Instagram.
+[21]#Noted:
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+ 1. I upgraded my BESV to an SRAM drivetrain and Paul brake levers and Klamper
+ disc calipers, some MKS pedals, and a set of Brooks grips and saddle and it
+ feels wonderful through and through. These Paul Klampers are mechanical.
+ The Vanmoof uses (generic?) hydraulic brakes. After thousands of
+ kilometers, my conclusion is: hydraulics feel nice, but they are fussy (and
+ perhaps Vanmoof’s chosen components are sub-optimal) and difficult (?) to
+ tune on your own. In the end, I just don’t think they’re worth it. Too
+ “delicate.” The Pauls feel as fresh today as the day I put them on, whereas
+ the hydraulics have required much bikeshop tuning over the course of the
+ last eighteen months. Were the Vanmoof more flexible, I’d happily swap out
+ for mechanicals. This lack of flexibility is a bummer because, unlike an
+ Apple iPhone, for example, where the components tend to be best of class
+ (think: modem, CPU, camera unit, etc), the physical components on a Vanmoof
+ most definitely aren’t — nor do they offer the option to pay more to get
+ better components. [22]↩︎
+
+ 2. Oh, how I wish this thing was open source, hackable — because it’s so close
+ to great. Sadly — and I don’t know how else to frame this — it feels like
+ the engineers behind the software don’t ride bikes. At least not this one.
+ The software flaws are so fundamentally obvious, that anyone who had a)
+ access to the code, and b) rode the bike, couldn’t NOT fix these obvious
+ issues. What I really wish, though, is that I could slap the Vanmoof brain
+ onto the BESV body and, well, then we’d be in Electric Bike Elysium. [23]↩︎
+
+ 3. I’ve since learned — the drive train of the Vanmoof is not to be “ridden”
+ like a “bike” but rather, “feathered” like a delicate sand castle — assume
+ the gears could explode at any moment and apply the least amount of
+ pressure you can; the motor is strong enough to take care of most of the
+ rest. In this way, the Vanmoof feels more like a moped that uses “pedal
+ assist” as a suggestion than a pure electric-assist bike — a smart way to
+ get around motorcycle laws in most countries, which I assume is the main
+ point. Not to say you don’t get a workout on the Vanmoof, you do, but not
+ nearly as much as the more classically committed BESV — which really does
+ require you to pedal.
+
+ Maybe this is a good place to bring up the question: Why not just get an
+ electric scooter? I think it mainly comes down to flexibility and
+ philosophy. With a pedal assist bike (even if the pedaling required is
+ minimal) you simply have more flexibility in parking, in riding, in
+ “lightness” of transportation, than with an electric scooter. Also:
+ Insurance costs, maintenance, and higher base cost. And philosophically,
+ being able to still use the bike as a “bike” without power feels like an
+ aspect of these machines we shouldn’t be so quick to toss aside. [24]↩︎
+
+[25] [26]
+
+This essay, published September 2022. Thoughts? Email [27]me@craigmod.com.
+
+[28]Craig Mod, his head, floating at the bottom of the article
+
+[29]Craig Mod is a writer and photographer based in Japan. He's the author of
+the books [30]Things Become Other Things and [31]Kissa by Kissa and is a
+MacDowell, Ragdale, and VCCA writing fellow. His essays and articles have
+appeared in The New York Times, Eater, The Atlantic, California Sunday Magazine
+, Wired, Aeon, New Scientist, Virginia Quarterly Review, The New Yorker, The
+Morning News, Codex: Journal of Typography, and elsewhere.
+
+He writes newsletters, oh yes, [32]newsletters: [33]Roden & [34]Ridgeline.
+
+The work on this site is supported in part by [35]paid memberships.
+
+Whatever you do, don't follow @craigmod on [36]Threads or [37]Instagram.
Subscribe to my newsletters
- Join some ~30,000 other subscribers.
- [33]Roden: photography × literature × tech × film (monthly)
- [34]Ridgeline: walking × Japan (weekly)
- Always one-click to unsubscribe.
- ____________________
- [X] Roden (monthly)
- [X] Ridgeline (weekly)
- (BUTTON) Subscribe
+Join some ~30,000 other subscribers.
+[38]Roden: photography × literature × tech × film (monthly)
+[39]Ridgeline: walking × Japan (weekly)
+
+Always one-click to unsubscribe.
+
+[40][ ]
+[41][*] Roden (monthly)
+[42][*] Ridgeline (weekly)
+Subscribe
Popular Essays
+[44]
+
-An endless, gritty, very spitty walk
+The Buzz Cut
-Good walks benefit from context.
+You'd think a buzz would be a buzz would be a buzz
+
+[45]
+
+
+Walking Around Kan Yasuda's Sculptures
+
+Exploring Arte Piazza in Hokkaido
+
+[46]
+
+
+Pop-Up Walk
+
+What does a pop-up walk look like?
+
+[47]
+
+
+Stab a Book, the Book Won't Die
+
+On the resilience of books in the face of apps, attention monsters, and an
+ad-driven online economy
+
+[48][ ]
+
+Produced / written / maintained by [49]Craig Mod since 2002
+
+[50] [51] [52] [53]
+
+[piwik]
-How I Got My Attention Back
+References:
-Technology is commanding our attention in infinite, insurmountable loops. A
-country trip off-grid helped me escape.
-
-
-Annapurna Moonrise
-
-A night on Annapurna basecamp
-
-
-The Leica Q
-
-A six month field test — by Craig Mod
-
- ____________________
-
- Produced / written / maintained by [35]Craig Mod since 2002
-
-References
-
- Visible links:
- 1. https://craigmod.com/index.xml
- 2. https://craigmod.com/about/
- 3. https://craigmod.com/books/
- 4. https://craigmod.com/essays/
- 5. https://craigmod.com/membership/
- 6. https://shop.specialprojects.jp/
- 7. https://craigmod.com/membership/
- 8. https://craigmod.com/onmargins/
- 9. https://sw945.craigmod.com/
- 10. https://craigmod.com/newsletters/
- 11. https://craigmod.com/roden/
- 12. https://craigmod.com/ridgeline/
- 13. https://craigmod.com/essays/electric_bikes/#so-many-bikes
- 14. https://craigmod.com/essays/electric_bikes/#electrics
- 15. https://craigmod.com/essays/electric_bikes/#fn:1
- 16. https://craigmod.com/essays/electric_bikes/#fn:2
- 17. https://craigmod.com/essays/electric_bikes/#fn:3
- 18. https://craigmod.com/essays/electric_bikes/#noted
- 19. https://craigmod.com/essays/electric_bikes/#fnref:1
- 20. https://craigmod.com/essays/electric_bikes/#fnref:2
- 21. https://craigmod.com/essays/electric_bikes/#fnref:3
- 22. mailto:me@craigmod.com
- 23. https://craigmod.com/about/
- 24. https://craigmod.com/about/
- 25. https://shop.specialprojects.jp/products/things-become-other-things-1st-ed/
- 26. https://shop.specialprojects.jp/products/kissa-by-kissa-4th-ed
- 27. https://craigmod.com/newsletters
- 28. https://craigmod.com/explorers/
- 29. https://craigmod.com/ridgeline/
- 30. https://craigmod.com/membership/
- 31. http://threads.net/@craigmod/
- 32. http://instagram.com/craigmod
- 33. https://craigmod.com/roden/
- 34. https://craigmod.com/ridgeline/
- 35. https://craigmod.com/about/
-
- Hidden links:
- 37. https://craigmod.com/
- 38. https://threads.net/@craigmod/
- 39. https://instagram.com/craigmod/
- 40. https://mastodon.social/@craigmod
- 41. mailto:?subject=From%20craigmod.com:%20Electric%20Bike%2c%20Stupid%20Love%20of%20My%20Life&body=I%20think%20you%20might%20enjoy%20this%20article:%0D%0Ahttps%3a%2f%2fcraigmod.com%2fessays%2felectric_bikes%2f%20%0D%0A
- 42. https://twitter.com/intent/tweet?text=Electric%20Bike,%20Stupid%20Love%20of%20My%20Life+https://craigmod.com/essays/electric_bikes/
- 43. https://craigmod.com/ridgeline/001/
- 44. https://craigmod.com/essays/how_i_got_my_attention_back/
- 45. https://craigmod.com/journal/annapurna_moonrise/
- 46. https://craigmod.com/essays/leica_q/
- 47. https://threads.net/@craigmod/
- 48. https://instagram.com/craigmod/
- 49. https://mastodon.social/@craigmod
- 50. https://craigmod.com/index.xml
+[1] https://craigmod.com/
+[2] https://craigmod.com/about/
+[3] https://craigmod.com/books/
+[4] https://craigmod.com/essays/
+[5] https://craigmod.com/membership/
+[6] https://shop.specialprojects.jp/
+[7] https://craigmod.com/membership/
+[8] https://craigmod.com/onmargins/
+[9] https://sw945.craigmod.com/
+[10] https://craigmod.com/newsletters/
+[11] https://craigmod.com/roden/
+[12] https://craigmod.com/ridgeline/
+[13] https://threads.net/@craigmod/
+[14] https://instagram.com/craigmod/
+[15] https://mastodon.social/@craigmod
+[16] https://craigmod.com/essays/electric_bikes/#so-many-bikes
+[17] https://craigmod.com/essays/electric_bikes/#electrics
+[18] https://craigmod.com/essays/electric_bikes/#fn:1
+[19] https://craigmod.com/essays/electric_bikes/#fn:2
+[20] https://craigmod.com/essays/electric_bikes/#fn:3
+[21] https://craigmod.com/essays/electric_bikes/#noted
+[22] https://craigmod.com/essays/electric_bikes/#fnref:1
+[23] https://craigmod.com/essays/electric_bikes/#fnref:2
+[24] https://craigmod.com/essays/electric_bikes/#fnref:3
+[25] mailto:?subject=From%20craigmod.com:%20Electric%20Bike%2c%20Stupid%20Love%20of%20My%20Life&body=I%20think%20you%20might%20enjoy%20this%20article:%0D%0Ahttps%3a%2f%2fcraigmod.com%2fessays%2felectric_bikes%2f%20%0D%0A
+[26] https://twitter.com/intent/tweet?text=Electric%20Bike,%20Stupid%20Love%20of%20My%20Life+https://craigmod.com/essays/electric_bikes/
+[27] mailto:me@craigmod.com
+[28] https://craigmod.com/about/
+[29] https://craigmod.com/about/
+[30] https://shop.specialprojects.jp/products/things-become-other-things-1st-ed/
+[31] https://shop.specialprojects.jp/products/kissa-by-kissa-4th-ed
+[32] https://craigmod.com/newsletters
+[33] https://craigmod.com/explorers/
+[34] https://craigmod.com/ridgeline/
+[35] https://craigmod.com/membership/
+[36] http://threads.net/@craigmod/
+[37] http://instagram.com/craigmod
+[38] https://craigmod.com/roden/
+[39] https://craigmod.com/ridgeline/
+[44] https://craigmod.com/ridgeline/106/
+[45] https://craigmod.com/ridgeline/159/
+[46] https://craigmod.com/ridgeline/047/
+[47] https://craigmod.com/essays/media_accounting/
+[49] https://craigmod.com/about/
+[50] https://threads.net/@craigmod/
+[51] https://instagram.com/craigmod/
+[52] https://mastodon.social/@craigmod
+[53] https://craigmod.com/index.xml
diff --git a/static/archive/crawshaw-io-k5slfj.txt b/static/archive/crawshaw-io-k5slfj.txt
index bb3ffe2..42b413a 100644
--- a/static/archive/crawshaw-io-k5slfj.txt
+++ b/static/archive/crawshaw-io-k5slfj.txt
@@ -1,103 +1,89 @@
- #[1]crawshaw.io atom feed
-
One process programming notes (with Go and SQLite)
- 2018 July 30
+2018 July 30
- Blog-ified version of a talk I gave at [2]Go Northwest.
+Blog-ified version of a talk I gave at [1]Go Northwest.
- This content covers my recent exploration of writing internet services,
- iOS apps, and macOS programs as an indie developer.
+This content covers my recent exploration of writing internet services, iOS
+apps, and macOS programs as an indie developer.
- There are several topics here that should each have their own blog
- post. But as I have a lot of programming to do I am going to put these
- notes up as is and split the material out some time later.
+There are several topics here that should each have their own blog post. But as
+I have a lot of programming to do I am going to put these notes up as is and
+split the material out some time later.
- My focus has been on how to adapt the lessons I have learned working in
- teams at Google to a single programmer building small business work.
- There are many great engineering practices in Silicon Valleyʼs big
- companies and well-capitalized VC firms, but one person does not have
- enough bandwidth to use them all and write software. The exercise for
- me is: what to keep and what must go.
+My focus has been on how to adapt the lessons I have learned working in teams
+at Google to a single programmer building small business work. There are many
+great engineering practices in Silicon Valley's big companies and
+well-capitalized VC firms, but one person does not have enough bandwidth to use
+them all and write software. The exercise for me is: what to keep and what must
+go.
- If I have been doing it right, the technology and techniques described
- here will sound easy. I have to fit it all in my head while having
- enough capacity left over to write software people want. Every extra
- thing has great cost, especially rarely touched software that comes
- back to bite in the middle of the night six months later.
+If I have been doing it right, the technology and techniques described here
+will sound easy. I have to fit it all in my head while having enough capacity
+left over to write software people want. Every extra thing has great cost,
+especially rarely touched software that comes back to bite in the middle of the
+night six months later.
- Two key technologies I have decided to use are Go and SQLite.
+Two key technologies I have decided to use are Go and SQLite.
A brief introduction to SQLite
- SQLite is an implementation of SQL. Unlike traditional database
- implementations like PostgreSQL or MySQL, SQLite is a self-contained C
- library designed to be embedded into programs. It has been built by D.
- Richard Hipp since its release in 2000, and in the past 18 years other
- open source contributors have helped. At this point it has been around
- most of the time I have been programming and is a core part of my
- programming toolbox.
+SQLite is an implementation of SQL. Unlike traditional database implementations
+like PostgreSQL or MySQL, SQLite is a self-contained C library designed to be
+embedded into programs. It has been built by D. Richard Hipp since its release
+in 2000, and in the past 18 years other open source contributors have helped.
+At this point it has been around most of the time I have been programming and
+is a core part of my programming toolbox.
Hands-on with the SQLite command line tool
- Rather than talk through SQLite in the abstract, let me show it to you.
+Rather than talk through SQLite in the abstract, let me show it to you.
+
+A kind person on Kaggle has [2]provided a CSV file of the plays of Shakespeare.
+Let's build an SQLite database out of it.
- A kind person on Kaggle has [3]provided a CSV file of the plays of
- Shakespeare. Letʼs build an SQLite database out of it.
$ head shakespeare_data.csv
"Dataline","Play","PlayerLinenumber","ActSceneLine","Player","PlayerLine"
"1","Henry IV",,,,"ACT I"
"2","Henry IV",,,,"SCENE I. London. The palace."
-"3","Henry IV",,,,"Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMOR
-ELAND, SIR WALTER BLUNT, and others"
-"4","Henry IV","1","1.1.1","KING HENRY IV","So shaken as we are, so wan with car
-e,"
-"5","Henry IV","1","1.1.2","KING HENRY IV","Find we a time for frighted peace to
- pant,"
-"6","Henry IV","1","1.1.3","KING HENRY IV","And breathe short-winded accents of
-new broils"
-"7","Henry IV","1","1.1.4","KING HENRY IV","To be commenced in strands afar remo
-te."
-"8","Henry IV","1","1.1.5","KING HENRY IV","No more the thirsty entrance of this
- soil"
-"9","Henry IV","1","1.1.6","KING HENRY IV","Shall daub her lips with her own chi
-ldren's blood,"
+"3","Henry IV",,,,"Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMORELAND, SIR WALTER BLUNT, and others"
+"4","Henry IV","1","1.1.1","KING HENRY IV","So shaken as we are, so wan with care,"
+"5","Henry IV","1","1.1.2","KING HENRY IV","Find we a time for frighted peace to pant,"
+"6","Henry IV","1","1.1.3","KING HENRY IV","And breathe short-winded accents of new broils"
+"7","Henry IV","1","1.1.4","KING HENRY IV","To be commenced in strands afar remote."
+"8","Henry IV","1","1.1.5","KING HENRY IV","No more the thirsty entrance of this soil"
+"9","Henry IV","1","1.1.6","KING HENRY IV","Shall daub her lips with her own children's blood,"
+
+First, let's use the sqlite command line tool to create a new database and
+import the CSV.
- First, letʼs use the sqlite command line tool to create a new database
- and import the CSV.
$ sqlite3 shakespeare.db
sqlite> .mode csv
sqlite> .import shakespeare_data.csv import
- Done! A couple of SELECTs will let us quickly see if it worked.
+Done! A couple of SELECTs will let us quickly see if it worked.
+
sqlite> SELECT count(*) FROM import;
111396
sqlite> SELECT * FROM import LIMIT 10;
1,"Henry IV","","","","ACT I"
2,"Henry IV","","","","SCENE I. London. The palace."
-3,"Henry IV","","","","Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WES
-TMORELAND, SIR WALTER BLUNT, and others"
+3,"Henry IV","","","","Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMORELAND, SIR WALTER BLUNT, and others"
4,"Henry IV",1,1.1.1,"KING HENRY IV","So shaken as we are, so wan with care,"
-5,"Henry IV",1,1.1.2,"KING HENRY IV","Find we a time for frighted peace to pant,
-"
-6,"Henry IV",1,1.1.3,"KING HENRY IV","And breathe short-winded accents of new br
-oils"
+5,"Henry IV",1,1.1.2,"KING HENRY IV","Find we a time for frighted peace to pant,"
+6,"Henry IV",1,1.1.3,"KING HENRY IV","And breathe short-winded accents of new broils"
7,"Henry IV",1,1.1.4,"KING HENRY IV","To be commenced in strands afar remote."
8,"Henry IV",1,1.1.5,"KING HENRY IV","No more the thirsty entrance of this soil"
-9,"Henry IV",1,1.1.6,"KING HENRY IV","Shall daub her lips with her own children'
-s blood,"
+9,"Henry IV",1,1.1.6,"KING HENRY IV","Shall daub her lips with her own children's blood,"
- Looks good! Now we can do a little cleanup. The original CSV contains a
- column called AceSceneLine that uses dots to encode Act number, Scene
- number, and Line number. Those would look much nicer as their own
- columns.
-sqlite> CREATE TABLE plays (rowid INTEGER PRIMARY KEY, play, linenumber, act, sc
-ene, line, player, text);
+Looks good! Now we can do a little cleanup. The original CSV contains a column
+called AceSceneLine that uses dots to encode Act number, Scene number, and Line
+number. Those would look much nicer as their own columns.
+
+sqlite> CREATE TABLE plays (rowid INTEGER PRIMARY KEY, play, linenumber, act, scene, line, player, text);
sqlite> .schema
-CREATE TABLE import (rowid primary key, play, playerlinenumber, actsceneline, pl
-ayer, playerline);
-CREATE TABLE plays (rowid primary key, play, linenumber, act, scene, line, playe
-r, text);
+CREATE TABLE import (rowid primary key, play, playerlinenumber, actsceneline, player, playerline);
+CREATE TABLE plays (rowid primary key, play, linenumber, act, scene, line, player, text);
sqlite> INSERT INTO plays SELECT
row AS rowid,
play,
@@ -109,83 +95,82 @@ sqlite> INSERT INTO plays SELECT
playerline AS text
FROM import;
- (The substr above can be improved by using instr to find the ʼ.ʼ
- characters. Exercise left for the reader.)
+(The substr above can be improved by using instr to find the '.' characters.
+Exercise left for the reader.)
- Here we used the INSERT ... SELECT syntax to build a table out of
- another table. The ActSceneLine column was split apart using the
- builtin SQLite function substr, which slices strings.
+Here we used the INSERT ... SELECT syntax to build a table out of another
+table. The ActSceneLine column was split apart using the builtin SQLite
+function substr, which slices strings.
+
+The result:
- The result:
sqlite> SELECT * FROM plays LIMIT 10;
1,"Henry IV","","","","","","ACT I"
2,"Henry IV","","","","","","SCENE I. London. The palace."
-3,"Henry IV","","","","","","Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL
-of WESTMORELAND, SIR WALTER BLUNT, and others"
+3,"Henry IV","","","","","","Enter KING HENRY, LORD JOHN OF LANCASTER, the EARL of WESTMORELAND, SIR WALTER BLUNT, and others"
4,"Henry IV",1,1,1,1,"KING HENRY IV","So shaken as we are, so wan with care,"
-5,"Henry IV",1,1,1,2,"KING HENRY IV","Find we a time for frighted peace to pant,
-"
-6,"Henry IV",1,1,1,3,"KING HENRY IV","And breathe short-winded accents of new br
-oils"
+5,"Henry IV",1,1,1,2,"KING HENRY IV","Find we a time for frighted peace to pant,"
+6,"Henry IV",1,1,1,3,"KING HENRY IV","And breathe short-winded accents of new broils"
7,"Henry IV",1,1,1,4,"KING HENRY IV","To be commenced in strands afar remote."
8,"Henry IV",1,1,1,5,"KING HENRY IV","No more the thirsty entrance of this soil"
-9,"Henry IV",1,1,1,6,"KING HENRY IV","Shall daub her lips with her own children'
-s blood,"
+9,"Henry IV",1,1,1,6,"KING HENRY IV","Shall daub her lips with her own children's blood,"
+
+Now we have our data, let us search for something:
- Now we have our data, let us search for something:
sqlite> SELECT * FROM plays WHERE text LIKE "whether tis nobler%";
sqlite>
- That did not work. Hamlet definitely says that, but perhaps the text
- formatting is slightly off. SQLite to the rescue. It ships with a Full
- Text Search extension compiled in. Let us index all of Shakespeare with
- FTS5:
+That did not work. Hamlet definitely says that, but perhaps the text formatting
+is slightly off. SQLite to the rescue. It ships with a Full Text Search
+extension compiled in. Let us index all of Shakespeare with FTS5:
+
sqlite> CREATE VIRTUAL TABLE playsearch USING fts5(playsrowid, text);
sqlite> INSERT INTO playsearch SELECT rowid, text FROM plays;
- Now we can search for our soliloquy:
-sqlite> SELECT rowid, text FROM playsearch WHERE text MATCH "whether tis nobler"
-;
+Now we can search for our soliloquy:
+
+sqlite> SELECT rowid, text FROM playsearch WHERE text MATCH "whether tis nobler";
34232|Whether 'tis nobler in the mind to suffer
- Success! The act and scene can be acquired by joining with our original
- table.
+Success! The act and scene can be acquired by joining with our original table.
+
sqlite> SELECT play, act, scene, line, player, plays.text
FROM playsearch
INNER JOIN plays ON playsearch.playsrowid = plays.rowid
WHERE playsearch.text MATCH "whether tis nobler";
Hamlet|3|1|65|HAMLET|Whether 'tis nobler in the mind to suffer
- Letʼs clean up.
+Let's clean up.
+
sqlite> DROP TABLE import;
sqlite> VACUUM;
- Finally, what does all of this look like on the file system?
+Finally, what does all of this look like on the file system?
+
$ ls -l
-rwxr-xr-x@ 1 crawshaw staff 10188854 Apr 27 2017 shakespeare_data.csv
-rw-r--r-- 1 crawshaw staff 22286336 Jul 25 22:05 shakespeare.db
- There you have it. The SQLite database contains two full copies of the
- plays of Shakespeare, one with a full text search index, and stores
- both of them in about twice the space it takes the original CSV file to
- store one. Not bad.
+There you have it. The SQLite database contains two full copies of the plays of
+Shakespeare, one with a full text search index, and stores both of them in
+about twice the space it takes the original CSV file to store one. Not bad.
- That should give you a feel for the i-t-e of SQLite.
+That should give you a feel for the i-t-e of SQLite.
- And scene.
+And scene.
Using SQLite from Go
The standard database/sql
- There are a number of cgo-based [4]database/sql drivers available for
- SQLite. The most popular one appears to be
- [5]github.com/mattn/go-sqlite3. It gets the job done and is probably
- what you want.
+There are a number of cgo-based [3]database/sql drivers available for SQLite.
+The most popular one appears to be [4]github.com/mattn/go-sqlite3. It gets the
+job done and is probably what you want.
+
+Using the database/sql package it is straightforward to open an SQLite database
+and execute SQL statements on it. For example, we can run the FTS query from
+earlier using this Go code:
- Using the database/sql package it is straightforward to open an SQLite
- database and execute SQL statements on it. For example, we can run the
- FTS query from earlier using this Go code:
package main
import (
@@ -212,69 +197,67 @@ func main() {
}
var play, text string
var act, scene int
- err = stmt.QueryRow("whether tis nobler").Scan(&play, &act, &scene, &tex
-t)
+ err = stmt.QueryRow("whether tis nobler").Scan(&play, &act, &scene, &text)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s %d:%d: %q\n", play, act, scene, text)
}
- Executing it yields:
+Executing it yields:
+
Hamlet 3:1 "Whether 'tis nobler in the mind to suffer"
A low-level wrapper: crawshaw.io/sqlite
- Just as SQLite steps beyond the basics of SELECT, INSERT, UPDATE,
- DELETE with full-text search, it has several other interesting features
- and extensions that cannot be accessed by SQL statements alone. These
- need specialized interfaces, and many of the interfaces are not
- supported by any of the existing drivers.
+Just as SQLite steps beyond the basics of SELECT, INSERT, UPDATE, DELETE with
+full-text search, it has several other interesting features and extensions that
+cannot be accessed by SQL statements alone. These need specialized interfaces,
+and many of the interfaces are not supported by any of the existing drivers.
- So I wrote my own. You can get it from [6]crawshaw.io/sqlite. In
- particular, it supports the streaming blob interface, the [7]session
- extension, and implements the necessary sqlite_unlock_notify machinery
- to make good use of the [8]shared cache for connection pools. I am
- going to cover these features through two use case studies: the client
- and the cloud.
+So I wrote my own. You can get it from [5]crawshaw.io/sqlite. In particular, it
+supports the streaming blob interface, the [6]session extension, and implements
+the necessary sqlite_unlock_notify machinery to make good use of the [7]shared
+cache for connection pools. I am going to cover these features through two use
+case studies: the client and the cloud.
cgo
- All of these approaches rely on cgo for integrating C into Go. This is
- straightforward to do, but adds some operational complexity. Building a
- Go program using SQLite requires a C compiler for the target.
+All of these approaches rely on cgo for integrating C into Go. This is
+straightforward to do, but adds some operational complexity. Building a Go
+program using SQLite requires a C compiler for the target.
- In practice, this means if you develop on macOS you need to install a
- cross-compiler for linux.
+In practice, this means if you develop on macOS you need to install a
+cross-compiler for linux.
- Typical concerns about the impact on software quality of adding C code
- to Go do not apply to SQLite as it has an extraordinary degree of
- testing. The quality of the code is exceptional.
+Typical concerns about the impact on software quality of adding C code to Go do
+not apply to SQLite as it has an extraordinary degree of testing. The quality
+of the code is exceptional.
Go and SQLite for the client
- I am building an [9]iOS app, with almost all the code written in Go and
- the UI provided by a web view. This app has a full copy of the user
- data, it is not a thin view onto an internet server. This means storing
- a large amount of local, structured data, on-device full text
- searching, background tasks working on the database in a way that does
- not disrupt the UI, and syncing DB changes to a backup in the cloud.
+I am building an [8]iOS app, with almost all the code written in Go and the UI
+provided by a web view. This app has a full copy of the user data, it is not a
+thin view onto an internet server. This means storing a large amount of local,
+structured data, on-device full text searching, background tasks working on the
+database in a way that does not disrupt the UI, and syncing DB changes to a
+backup in the cloud.
- That is a lot of moving parts for a client. More than I want to write
- in JavaScript, and more than I want to write in Swift and then have to
- promptly rewrite if I ever manage to build an Android app. More
- importantly, the server is in Go, and I am one independent developer.
- It is absolutely vital I reduce the number of moving pieces in my
- development environment to the smallest possible number. Hence the
- effort to build (the big bits) of a client using the exact same
- technology as my server.
+That is a lot of moving parts for a client. More than I want to write in
+JavaScript, and more than I want to write in Swift and then have to promptly
+rewrite if I ever manage to build an Android app. More importantly, the server
+is in Go, and I am one independent developer. It is absolutely vital I reduce
+the number of moving pieces in my development environment to the smallest
+possible number. Hence the effort to build (the big bits) of a client using the
+exact same technology as my server.
The Session extension
- The session extension lets you start a session on an SQLite connection.
- All changes made to the database through that connection are bundled
- into a patchset blob. The extension also provides method for applying
- the generated patchset to a table.
+The session extension lets you start a session on an SQLite connection. All
+changes made to the database through that connection are bundled into a
+patchset blob. The extension also provides method for applying the generated
+patchset to a table.
+
func (conn *Conn) CreateSession(db string) (*Session, error)
func (s *Session) Changeset(w io.Writer) error
@@ -285,49 +268,46 @@ func (conn *Conn) ChangesetApply(
conflictFn func(ConflictType, ChangesetIter) ConflictAction,
) error
- This can be used to build a very simple client-sync system. Collect the
- changes made in a client, periodically bundle them up into a changeset
- and upload it to the server where it is applied to a backup copy of the
- database. If another client changes the database then the server
- advertises it to the client, who downloads a changeset and applies it.
+This can be used to build a very simple client-sync system. Collect the changes
+made in a client, periodically bundle them up into a changeset and upload it to
+the server where it is applied to a backup copy of the database. If another
+client changes the database then the server advertises it to the client, who
+downloads a changeset and applies it.
- This requires a bit of care in the database design. The reason I kept
- the FTS table separate in the Shakespeare example is I keep my FTS
- tables in a separate attached database (which in SQLite, means a
- different file). The cloud backup database never generates the FTS
- tables, the client is free to generate the tables in a background
- thread and they can lag behind data backups.
+This requires a bit of care in the database design. The reason I kept the FTS
+table separate in the Shakespeare example is I keep my FTS tables in a separate
+attached database (which in SQLite, means a different file). The cloud backup
+database never generates the FTS tables, the client is free to generate the
+tables in a background thread and they can lag behind data backups.
- Another point of care is minimizing conflicts. The biggest one is
- AUTOINCREMENT keys. By default the primary key of a rowid table is
- incremented, which means if you have multiple clients generating rowids
- you will see lots of conflicts.
+Another point of care is minimizing conflicts. The biggest one is AUTOINCREMENT
+keys. By default the primary key of a rowid table is incremented, which means
+if you have multiple clients generating rowids you will see lots of conflicts.
- I have been trialing two different solutions. The first is having each
- client register a rowid range with the server and only allocate from
- its own range. It works. The second is randomly generating int64
- values, and relying on the low collision rate. So far it works too.
- Both strategies have risks, and I havenʼt decided which is better.
+I have been trialing two different solutions. The first is having each client
+register a rowid range with the server and only allocate from its own range. It
+works. The second is randomly generating int64 values, and relying on the low
+collision rate. So far it works too. Both strategies have risks, and I haven't
+decided which is better.
- In practice, I have found I have to limit DB updates to a single
- connection to keep changeset quality high. (A changeset does not see
- changes made on other connections.) To do this I maintain a read-only
- pool of connections and a single guarded read-write connection in a
- pool of 1. The code only grabs the read-write connection when it needs
- it, and the read-only connections are enforced by the read-only bit on
- the SQLite connection.
+In practice, I have found I have to limit DB updates to a single connection to
+keep changeset quality high. (A changeset does not see changes made on other
+connections.) To do this I maintain a read-only pool of connections and a
+single guarded read-write connection in a pool of 1. The code only grabs the
+read-write connection when it needs it, and the read-only connections are
+enforced by the read-only bit on the SQLite connection.
Nested Transactions
- The database/sql driver encourages the use of SQL transactions with its
- Tx type, but this does not appear to play well with nested
- transactions. This is a concept implemented by SAVEPOINT / RELEASE in
- SQL, and it makes for surprisingly composable code.
+The database/sql driver encourages the use of SQL transactions with its Tx
+type, but this does not appear to play well with nested transactions. This is a
+concept implemented by SAVEPOINT / RELEASE in SQL, and it makes for
+surprisingly composable code.
+
+If a function needs to make multiple statements in a transaction, it can open
+with a SAVEPOINT, then defer a call to RELEASE if the function produces no Go
+return error, or if it does instead call ROLLBACK and return the error.
- If a function needs to make multiple statements in a transaction, it
- can open with a SAVEPOINT, then defer a call to RELEASE if the function
- produces no Go return error, or if it does instead call ROLLBACK and
- return the error.
func f(conn *sqlite.Conn) (err error) {
conn...SAVEPOINT
defer func() {
@@ -339,23 +319,25 @@ func f(conn *sqlite.Conn) (err error) {
}()
}
- Now if this transactional function f needs to call another
- transactional function g, then g can use exactly the same strategy and
- f can call it in a very traditional Go way:
+Now if this transactional function f needs to call another transactional
+function g, then g can use exactly the same strategy and f can call it in a
+very traditional Go way:
+
if err := g(conn); err != nil {
return err // all changes in f will be rolled back by the defer
}
- The function g is also perfectly safe to use in its own right, as it
- has its own transaction.
+The function g is also perfectly safe to use in its own right, as it has its
+own transaction.
- I have been using this SAVEPOINT + defer RELEASE or return an error
- semantics for several months now and find it invaluable. It makes it
- easy to safely wrap code in SQL transactions.
+I have been using this SAVEPOINT + defer RELEASE or return an error semantics
+for several months now and find it invaluable. It makes it easy to safely wrap
+code in SQL transactions.
+
+The example above however is a bit bulky, and there are some edge cases that
+need to be handled. (For example, if the RELEASE fails, then an error needs to
+be returned.) So I have wrapped this up in a utility:
- The example above however is a bit bulky, and there are some edge cases
- that need to be handled. (For example, if the RELEASE fails, then an
- error needs to be returned.) So I have wrapped this up in a utility:
func f(conn *sqlite.Conn) (err error) {
defer sqlitex.Save(conn)(&err)
@@ -363,130 +345,124 @@ func f(conn *sqlite.Conn) (err error) {
// with other functions that call sqlitex.Save.
}
- The first time you see sqlitex.Save in action it can be a little
- off-putting, at least it was for me when I first created it. But I
- quickly got used to it, and it does a lot of heavy lifting. The first
- call to sqlitex.Save opens a SAVEPOINT on the conn and returns a
- closure that either RELEASEs or ROLLBACKs depending on the value of
- err, and sets err if necessary.
+The first time you see sqlitex.Save in action it can be a little off-putting,
+at least it was for me when I first created it. But I quickly got used to it,
+and it does a lot of heavy lifting. The first call to sqlitex.Save opens a
+SAVEPOINT on the conn and returns a closure that either RELEASEs or ROLLBACKs
+depending on the value of err, and sets err if necessary.
Go and SQLite in the cloud
- I have spent several months now redesigning services I have encountered
- before and designing services for problems I would like to work on
- going forward. The process has led me to a general design that works
- for many problems and I quite enjoy building.
+I have spent several months now redesigning services I have encountered before
+and designing services for problems I would like to work on going forward. The
+process has led me to a general design that works for many problems and I quite
+enjoy building.
- It can be summarized as 1 VM, 1 Zone, 1 process programming.
+It can be summarized as 1 VM, 1 Zone, 1 process programming.
- If this sounds ridiculously simplistic to you, I think thatʼs good! It
- is simple. It does not meet all sorts of requirements that we would
- like our modern fancy cloud services to meet. It is not "serverless",
- which means when a service is extremely small it does not run for free,
- and when a service grows it does not automatically scale. Indeed, there
- is an explicit scaling limit. Right now the best server you can get
- from Amazon is roughly:
- * 128 CPU threads at ~4GHz
- * 4TB RAM
- * 25 Gbit ethernet
- * 10 Gbps NAS
- * hours of yearly downtime
+If this sounds ridiculously simplistic to you, I think that's good! It is
+simple. It does not meet all sorts of requirements that we would like our
+modern fancy cloud services to meet. It is not "serverless", which means when a
+service is extremely small it does not run for free, and when a service grows
+it does not automatically scale. Indeed, there is an explicit scaling limit.
+Right now the best server you can get from Amazon is roughly:
- That is a huge potential downside of of one process programming.
- However, I claim that is a livable limit.
+ • 128 CPU threads at ~4GHz
+ • 4TB RAM
+ • 25 Gbit ethernet
+ • 10 Gbps NAS
+ • hours of yearly downtime
- I claim typical services do not hit this scaling limit.
+That is a huge potential downside of of one process programming. However, I
+claim that is a livable limit.
- If you are building a small business, most products can grow and become
- profitable well under this limit for years. When you see the limit
- approaching in the next year or two, you have a business with revenue
- to hire more than one engineer, and the new team can, in the face of
- radically changing business requirements, rewrite the service.
+I claim typical services do not hit this scaling limit.
- Reaching this limit is a good problem to have because when it comes you
- will have plenty of time to deal with it and the human resources you
- need to solve it well.
+If you are building a small business, most products can grow and become
+profitable well under this limit for years. When you see the limit approaching
+in the next year or two, you have a business with revenue to hire more than one
+engineer, and the new team can, in the face of radically changing business
+requirements, rewrite the service.
- Early in the life of a small business you donʼt, and every hour you
- spend trying to work beyond this scaling limit is an hour that would
- have been better spent talking to your customers about their needs.
+Reaching this limit is a good problem to have because when it comes you will
+have plenty of time to deal with it and the human resources you need to solve
+it well.
- The principle at work here is:
+Early in the life of a small business you don't, and every hour you spend
+trying to work beyond this scaling limit is an hour that would have been better
+spent talking to your customers about their needs.
- Donʼt use N computers when 1 will do.
+The principle at work here is:
- To go into a bit more technical detail,
+Don't use N computers when 1 will do.
- I run a single VM on AWS, in a single availability zone. The VM has
- three EBS volumes (this is Amazon name for NAS). The first holds the
- OS, logs, temporary files, and any ephemeral SQLite databases that are
- generated from the main databases, e.g. FTS tables. The second the
- primary SQLite database for the main service. The third holds the
- customer sync SQLite databases.
+To go into a bit more technical detail,
- The system is configured to periodically snapshot the system EBS volume
- and the customer EBS volumes to S3, the Amazon geo-redundant blob
- store. This is a relatively cheap operation that can be scripted,
- because only blocks that change are copied.
+I run a single VM on AWS, in a single availability zone. The VM has three EBS
+volumes (this is Amazon name for NAS). The first holds the OS, logs, temporary
+files, and any ephemeral SQLite databases that are generated from the main
+databases, e.g. FTS tables. The second the primary SQLite database for the main
+service. The third holds the customer sync SQLite databases.
- The main EBS volume is backed up to S3 very regularly, by custom code
- that flushes the WAL cache. Iʼll explain that in a bit.
+The system is configured to periodically snapshot the system EBS volume and the
+customer EBS volumes to S3, the Amazon geo-redundant blob store. This is a
+relatively cheap operation that can be scripted, because only blocks that
+change are copied.
- The service is a single Go binary running on this VM. The machine has
- plenty of extra RAM that is used by linuxʼs disk cache. (And that can
- be used by a second copy of the service spinning up for low down-time
- replacement.)
+The main EBS volume is backed up to S3 very regularly, by custom code that
+flushes the WAL cache. I'll explain that in a bit.
- The result of this is a service that has at most tens of hours of
- downtime a year, about as much change of suffering block loss as a
- physical computer with a RAID5 array, and active offsite backups being
- made every few minutes to a distributed system that is built and
- maintained by a large team.
+The service is a single Go binary running on this VM. The machine has plenty of
+extra RAM that is used by linux's disk cache. (And that can be used by a second
+copy of the service spinning up for low down-time replacement.)
- This system is astonishingly simple. I shell into one machine. It is a
- linux machine. I have a deploy script for the service that is ten lines
- long. Almost all of my performance work is done with pprof.
+The result of this is a service that has at most tens of hours of downtime a
+year, about as much change of suffering block loss as a physical computer with
+a RAID5 array, and active offsite backups being made every few minutes to a
+distributed system that is built and maintained by a large team.
- On a medium sized VM I can clock 5-6 thousand concurrent requests with
- only a few hours of performance tuning. On the largest machine AWS has,
- tens of thousands.
+This system is astonishingly simple. I shell into one machine. It is a linux
+machine. I have a deploy script for the service that is ten lines long. Almost
+all of my performance work is done with pprof.
- Now to talk a little more about the particulars of the stack:
+On a medium sized VM I can clock 5-6 thousand concurrent requests with only a
+few hours of performance tuning. On the largest machine AWS has, tens of
+thousands.
+
+Now to talk a little more about the particulars of the stack:
Shared cache and WAL
- To make the server extremely concurrent there are two important SQLite
- features I use. The first is the shared cache, which lets me allocate
- one large pool of memory to the database page cache and many concurrent
- connections can use it simultaneously. This requires some support in
- the driver for sqlite_unlock_notify so user code doesnʼt need to deal
- with locking events, but that is transparent to end user code.
+To make the server extremely concurrent there are two important SQLite features
+I use. The first is the shared cache, which lets me allocate one large pool of
+memory to the database page cache and many concurrent connections can use it
+simultaneously. This requires some support in the driver for
+sqlite_unlock_notify so user code doesn't need to deal with locking events, but
+that is transparent to end user code.
- The second is the Write Ahead Log. This is a mode SQLite can be knocked
- into at the beginning of connection which changes the way it writes
- transactions to disk. Instead of locking the database and making
- modifications along with a rollback journal, it appends the new change
- to a separate file. This allows readers to work concurrently with the
- writer. The WAL has to be flushed periodically by SQLite, which
- involves locking the database and writing the changes from it. There
- are default settings for doing this.
+The second is the Write Ahead Log. This is a mode SQLite can be knocked into at
+the beginning of connection which changes the way it writes transactions to
+disk. Instead of locking the database and making modifications along with a
+rollback journal, it appends the new change to a separate file. This allows
+readers to work concurrently with the writer. The WAL has to be flushed
+periodically by SQLite, which involves locking the database and writing the
+changes from it. There are default settings for doing this.
- I override these and execute WAL flushes manually from a package that,
- when it is done, also triggers an S3 snapshot. This package is called
- reallyfsync, and if I can work out how to test it properly I will make
- it open source.
+I override these and execute WAL flushes manually from a package that, when it
+is done, also triggers an S3 snapshot. This package is called reallyfsync, and
+if I can work out how to test it properly I will make it open source.
Incremental Blob API
- Another smaller, but important to my particular server feature, is
- SQLiteʼs [10]incremental blob API. This allows a field of bytes to be
- read and written in the DB without storing all the bytes in memory
- simultaneously, which matters when it is possible for each request to
- be working with hundreds of megabytes, but you want tens of thousands
- of potential concurrent requests.
+Another smaller, but important to my particular server feature, is SQLite's [9]
+incremental blob API. This allows a field of bytes to be read and written in
+the DB without storing all the bytes in memory simultaneously, which matters
+when it is possible for each request to be working with hundreds of megabytes,
+but you want tens of thousands of potential concurrent requests.
+
+This is one of the places where the driver deviates from being a close-to-cgo
+wrapper to be more [10]Go-like:
- This is one of the places where the driver deviates from being a
- close-to-cgo wrapper to be more [11]Go-like:
type Blob
func (blob *Blob) Close() error
func (blob *Blob) Read(p []byte) (n int, err error)
@@ -496,79 +472,75 @@ type Blob
func (blob *Blob) Write(p []byte) (n int, err error)
func (blob *Blob) WriteAt(p []byte, off int64) (n int, err error)
- This looks a lot like a file, and indeed can be used like a file, with
- one caveat: the size of a blob is set when it is created. (As such, I
- still find temporary files to be useful.)
+This looks a lot like a file, and indeed can be used like a file, with one
+caveat: the size of a blob is set when it is created. (As such, I still find
+temporary files to be useful.)
Designing with one process programming
- I start with: Do you really need N computers?
+I start with: Do you really need N computers?
- Some problems really do. For example, you cannot build a low-latency
- index of the public internet with only 4TB of RAM. You need a lot more.
- These problems are great fun, and we like to talk a lot about them, but
- they are a relatively small amount of all the code written. So far all
- the projects I have been developing post-Google fit on 1 computer.
+Some problems really do. For example, you cannot build a low-latency index of
+the public internet with only 4TB of RAM. You need a lot more. These problems
+are great fun, and we like to talk a lot about them, but they are a relatively
+small amount of all the code written. So far all the projects I have been
+developing post-Google fit on 1 computer.
- There are also more common sub-problems that are hard to solve with one
- computer. If you have a global customer base and need low-latency to
- your server, the speed of light gets in the way. But many of these
- problems can be solved with relatively straightforward CDN products.
+There are also more common sub-problems that are hard to solve with one
+computer. If you have a global customer base and need low-latency to your
+server, the speed of light gets in the way. But many of these problems can be
+solved with relatively straightforward CDN products.
- Another great solution to the speed of light is geo-sharding. Have
- complete and independent copies of your service in multiple
- datacenters, move your userʼs data to the service near them. This can
- be as easy as having one small global redirect database (maybe SQLite
- on geo-redundant NFS!) redirecting the user to a specific DNS name like
- {us-east, us-west}.mservice.com.
+Another great solution to the speed of light is geo-sharding. Have complete and
+independent copies of your service in multiple datacenters, move your user's
+data to the service near them. This can be as easy as having one small global
+redirect database (maybe SQLite on geo-redundant NFS!) redirecting the user to
+a specific DNS name like {us-east, us-west}.mservice.com.
- Most problems do fit in one computer, up to a point. Spend some time
- determining where that point is. If it is years away there is a good
- chance one computer will do.
+Most problems do fit in one computer, up to a point. Spend some time
+determining where that point is. If it is years away there is a good chance one
+computer will do.
Indie dev techniques for the corporate programmer
- Even if you do not write code in this particular technology stack and
- you are not an independent developer, there is value here. Use the one
- big VM, one zone, one process Go, SQLite, and snapshot backup stack as
- a hypothetical tool to test your designs.
+Even if you do not write code in this particular technology stack and you are
+not an independent developer, there is value here. Use the one big VM, one
+zone, one process Go, SQLite, and snapshot backup stack as a hypothetical tool
+to test your designs.
- So add a hypothetical step to your design process: If you solved your
- problem on this stack with one computers, how far could you get? How
- many customers could you support? At what size would you need to
- rewrite your software?
+So add a hypothetical step to your design process: If you solved your problem
+on this stack with one computers, how far could you get? How many customers
+could you support? At what size would you need to rewrite your software?
- If this indie mini stack would last your business years, you might want
- to consider delaying the adoption of modern cloud software.
+If this indie mini stack would last your business years, you might want to
+consider delaying the adoption of modern cloud software.
- If you are a programmer at a well-capitalized company, you may also
- want to consider what development looks like for small internal or
- experimental projects. Do your coworkers have to use large complex
- distributed systems for policy reasons? Many of these projects will
- never need to scale beyond one computer, or if they do they will need a
- rewrite to deal with shifting requirements. In which case, find a way
- to make an indie stack, linux VMs with a file system, available for
- prototyping and experimentation.
- __________________________________________________________________
+If you are a programmer at a well-capitalized company, you may also want to
+consider what development looks like for small internal or experimental
+projects. Do your coworkers have to use large complex distributed systems for
+policy reasons? Many of these projects will never need to scale beyond one
+computer, or if they do they will need a rewrite to deal with shifting
+requirements. In which case, find a way to make an indie stack, linux VMs with
+a file system, available for prototyping and experimentation.
- [12]Index
- [13]github.com/crawshaw
- [14]twitter.com/davidcrawshaw
- david@zentus.com
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[11]Index
+[12]github.com/crawshaw
+[13]twitter.com/davidcrawshaw
+david@zentus.com
-References
+References:
- 1. https://crawshaw.io/atom.xml
- 2. https://gonorthwest.io/
- 3. https://www.kaggle.com/kingburrito666/shakespeare-plays
- 4. https://golang.org/pkg/database/sql
- 5. https://github.com/mattn/go-sqlite3
- 6. https://crawshaw.io/sqlite
- 7. https://www.sqlite.org/sessionintro.html
- 8. https://www.sqlite.org/sharedcache.html
- 9. https://www.posticulous.com/
- 10. https://www.sqlite.org/c3ref/blob_open.html
- 11. https://godoc.org/crawshaw.io/sqlite#Blob
- 12. https://crawshaw.io/
- 13. https://github.com/crawshaw
- 14. https://twitter.com/davidcrawshaw
+[1] https://gonorthwest.io/
+[2] https://www.kaggle.com/kingburrito666/shakespeare-plays
+[3] https://golang.org/pkg/database/sql
+[4] https://github.com/mattn/go-sqlite3
+[5] https://crawshaw.io/sqlite
+[6] https://www.sqlite.org/sessionintro.html
+[7] https://www.sqlite.org/sharedcache.html
+[8] https://www.posticulous.com/
+[9] https://www.sqlite.org/c3ref/blob_open.html
+[10] https://godoc.org/crawshaw.io/sqlite#Blob
+[11] https://crawshaw.io/
+[12] https://github.com/crawshaw
+[13] https://twitter.com/davidcrawshaw
diff --git a/static/archive/deadspin-com-cjpmjw.txt b/static/archive/deadspin-com-cjpmjw.txt
index 1104d08..c380dc0 100644
--- a/static/archive/deadspin-com-cjpmjw.txt
+++ b/static/archive/deadspin-com-cjpmjw.txt
@@ -1,312 +1,301 @@
- #[1]alternate [2]alternate [3]Deadspin - All stories
+[p]
- [p?c1=2&c2=6770184&cv=4.4.0&cj=1]
+ • [1]The A.V. Club
+ • [2]Deadspin
+ • [3]Gizmodo
+ • [4]Jalopnik
+ • [5]Kotaku
+ • [6]Quartz
+ • [7]The Root
+ • [8]The Takeout
+ •
+ • [9]The Onion
+ •
+ • [10]The Inventory
- * [4]The A.V. Club
- * [5]Deadspin
- * [6]Gizmodo
- * [7]Jalopnik
- * [8]Kotaku
- * [9]Quartz
- * [10]The Root
- * [11]The Takeout
- *
- * [12]The Onion
- *
- * [13]The Inventory
+[11]
+[12]
- * [14]Home
- * [15]Latest
- * [16]Baseball
- * [17]Football
- * [18]Basketball
- * [19]Hockey
- * [20]Golf
- * [21]Soccer
- * [22]The Mourning After
- * [23]Wrestling
- * [24]Lists
- * [25]Tennis
- * [26]The Fights
- * [27]Olympics
- * [28]Racing
- * [29]Poker
- * [30]Media
- * [31]Locker
- * [32]Español
+ • [13]Home
+ • [14]Latest
+ • [15]Baseball
+ • [16]Football
+ • [17]Basketball
+ • [18]Hockey
+ • [19]Golf
+ • [20]Soccer
+ • [21]The Mourning After
+ • [22]Wrestling
+ • [23]Lists
+ • [24]Tennis
+ • [25]The Fights
+ • [26]Olympics
+ • [27]Racing
+ • [28]Poker
+ • [29]Media
+ • [30]Locker
+ • [31]Español
- We may earn a commission from links on this page
+[32][33]
+We may earn a commission from links on this page
- * [33]Home
- * [34]Latest
- * [35]Baseball
- * [36]Football
- * [37]Basketball
- * [38]Hockey
- * [39]Golf
- * [40]Soccer
- * [41]The Mourning After
- * [42]Wrestling
- * [43]Lists
- * [44]Tennis
- * [45]The Fights
- * [46]Olympics
- * [47]Racing
- * [48]Poker
- * [49]Media
- * [50]Locker
- * [51]Español
+ • [34]Home
+ • [35]Latest
+ • [36]Baseball
+ • [37]Football
+ • [38]Basketball
+ • [39]Hockey
+ • [40]Golf
+ • [41]Soccer
+ • [42]The Mourning After
+ • [43]Wrestling
+ • [44]Lists
+ • [45]Tennis
+ • [46]The Fights
+ • [47]Olympics
+ • [48]Racing
+ • [49]Poker
+ • [50]Media
+ • [51]Locker
+ • [52]Español
- Locker
+[53]
+Locker
Spend Exactly None Of Your Time Killing Time
- By
- [52]Chris Thompson
- PublishedJanuary 25, 2019
- We may earn a commission from links on this page.
- Image for article titled Spend Exactly None Of Your Time Killing Time
- Illustration: Chelsea Beck (GMG)
+By
+[54]Chris Thompson
+PublishedJanuary 25, 2019
+We may earn a commission from links on this page.
+[55][56][57][58][59]
+Image for article titled Spend Exactly None Of Your Time Killing Time
+Illustration: Chelsea Beck (GMG)
- Here’s a good resolution, if you’re the sort of person who resolves to
- do good and healthy things and then maintains any hope of actually
- doing them: Resolve to divide your waking hours exactly and only
- between doing things you should be doing, and doing things you want to
- be doing.
- Watch
- What Jason Kelce’s retirement says about the Eagles future
- (BUTTON) CC
- Share
- Subtitles
- * Off
- * English
+Here’s a good resolution, if you’re the sort of person who resolves to do good
+and healthy things and then maintains any hope of actually doing them: Resolve
+to divide your waking hours exactly and only between doing things you should be
+doing, and doing things you want to be doing.
- Share this Video
- [53]Facebook[54]Twitter[55]Email
- [56]Reddit[57]Link
- [58]view video
- [59]What Jason Kelce’s retirement says about the Eagles future
- Which NFL team lands Jim Harbaugh as their next head coach?
- January 10, 2024
- Josh Allen, Trevor Lawrence, or the Eagles: Who are the biggest frauds
- of the season?
- January 8, 2024
+Watch
+What Jason Kelce’s retirement says about the Eagles future
+CC
+Share
+Subtitles
- When you are not doing something you should be doing—straightening up
- around the house, taking out the garbage, walking the dog, your job—you
- should always and only be doing something you actively want to be
- doing, like reading a book, or playing video games, or pursuing a
- hobby. Conversely, when you are not doing something you want to be
- doing, you should always and only be doing something you should be
- doing. This is a good resolution because it’s not aimed at some
- specific result that deviates a whole lot from who you are already,
- like overhauling your diet or your sleep regimen or whatever. No
- overhaul required, here. You already do plenty of what you’re supposed
- to do, and plenty of what you want to do. Resolve to stop doing
- anything else.
- Advertisement
+ • Off
+ • English
- But I already do this, you are saying, as you sit at your desk, not
- working, procrastinating, avoiding work by dicking around on the
- internet and winding up on a dumb-ass late-January blog about, of all
- things, self-improvement. No! Right now, you are not following this
- very good advice. You are not doing what you should be doing—unless
- what you should be doing is reading blogs—nor are you doing what you
- really want to be doing, which is parasailing or skiing or hunting
- moose in [60]ye olde cowboy game. You are killing time, waiting for
- either the energy for work or the consequences of not doing work to
- give your life some feeble structure. Stop it! Killing time is the very
- habit we are trying to address, here. There’s barely enough time as it
- is.
- Advertisement
+Share this Video
+[61]Facebook[62]Twitter[63]Email
+[64]Reddit[65]Link
+[66]view video
+[67]What Jason Kelce’s retirement says about the Eagles future
+[68]
+Which NFL team lands Jim Harbaugh as their next head coach?
+January 10, 2024
+[69]
+Josh Allen, Trevor Lawrence, or the Eagles: Who are the biggest frauds of the
+season?
+January 8, 2024
- Along the way you will need to hone your sense of what things you
- should be doing. You know the most obvious ones—they’re occupying the
- margins of your consciousness all the time, bearing down on you and
- poisoning the time you spend not doing them. Chores, assignments,
- projects, bills, phone calls, repairs, and so forth. The list is a
- little bit longer than that, which is both good news and bad news. It’s
- bad news because it includes things like talking to your folks on the
- telephone, or listening patiently while your spouse rants about their
- day, or brushing your teeth—things you put off doing nearly as much as
- work but which, I’m afraid, must be done. But it’s also good news,
- because by acknowledging that those are responsibilities, you have also
- earned the right to take some satisfaction from having fulfilled them.
- Advertisement
+When you are not doing something you should be doing—straightening up around
+the house, taking out the garbage, walking the dog, your job—you should always
+and only be doing something you actively want to be doing, like reading a book,
+or playing video games, or pursuing a hobby. Conversely, when you are not doing
+something you want to be doing, you should always and only be doing something
+you should be doing. This is a good resolution because it’s not aimed at some
+specific result that deviates a whole lot from who you are already, like
+overhauling your diet or your sleep regimen or whatever. No overhaul required,
+here. You already do plenty of what you’re supposed to do, and plenty of what
+you want to do. Resolve to stop doing anything else.
- Sometimes you have the bandwidth and energy to address your attention
- to the things you should be doing, and other times the thought of
- getting your car inspected or working out or washing a sinkful of
- dishes fills you with a sudden urge to throw yourself down a well. When
- you have the energy to do the things you should do, do them, or keep
- doing them. When you don’t—and this is crucial—go ahead and give
- yourself permission to set them aside for another time. But—and this is
- also crucial, because it is the lesson of this damn blog—when you give
- yourself permission not to do the things you should be doing, please
- spend the resulting block of free time doing something good and cool,
- something you genuinely want to do.
+Advertisement
- You will also need to hone your sense of what it is you want to be
- doing. Today, the thing I most want to be doing in all the universe is
- riding Splash Mountain. That activity, I am afraid to say, is
- completely out of the question, in no small part because I am supposed
- to be doing the thing I least want to do in all the universe, which is
- working. Since I would certainly rather die than actually work, I’m
- going to do something else. But what? It helps to start all the way out
- at riding Splash Mountain, because understanding want in terms of
- genuine desire keeps you from slipping into the shitty headspace of
- just measuring activities against the dread and misery of work. In
- almost all cases I would rather be watching Law & Order reruns than
- doing chores, but that doesn’t mean I really want to be watching Law &
- Order reruns. In the endless list of things I could conceivably do with
- a day, watching Law & Order reruns is probably closer to doing chores
- than it is to riding Splash Mountain. In fact, I often default to
- watching Law & Order reruns because some part of my brain recognizes
- that it keeps me anchored in place near the chores, and isn’t so joyful
- that I can be said to be really enjoying myself, which is clearly
- something I don’t deserve.
- Advertisement
+But I already do this, you are saying, as you sit at your desk, not working,
+procrastinating, avoiding work by dicking around on the internet and winding up
+on a dumb-ass late-January blog about, of all things, self-improvement. No!
+Right now, you are not following this very good advice. You are not doing what
+you should be doing—unless what you should be doing is reading blogs—nor are
+you doing what you really want to be doing, which is parasailing or skiing or
+hunting moose in [70]ye olde cowboy game. You are killing time, waiting for
+either the energy for work or the consequences of not doing work to give your
+life some feeble structure. Stop it! Killing time is the very habit we are
+trying to address, here. There’s barely enough time as it is.
- So it is with scanning headlines or surfing Instagram or refreshing
- Twitter, the grey shit you do compulsively when you are
- procrastinating. Yes, you would rather be doing those things than
- painting your living room—anything, including bleeding from the
- eyeballs, is better than painting—but that doesn’t necessarily mean
- they’re worth a shit. If you’re not going to paint the living room,
- that’s fine! But now use the time on something good! In my case, if I
- start all the way out at riding Splash Mountain and work backward from
- there, long before I get to watching Law & Order reruns, I will arrive
- at things like bowling or going to the movies or hunting moose in ye
- olde cowboy game. Those are things I find myself wanting to do, but
- rarely give myself permission to do. Ask yourself, “What are some
- activities that would be genuinely fun?” Make a list! Cross off the
- stuff you know you can’t do, and then pick and do one of the ones you
- can. Go to the zoo. Watch a horror flick. Try out a new bar. Read a few
- chapters of a good book.
+Advertisement
- It can feel reckless and irresponsible to spend your day bowling or
- baking or hunting moose in ye olde cowboy game, but a big chunk of the
- guilt associated with these activities stems from not really giving
- yourself permission to do them, at least in part because too much of
- your average day is already given over to tweeting at Jonathan Chait.
- But it’s healthy and productive to do cool and fun things that enrich
- your life! The solution, here, is to buy yourself the time to do the
- really interesting things by first being honest with yourself about all
- the sweaty hours you waste tweeting at Jonathan Chait. You are a
- successful and prolific time-killer because you’ve got a selection of
- ways of doing it that are marginally less dreary and more stimulating
- than folding laundry or managing spreadsheets, and some inherited
- puritanical impulse that tells you you’re still close to upright so
- long as you’re not actually enjoying yourself. Bullshit! When you are
- not doing what you are supposed to do, do something you genuinely want
- to do. That’s the rule.
- Advertisement
+Along the way you will need to hone your sense of what things you should be
+doing. You know the most obvious ones—they’re occupying the margins of your
+consciousness all the time, bearing down on you and poisoning the time you
+spend not doing them. Chores, assignments, projects, bills, phone calls,
+repairs, and so forth. The list is a little bit longer than that, which is both
+good news and bad news. It’s bad news because it includes things like talking
+to your folks on the telephone, or listening patiently while your spouse rants
+about their day, or brushing your teeth—things you put off doing nearly as much
+as work but which, I’m afraid, must be done. But it’s also good news, because
+by acknowledging that those are responsibilities, you have also earned the
+right to take some satisfaction from having fulfilled them.
- Of course, there will be any number of times when you are prevented
- from doing any of the things you want to be doing. The rule is also
- this: When you cannot do what you genuinely want to do, do what you are
- supposed to do. Here is a good life hack: when you lack the bandwidth
- to take on an important chore or duty, you probably still have the
- bandwidth to make a list of all your important chores and duties. Do
- that! This counts as a thing you should be doing, because often enough
- in making the list you will hit on something that requires little
- enough of you that you can take it on right away, without too much
- suffering. And even if you don’t, the making of the list will bring you
- a little closer to addressing yourself to the items on it, and that’s
- enough of a positive step that when the time comes for you to do
- something you want to do, you will feel the satisfaction of having
- earned it, through work. That’s what’s missing from the shame-soaked
- hours spent avoiding and procrastinating: the feeling that you deserve
- to have a good time, and the permission to have one.
+Advertisement
- Of course, you will probably fall short of dividing your time exactly
- equally between responsibilities and pursuits. Don’t think of that as
- failure. When you remember this wise practice, when it occurs to you,
- treat it as a rule and follow it. Ah, right, I said I wasn’t gonna sit
- here stewing in my anxiety all afternoon, so instead I’m going to go
- see [61]Into the Spider-Verse. Good plan! You are going to end the day
- with something to show for it, and that’s the whole idea.
- (BUTTON)
- Continue reading
+Sometimes you have the bandwidth and energy to address your attention to the
+things you should be doing, and other times the thought of getting your car
+inspected or working out or washing a sinkful of dishes fills you with a sudden
+urge to throw yourself down a well. When you have the energy to do the things
+you should do, do them, or keep doing them. When you don’t—and this is
+crucial—go ahead and give yourself permission to set them aside for another
+time. But—and this is also crucial, because it is the lesson of this damn
+blog—when you give yourself permission not to do the things you should be
+doing, please spend the resulting block of free time doing something good and
+cool, something you genuinely want to do.
- IFRAME: [62]https://www.googletagmanager.com/ns.html?id=GTM-T73GPNQ
+You will also need to hone your sense of what it is you want to be doing.
+Today, the thing I most want to be doing in all the universe is riding Splash
+Mountain. That activity, I am afraid to say, is completely out of the question,
+in no small part because I am supposed to be doing the thing I least want to do
+in all the universe, which is working. Since I would certainly rather die than
+actually work, I’m going to do something else. But what? It helps to start all
+the way out at riding Splash Mountain, because understanding want in terms of
+genuine desire keeps you from slipping into the shitty headspace of just
+measuring activities against the dread and misery of work. In almost all cases
+I would rather be watching Law & Order reruns than doing chores, but that
+doesn’t mean I really want to be watching Law & Order reruns. In the endless
+list of things I could conceivably do with a day, watching Law & Order reruns
+is probably closer to doing chores than it is to riding Splash Mountain. In
+fact, I often default to watching Law & Order reruns because some part of my
+brain recognizes that it keeps me anchored in place near the chores, and isn’t
+so joyful that I can be said to be really enjoying myself, which is clearly
+something I don’t deserve.
-References
+Advertisement
- Visible links:
- 1. https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
- 2. https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
- 3. https://deadspin.com/rss
- 4. https://avclub.com/
- 5. https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
- 6. https://gizmodo.com/
- 7. https://jalopnik.com/
- 8. https://kotaku.com/
- 9. https://qz.com/
- 10. https://theroot.com/
- 11. https://thetakeout.com/
- 12. https://theonion.com/
- 13. https://theinventory.com/
- 14. https://deadspin.com/
- 15. https://deadspin.com/latest
- 16. https://deadspin.com/baseball
- 17. https://deadspin.com/football
- 18. https://deadspin.com/basketball
- 19. https://deadspin.com/hockey
- 20. https://deadspin.com/golf
- 21. https://deadspin.com/soccer
- 22. https://deadspin.com/locker/the-mourning-after
- 23. https://deadspin.com/wrestling
- 24. https://deadspin.com/lists
- 25. https://deadspin.com/tennis
- 26. https://deadspin.com/the-fights
- 27. https://deadspin.com/olympics
- 28. https://deadspin.com/racing
- 29. https://deadspin.com/poker
- 30. https://deadspin.com/media
- 31. https://deadspin.com/locker
- 32. https://es.deadspin.com/
- 33. https://deadspin.com/
- 34. https://deadspin.com/latest
- 35. https://deadspin.com/baseball
- 36. https://deadspin.com/football
- 37. https://deadspin.com/basketball
- 38. https://deadspin.com/hockey
- 39. https://deadspin.com/golf
- 40. https://deadspin.com/soccer
- 41. https://deadspin.com/locker/the-mourning-after
- 42. https://deadspin.com/wrestling
- 43. https://deadspin.com/lists
- 44. https://deadspin.com/tennis
- 45. https://deadspin.com/the-fights
- 46. https://deadspin.com/olympics
- 47. https://deadspin.com/racing
- 48. https://deadspin.com/poker
- 49. https://deadspin.com/media
- 50. https://deadspin.com/locker
- 51. https://es.deadspin.com/
- 52. https://deadspin.com/author/miserableshitehawk
- 53. https://facebook.com/sharer.php?u=https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895?utm_medium=sharefromsite&utm_source=facebook
- 54. https://twitter.com/intent/tweet?url=https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895?utm_medium=sharefromsite&utm_source=twitter&text=What Jason Kelce’s retirement says about the Eagles future
- 55. mailto:?subject=What Jason Kelce’s retirement says about the Eagles future&body=https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895?utm_medium=sharefromsite&utm_source=email
- 56. https://www.reddit.com/submit?url=https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895?utm_medium=sharefromsite&utm_source=reddit&title=What Jason Kelce’s retirement says about the Eagles future
- 57. https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895
- 58. https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895
- 59. https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895
- 60. https://theconcourse.deadspin.com/i-like-chopping-firewood-in-red-dead-redemption-2-1830178593#_ga=2.215259543.149258240.1547482638-1486199056.1525795056
- 61. https://film.avclub.com/superhero-dimensions-collide-in-a-funny-gorgeously-psy-1830700647
- 62. https://www.googletagmanager.com/ns.html?id=GTM-T73GPNQ
+So it is with scanning headlines or surfing Instagram or refreshing Twitter,
+the grey shit you do compulsively when you are procrastinating. Yes, you would
+rather be doing those things than painting your living room—anything, including
+bleeding from the eyeballs, is better than painting—but that doesn’t
+necessarily mean they’re worth a shit. If you’re not going to paint the living
+room, that’s fine! But now use the time on something good! In my case, if I
+start all the way out at riding Splash Mountain and work backward from there,
+long before I get to watching Law & Order reruns, I will arrive at things like
+bowling or going to the movies or hunting moose in ye olde cowboy game. Those
+are things I find myself wanting to do, but rarely give myself permission to
+do. Ask yourself, “What are some activities that would be genuinely fun?” Make
+a list! Cross off the stuff you know you can’t do, and then pick and do one of
+the ones you can. Go to the zoo. Watch a horror flick. Try out a new bar. Read
+a few chapters of a good book.
- Hidden links:
- 64. https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
- 65. https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
- 66. https://deadspin.com/search
- 67. https://deadspin.com/newsletter
- 68. https://deadspin.com/locker
- 69. https://twitter.com/intent/tweet?via=deadspin&url=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_twitter&text=Spend%20Exactly%20None%20Of%20Your%20Time%20Killing%20Time
- 70. https://facebook.com/sharer.php?u=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_facebook
- 71. https://www.reddit.com/submit?url=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_reddit&title=Spend%20Exactly%20None%20Of%20Your%20Time%20Killing%20Time
- 72. mailto:?subject=Spend%20Exactly%20None%20Of%20Your%20Time%20Killing%20Time&body=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_email
- 73. https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
- 74. https://deadspin.com/which-nfl-team-lands-jim-harbaugh-as-their-next-head-co-1851156349
- 75. https://deadspin.com/josh-allen-trevor-lawrence-or-the-eagles-who-are-the-1851149579
+It can feel reckless and irresponsible to spend your day bowling or baking or
+hunting moose in ye olde cowboy game, but a big chunk of the guilt associated
+with these activities stems from not really giving yourself permission to do
+them, at least in part because too much of your average day is already given
+over to tweeting at Jonathan Chait. But it’s healthy and productive to do cool
+and fun things that enrich your life! The solution, here, is to buy yourself
+the time to do the really interesting things by first being honest with
+yourself about all the sweaty hours you waste tweeting at Jonathan Chait. You
+are a successful and prolific time-killer because you’ve got a selection of
+ways of doing it that are marginally less dreary and more stimulating than
+folding laundry or managing spreadsheets, and some inherited puritanical
+impulse that tells you you’re still close to upright so long as you’re not
+actually enjoying yourself. Bullshit! When you are not doing what you are
+supposed to do, do something you genuinely want to do. That’s the rule.
+
+Advertisement
+
+Of course, there will be any number of times when you are prevented from doing
+any of the things you want to be doing. The rule is also this: When you cannot
+do what you genuinely want to do, do what you are supposed to do. Here is a
+good life hack: when you lack the bandwidth to take on an important chore or
+duty, you probably still have the bandwidth to make a list of all your
+important chores and duties. Do that! This counts as a thing you should be
+doing, because often enough in making the list you will hit on something that
+requires little enough of you that you can take it on right away, without too
+much suffering. And even if you don’t, the making of the list will bring you a
+little closer to addressing yourself to the items on it, and that’s enough of a
+positive step that when the time comes for you to do something you want to do,
+you will feel the satisfaction of having earned it, through work. That’s what’s
+missing from the shame-soaked hours spent avoiding and procrastinating: the
+feeling that you deserve to have a good time, and the permission to have one.
+
+Of course, you will probably fall short of dividing your time exactly equally
+between responsibilities and pursuits. Don’t think of that as failure. When you
+remember this wise practice, when it occurs to you, treat it as a rule and
+follow it. Ah, right, I said I wasn’t gonna sit here stewing in my anxiety all
+afternoon, so instead I’m going to go see [71]Into the Spider-Verse. Good plan!
+You are going to end the day with something to show for it, and that’s the
+whole idea.
+
+Continue reading
+
+References:
+
+[1] https://avclub.com/
+[2] https://deadspin.com/
+[3] https://gizmodo.com/
+[4] https://jalopnik.com/
+[5] https://kotaku.com/
+[6] https://qz.com/
+[7] https://theroot.com/
+[8] https://thetakeout.com/
+[9] https://theonion.com/
+[10] https://theinventory.com/
+[11] https://deadspin.com/
+[12] https://deadspin.com/
+[13] https://deadspin.com/
+[14] https://deadspin.com/latest
+[15] https://deadspin.com/baseball
+[16] https://deadspin.com/football
+[17] https://deadspin.com/basketball
+[18] https://deadspin.com/hockey
+[19] https://deadspin.com/golf
+[20] https://deadspin.com/soccer
+[21] https://deadspin.com/locker/the-mourning-after
+[22] https://deadspin.com/wrestling
+[23] https://deadspin.com/lists
+[24] https://deadspin.com/tennis
+[25] https://deadspin.com/the-fights
+[26] https://deadspin.com/olympics
+[27] https://deadspin.com/racing
+[28] https://deadspin.com/poker
+[29] https://deadspin.com/media
+[30] https://deadspin.com/locker
+[31] https://es.deadspin.com/
+[32] https://deadspin.com/search
+[33] https://deadspin.com/newsletter
+[34] https://deadspin.com/
+[35] https://deadspin.com/latest
+[36] https://deadspin.com/baseball
+[37] https://deadspin.com/football
+[38] https://deadspin.com/basketball
+[39] https://deadspin.com/hockey
+[40] https://deadspin.com/golf
+[41] https://deadspin.com/soccer
+[42] https://deadspin.com/locker/the-mourning-after
+[43] https://deadspin.com/wrestling
+[44] https://deadspin.com/lists
+[45] https://deadspin.com/tennis
+[46] https://deadspin.com/the-fights
+[47] https://deadspin.com/olympics
+[48] https://deadspin.com/racing
+[49] https://deadspin.com/poker
+[50] https://deadspin.com/media
+[51] https://deadspin.com/locker
+[52] https://es.deadspin.com/
+[53] https://deadspin.com/locker
+[54] https://deadspin.com/author/miserableshitehawk
+[55] https://twitter.com/intent/tweet?via=deadspin&url=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_twitter&text=Spend%20Exactly%20None%20Of%20Your%20Time%20Killing%20Time
+[56] https://facebook.com/sharer.php?u=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_facebook
+[57] https://www.reddit.com/submit?url=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_reddit&title=Spend%20Exactly%20None%20Of%20Your%20Time%20Killing%20Time
+[58] mailto:?subject=Spend%20Exactly%20None%20Of%20Your%20Time%20Killing%20Time&body=https%3A%2F%2Fdeadspin.com%2Fspend-exactly-none-of-your-time-killing-time-1831777904%3Futm_medium%3Dsharefromsite%26utm_source%3Ddeadspin_email
+[59] https://deadspin.com/spend-exactly-none-of-your-time-killing-time-1831777904
+[61] https://facebook.com/sharer.php?u=https%3A%2F%2Fdeadspin.com%2Fwhat-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895%3Futm_medium%3Dsharefromsite%26utm_source%3Dfacebook
+[62] https://twitter.com/intent/tweet?url=https%3A%2F%2Fdeadspin.com%2Fwhat-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895%3Futm_medium%3Dsharefromsite%26utm_source%3Dtwitter&text=What%20Jason%20Kelce%E2%80%99s%20retirement%20says%20about%20the%20Eagles%20future
+[63] mailto:?subject=What%20Jason%20Kelce%E2%80%99s%20retirement%20says%20about%20the%20Eagles%20future&body=https%3A%2F%2Fdeadspin.com%2Fwhat-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895%3Futm_medium%3Dsharefromsite%26utm_source%3Demail
+[64] https://www.reddit.com/submit?url=https%3A%2F%2Fdeadspin.com%2Fwhat-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895%3Futm_medium%3Dsharefromsite%26utm_source%3Dreddit&title=What%20Jason%20Kelce%E2%80%99s%20retirement%20says%20about%20the%20Eagles%20future
+[65] https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895
+[66] https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895
+[67] https://deadspin.com/what-jason-kelce-s-retirement-says-about-the-eagles-fut-1851169895
+[68] https://deadspin.com/which-nfl-team-lands-jim-harbaugh-as-their-next-head-co-1851156349
+[69] https://deadspin.com/josh-allen-trevor-lawrence-or-the-eagles-who-are-the-1851149579
+[70] https://theconcourse.deadspin.com/i-like-chopping-firewood-in-red-dead-redemption-2-1830178593#_ga=2.215259543.149258240.1547482638-1486199056.1525795056
+[71] https://film.avclub.com/superhero-dimensions-collide-in-a-funny-gorgeously-psy-1830700647
diff --git a/static/archive/dev-to-ptnb0b.txt b/static/archive/dev-to-ptnb0b.txt
index 7aed9d8..6db84ba 100644
--- a/static/archive/dev-to-ptnb0b.txt
+++ b/static/archive/dev-to-ptnb0b.txt
@@ -1,2595 +1,2447 @@
- #[1]DEV Community
-
- [2]Skip to content
-
- (BUTTON) [3]DEV Community
- ____________________ (BUTTON)
- [4]Log in [5]Create account
+[1]Skip to content
+[3] DEV Community
+[4][ ]
+[6]
+[7] Log in [8] Create account
DEV Community
- (BUTTON)
+● Add reaction
+[sp] Like [mu] Unicorn [ex] Exploding Head [ra] Raised Hands [fi] Fire
+Jump to Comments Save
+Copy link
+Copied to Clipboard
+[20] Share to Twitter [21] Share to LinkedIn [22] Share to Reddit [23] Share to
+Hacker News [24] Share to Facebook [25] Share to Mastodon
+[26]Share Post via... [27]Report Abuse
+[28]Rich Harris
+[29]Rich Harris
- (BUTTON)
- [heart-plus-active-9ea3b22f2bc311281db911d416166c5f430636e76b15cd5df6b3
- b841d830eefa.svg] Add reaction
- (BUTTON)
- [sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382
- d02920cf.svg] Like (BUTTON)
- [multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f
- 1f4f3e97.svg] Unicorn (BUTTON)
- [exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068
- ad3e2c4b5.svg] Exploding Head (BUTTON)
- [raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b49997
- 3048fe5.svg] Raised Hands (BUTTON)
- [fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.
- svg] Fire
- (BUTTON) Jump to Comments (BUTTON) Save
- (BUTTON)
- (BUTTON) Copy link
- Copied to Clipboard
- [6]Share to Twitter [7]Share to LinkedIn [8]Share to Reddit [9]Share to
- Hacker News [10]Share to Facebook [11]Share to Mastodon
- [12]Share Post via... [13]Report Abuse
+Posted on May 15, 2020
- [14]Rich Harris
- [15]Rich Harris
-
- Posted on May 15, 2020
- [sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382
- d02920cf.svg]
- [multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f
- 1f4f3e97.svg]
- [exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068
- ad3e2c4b5.svg]
- [raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b49997
- 3048fe5.svg]
- [fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.
- svg]
+● ● ● ● ●
In defense of the modern web
- [16]#javascript [17]#react [18]#svelte [19]#webdev
+[30]#javascript [31]#react [32]#svelte [33]#webdev
- I expect I'll annoy everyone with this post: the anti-JavaScript
- crusaders, justly aghast at how much of the stuff we slather onto
- modern websites; the people arguing the web is a broken platform for
- interactive applications anyway and we should start over; React users;
- the old guard with their artisanal JS and hand authored HTML; and
- [20]Tom MacWright, someone I've admired from afar since I first became
- aware of his work on Mapbox many years ago. But I guess that's the
- price of having opinions.
+I expect I'll annoy everyone with this post: the anti-JavaScript crusaders,
+justly aghast at how much of the stuff we slather onto modern websites; the
+people arguing the web is a broken platform for interactive applications anyway
+and we should start over; React users; the old guard with their artisanal JS
+and hand authored HTML; and [34]Tom MacWright, someone I've admired from afar
+since I first became aware of his work on Mapbox many years ago. But I guess
+that's the price of having opinions.
- Tom recently posted [21]Second-guessing the modern web, and it took the
- front end world by storm. You should read it, or at the very least the
- [22]CliffsNotes. There's a lot of stuff I agree with to varying
- degrees:
+Tom recently posted [35]Second-guessing the modern web, and it took the front
+end world by storm. You should read it, or at the very least the [36]
+CliffsNotes. There's a lot of stuff I agree with to varying degrees:
- There is a sweet spot of React: in moderately interactive interfaces
- ... But there’s a lot on either side of that sweet spot.
+ There is a sweet spot of React: in moderately interactive interfaces ...
+ But there’s a lot on either side of that sweet spot.
- It's absolutely the case that running React in the client for a largely
- static site is overkill. It's also true that you have to avoid React if
- your app is very heavily interactive — it's widely understood that if
- you want 60fps animation, you will likely have to bypass the React
- update cycle and do things in a more imperative fashion (indeed, this
- is what libraries like [23]react-spring do). But while all this is true
- of React, it's much less true of component frameworks in general.
+It's absolutely the case that running React in the client for a largely static
+site is overkill. It's also true that you have to avoid React if your app is
+very heavily interactive — it's widely understood that if you want 60fps
+animation, you will likely have to bypass the React update cycle and do things
+in a more imperative fashion (indeed, this is what libraries like [37]
+react-spring do). But while all this is true of React, it's much less true of
+component frameworks in general.
- User sessions are surprisingly long: someone might have your website
- open in a tab for weeks at a time. I’ve seen it happen. So if they
- open the ‘about page’, keep the tab open for a week, and then
- request the ‘home page’, then the home page that they request is
- dictated by the index bundle that they downloaded last week. This is
- a deeply weird and under-discussed situation.
+ User sessions are surprisingly long: someone might have your website open
+ in a tab for weeks at a time. I’ve seen it happen. So if they open the
+ ‘about page’, keep the tab open for a week, and then request the ‘home
+ page’, then the home page that they request is dictated by the index bundle
+ that they downloaded last week. This is a deeply weird and under-discussed
+ situation.
- It's an excellent point that isn't really being addressed, though (as
- Tom acknowledges) it's really just exacerbating a problem that was
- always there. I think there are solutions to it — we can iterate on the
- 'index bundle' approach, we could include the site version in a cookie
- and use that to show actionable feedback if there's a mismatch — but we
- do need to spend time on it.
+It's an excellent point that isn't really being addressed, though (as Tom
+acknowledges) it's really just exacerbating a problem that was always there. I
+think there are solutions to it — we can iterate on the 'index bundle'
+approach, we could include the site version in a cookie and use that to show
+actionable feedback if there's a mismatch — but we do need to spend time on it.
- It’s your startup’s homepage, and it has a “Sign up” button, but
- until the JavaScript loads, that button doesn’t do anything. So you
- need to compensate.
+ It’s your startup’s homepage, and it has a “Sign up” button, but until the
+ JavaScript loads, that button doesn’t do anything. So you need to
+ compensate.
+
+This is indeed very annoying, though it's easy enough to do this sort of thing
+— we just need to care enough:
- This is indeed very annoying, though it's easy enough to do this sort
- of thing — we just need to care enough:
{is_browser ? 'Sign up' : 'Loading'}
- But I'm not sure what this has to do with React-style frameworks — this
- issue exists whatever form your front end takes, unless you make it
- work without JS (which you should!).
+But I'm not sure what this has to do with React-style frameworks — this issue
+exists whatever form your front end takes, unless you make it work without JS
+(which you should!).
- Your formerly-lightweight application server is now doing quite a
- bit of labor, running React & making API requests in order to do
- this pre-rendering.
+ Your formerly-lightweight application server is now doing quite a bit of
+ labor, running React & making API requests in order to do this
+ pre-rendering.
- Again, this is true but more React-specific than anything. React's
- approach to server-side rendering — constructing a component tree, then
- serialising it — involves overhead that isn't shared by frameworks
- that, for example, compile your components ([24]hi!) to functions that
- just concatenate strings for SSR, which is faster by a dramatic amount.
- And those API requests were going to have to get made anyway, so it
- makes sense to do them as early as possible, especially if your app
- server and API server are close to each other (or even the same thing).
+Again, this is true but more React-specific than anything. React's approach to
+server-side rendering — constructing a component tree, then serialising it —
+involves overhead that isn't shared by frameworks that, for example, compile
+your components ([38]hi!) to functions that just concatenate strings for SSR,
+which is faster by a dramatic amount. And those API requests were going to have
+to get made anyway, so it makes sense to do them as early as possible,
+especially if your app server and API server are close to each other (or even
+the same thing).
- The dream of APIs is that you have generic, flexible endpoints upon
- which you can build any web application. That idea breaks down
- pretty fast.
+ The dream of APIs is that you have generic, flexible endpoints upon which
+ you can build any web application. That idea breaks down pretty fast.
- Amen. [25]Just go and read the whole 'APIs' section several times.
- __________________________________________________________________
+Amen. [39]Just go and read the whole 'APIs' section several times.
- Minor quibbles aside, Tom identifies some real problems with the state
- of the art in web development. But I think the article reaches a
- dangerous conclusion.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Let's start by dissecting this statement:
+Minor quibbles aside, Tom identifies some real problems with the state of the
+art in web development. But I think the article reaches a dangerous conclusion.
- I can, for example, guarantee that this blog is faster than any
- Gatsby blog (and much love to the Gatsby team) because there is
- nothing that a React static site can do that will make it faster
- than a non-React static site.
+Let's start by dissecting this statement:
- With all due respect to those involved, I don't think Gatsby is a
- particularly relevant benchmark. The gatsby new my-site starter app
- executes 266kB of minified JavaScript for a completely static page in
- production mode; for [26]gatsbyjs.org it's 808kB. Honestly, these are
- not impressive numbers.
+ I can, for example, guarantee that this blog is faster than any Gatsby blog
+ (and much love to the Gatsby team) because there is nothing that a React
+ static site can do that will make it faster than a non-React static site.
- [27]The Lighthouse performance score for gatsbyjs.org
- The [28]Lighthouse score for Gatsby's homepage, obtained via
- [29]webpagetest.org/easy.
+With all due respect to those involved, I don't think Gatsby is a particularly
+relevant benchmark. The gatsby new my-site starter app executes 266kB of
+minified JavaScript for a completely static page in production mode; for [40]
+gatsbyjs.org it's 808kB. Honestly, these are not impressive numbers.
- Leaving that aside, I disagree with the premise. When I tap on a link
- on Tom's JS-free website, the browser first waits to confirm that it
- was a tap and not a brush/swipe, then makes a request, and then we have
- to wait for the response. With a framework-authored site with
- client-side routing, we can start to do more interesting things. We can
- make informed guesses based on analytics about which things the user is
- likely to interact with and preload the logic and data for them. We can
- kick off requests as soon as the user first touches (or hovers) the
- link instead of waiting for confirmation of a tap — worst case
- scenario, we've loaded some stuff that will be useful later if they do
- tap on it. We can provide better visual feedback that loading is taking
- place and a transition is about to occur. And we don't need to load the
- entire contents of the page — often, we can make do with a small bit of
- JSON because we already have the JavaScript for the page. This stuff
- gets fiendishly difficult to do by hand.
+[41]The Lighthouse performance score for gatsbyjs.org
- Beyond that, vanilla static sites are not an ambitious enough goal.
- Take transitions for example. Web developers are currently trapped in a
- mindset of discrete pages with jarring transitions — click a link, see
- the entire page get replaced whether through client-side routing or a
- page reload — while native app developers are thinking on another
- level:
+The [42]Lighthouse score for Gatsby's homepage, obtained via [43]
+webpagetest.org/easy.
- unknown tweet media content Play butt
+Leaving that aside, I disagree with the premise. When I tap on a link on Tom's
+JS-free website, the browser first waits to confirm that it was a tap and not a
+brush/swipe, then makes a request, and then we have to wait for the response.
+With a framework-authored site with client-side routing, we can start to do
+more interesting things. We can make informed guesses based on analytics about
+which things the user is likely to interact with and preload the logic and data
+for them. We can kick off requests as soon as the user first touches (or
+hovers) the link instead of waiting for confirmation of a tap — worst case
+scenario, we've loaded some stuff that will be useful later if they do tap on
+it. We can provide better visual feedback that loading is taking place and a
+transition is about to occur. And we don't need to load the entire contents of
+the page — often, we can make do with a small bit of JSON because we already
+have the JavaScript for the page. This stuff gets fiendishly difficult to do by
+hand.
- Ryan Florence profile image
- Ryan Florence
- [30]@ryanflorence
- twitter logo
- This is what I've had in mind for the web with React Router. We say
- these kinds of animations are "good for phones but not desktop".
- My iPad pro is as big as my laptop and these apps are shopping/content
- (most of the web).
- These transitions are such a great UX.
- 16:06 PM - 22 Oct 2019
- [31]Twitter reply action [32]Twitter retweet action 20 [33]Twitter like
- action 197
+Beyond that, vanilla static sites are not an ambitious enough goal. Take
+transitions for example. Web developers are currently trapped in a mindset of
+discrete pages with jarring transitions — click a link, see the entire page get
+replaced whether through client-side routing or a page reload — while native
+app developers are thinking on another level:
- It will take more than technological advancement to get the web there;
- it will take a cultural shift as well. But we certainly can't get there
- if we abandon our current trajectory. Which is exactly what Tom seems
- to be suggesting.
- __________________________________________________________________
+ unknown tweet media content Play butt
+ Ryan Florence profile image
+ Ryan Florence
+ [44]@ryanflorence
+ twitter logo
+ This is what I've had in mind for the web with React Router. We say these
+ kinds of animations are "good for phones but not desktop".
- I'm not aware of any other platform where you're expected to write the
- logic for your initial render using a different set of technologies
- than the logic for subsequent interactions. The very idea sounds daft.
- But on the web, with its unique history, that was the norm for many
- years — we'd generate some HTML with PHP or Rails or whatever, and then
- 'sprinkle some jQuery' on it.
+ My iPad pro is as big as my laptop and these apps are shopping/content
+ (most of the web).
- With the advent of Node, that changed. The fact that we can do
- server-side rendering and communicate with databases and what-have-you
- using a language native to the web is a wonderful development.
+ These transitions are such a great UX.
+ 16:06 PM - 22 Oct 2019
+ [45] Twitter reply action [46] Twitter retweet action 20 [47] Twitter like
+ action 197
- There are problems with this model. Tom identifies some of them.
- Another major issue he doesn't discuss is that the server-rendered SPA
- model typically 'hydrates' the entire initial page in a way that
- requires you to duplicate a ton of data — once in the HTML, once in the
- JSON blob that's passed to the client version of the app to produce the
- exact same result — and can block the main thread during the period the
- user is starting to interact with the app.
+It will take more than technological advancement to get the web there; it will
+take a cultural shift as well. But we certainly can't get there if we abandon
+our current trajectory. Which is exactly what Tom seems to be suggesting.
- But we can fix those problems. [34]Next is doing amazing innovation
- around (for example) mixing static and dynamic pages within a single
- app, so you get the benefits of the purely static model without ending
- up finding yourself constrained by it. [35]Marko does intelligent
- component-level hydration, something I expect other frameworks to
- adopt. [36]Sapper, the companion framework to [37]Svelte, has a stated
- goal of eventually not sending any JS other than the (tiny) router
- itself for pages that don't require it.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- The future I want — the future I see — is one with tooling that's
- accessible to the greatest number of people (including designers), that
- can intelligently move work between server and client as appropriate,
- that lets us build experiences that compete with native on UX (yes,
- even for blogs!), and where upgrading part of a site to 'interactive'
- or from 'static' to 'dynamic' doesn't involve communication across
- disparate teams using different technologies. We can only get there by
- committing to the paradigm Tom critiques — the JavaScript-ish component
- framework server-rendered SPA. (Better names welcomed.)
+I'm not aware of any other platform where you're expected to write the logic
+for your initial render using a different set of technologies than the logic
+for subsequent interactions. The very idea sounds daft. But on the web, with
+its unique history, that was the norm for many years — we'd generate some HTML
+with PHP or Rails or whatever, and then 'sprinkle some jQuery' on it.
- The modern web has flaws, and we should talk about them. But let's not
- give up on it.
+With the advent of Node, that changed. The fact that we can do server-side
+rendering and communicate with databases and what-have-you using a language
+native to the web is a wonderful development.
+
+There are problems with this model. Tom identifies some of them. Another major
+issue he doesn't discuss is that the server-rendered SPA model typically
+'hydrates' the entire initial page in a way that requires you to duplicate a
+ton of data — once in the HTML, once in the JSON blob that's passed to the
+client version of the app to produce the exact same result — and can block the
+main thread during the period the user is starting to interact with the app.
+
+But we can fix those problems. [48]Next is doing amazing innovation around (for
+example) mixing static and dynamic pages within a single app, so you get the
+benefits of the purely static model without ending up finding yourself
+constrained by it. [49]Marko does intelligent component-level hydration,
+something I expect other frameworks to adopt. [50]Sapper, the companion
+framework to [51]Svelte, has a stated goal of eventually not sending any JS
+other than the (tiny) router itself for pages that don't require it.
+
+The future I want — the future I see — is one with tooling that's accessible to
+the greatest number of people (including designers), that can intelligently
+move work between server and client as appropriate, that lets us build
+experiences that compete with native on UX (yes, even for blogs!), and where
+upgrading part of a site to 'interactive' or from 'static' to 'dynamic' doesn't
+involve communication across disparate teams using different technologies. We
+can only get there by committing to the paradigm Tom critiques — the
+JavaScript-ish component framework server-rendered SPA. (Better names
+welcomed.)
+
+The modern web has flaws, and we should talk about them. But let's not give up
+on it.
Top comments (98)
- (BUTTON) Crown
-
-Sort discussion:
-
- * Top
- Most upvoted and relevant comments will be first
- * Latest
- Most recent comments will be first
- * Oldest
- The oldest comments will be first
-
- Subscribe
- pic
-
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
-
- (BUTTON) Personal (BUTTON) Trusted User
- [38]Create template
-
- Templates let you quickly answer FAQs or store snippets for re-use.
- (BUTTON) Submit (BUTTON) Preview [39]Dismiss
-
- [40]twigman08 profile image
- [41]Chad Smith
- (BUTTON) Chad Smith
- [42]Chad Smith
- (button) Follow
- Work with C# all day everyday creating web applications. Huge baseball
- buff.
- * Location
- Texas
- * Education
- B.S in Computer Science
- * Joined
- Dec 17, 2017
-
- • [43]May 15 '20
- (BUTTON)
- * [44]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Honestly my biggest issue with the current state of the web is the
- current state of how complex the tools or build process is.
-
- I miss the days of some html, add a bit of JavaScript to the page and
- you were done. You didn't worry about going and making sure you had a
- complete build or bundling process to get everything good. You spent
- your time worrying about how to develop your app. Which in my opinion
- was better for the users. There was less bugs. We actually spent more
- time making sure the application worked rock solid.
-
- Nowadays to get anything cool to be be ready for production you have
- spend needless time on the configuration. Did you do this? Did you
- configure it to do that? Oh you can't do that unless you eject it that
- build tool and use this build tool. That's where the current state of
- the web is failing.
-
- Sure we have taken steps forward in some areas. But we have to be
- honest with ourselves. We took major steps back in other areas of the
- web. Sometimes I wonder if we took too many steps back.
-
- (BUTTON) 61 likes Like Reply
-
- [45]gotofritz profile image
- [46]fritz
- (BUTTON) fritz
- [47]fritz
- (button) Follow
- * Location
- Berlin
- * Joined
- Sep 28, 2018
-
- • [48]May 18 '20
- (BUTTON)
- * [49]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- I don't get it. Nobody's stopping you from firing up an HTML doc in
- Notepad and FTPing the result to a web server, if that's all you need.
- But other people have more complex needs (in the "good ole days" there
- were no smart phones, to mention just one thing) and therefore we need
- more complex tools. Why do you want to force me to party like it's
- 1999?
-
- (BUTTON) 23 likes Like Reply
-
- [50]twigman08 profile image
- [51]Chad Smith
- (BUTTON) Chad Smith
- [52]Chad Smith
- (button) Follow
- Work with C# all day everyday creating web applications. Huge baseball
- buff.
- * Location
- Texas
- * Education
- B.S in Computer Science
- * Joined
- Dec 17, 2017
-
- • [53]May 19 '20
- (BUTTON)
- * [54]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- My issue isn't with applications are too complex really. I develop
- complex applications too at work.
-
- My issue is with all the moving parts with a modern web application.
- Fighting if I can use certain language features. Oh I can't, now I have
- to bother with setting up and making sure I can use Babel or something
- to do it properly, or even loading in polyfills (cool just added
- another dependency the browser has to load before the application can
- be used).
-
- That still hasn't covered bundling everything. What's the correct way
- bundle this? Well crap I now have to go and correctly configure
- WebPack. Unless you're one of the VERY FEW experts on that ,that will
- take time to figure out to get right. Ok so I think it bundles right,
- well now how should I lazy load this code for the user? What should be
- lazy loaded? What should i use to set it up?
-
- That's just the beginning. I could go on and on about the other complex
- moving parts with a modern web application.
-
- I am not asking anyone to make applications like it is 1999. All I'm
- asking for is a more modern and simpler process that is a STANDARD.
-
- Maybe it is because I come from compiled language background. Where I
- have to worry about that one single binary. I only have to worry if the
- compiler supports the language version I'm using. Where I can just pass
- in a single flag to the compiler for the optimization level I want.
-
- Yes I will be the first to say that in some areas of modern web
- application development we have taken steps forward. I just wonder if
- we have taken steps back in some areas to take those steps forward.
-
- (BUTTON) 13 likes Like Thread
-
- [55]gotofritz profile image
- [56]fritz
- (BUTTON) fritz
- [57]fritz
- (button) Follow
- * Location
- Berlin
- * Joined
- Sep 28, 2018
-
- • [58]May 22 '20 • Edited on May 22 • Edited
- (BUTTON)
- * [59]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- All I'm asking for is a more modern and simpler process that is a
- STANDARD ...
- Maybe it is because I come from compiled language background ...
-
- Well I am sorry, but web development is a complete different kettle of
- fish. We download all the parts that make up an application
- asynchronously, on a wide variety of devices, with different specs and
- rendering capabilities - all things which the app, once downloaded,
- need to adapt to. We have progressive rendering and respond to all sort
- of sensors. All while ensuring boot up time for the app is in the
- microseconds range and security for both you who download the code and
- the server.
-
- Your expectations are simply unrealistic, sorry.
-
- Also, we always had polyfills, even "back in the day". Except that back
- then everyone had to bake their own. In fact, we had browser wars and
- appalling browser (IE5 for the Mac, anyone??!?) and it was a real pain
- in the neck.
-
- (BUTTON) 10 likes Like Reply
-
- [60]adrianus profile image
- [61]Adrianus
- (BUTTON) Adrianus
- [62]Adrianus
- (button) Follow
- Running a small company based in Kent.
- * Location
- Chatham, Kent
- * Education
- autodidactic
- * Work
- Entrepreneur at AVANDERGRINTEN Ltd.
- * Joined
- Jan 21, 2020
-
- • [63]May 19 '20 • Edited on May 20 • Edited
- (BUTTON)
- * [64]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Bingo, the complexity today is a must, at least because of the growing
- smartphone usage. The simple reason why "Native Apps didn't kill the
- web even with all their superior capabilities" (Ryan) is simply UX. As
- internet usage often starts with searching for something having in
- mind, that all-app-thinking interrupts exactly this flow, leaving at
- least 30% of all traffic untouched. For what? For 5-minutes-crafts
- skyrocketing their YouTube traffic? Although not everything needs
- server side complexity plus having API's and webhooks easily integrated
- using browser capabilities not existing in the god old days, the
- architecture underneath is not the real issue.
-
- (BUTTON) 3 likes Like Reply
-
- [65]techbelle profile image
- [66]rachelle palmer
- (BUTTON) rachelle palmer
- [67]rachelle palmer
- (button) Follow
- I decided I would try to build an app in every programming language.
- That didn't happen, but what I learned along the way was really
- valuable.
- * Location
- Raleigh, NC
- * Joined
- Sep 23, 2020
-
- • [68]Feb 25 '21
- (BUTTON)
- * [69]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- re: sessions --> I keep tabs open for months at a time, not sure about
- anyone else
-
- (BUTTON) 1 like Like Reply
-
- [70]ojrask profile image
- [71]Otto Rask
- (BUTTON) Otto Rask
- [72]Otto Rask
- (button) Follow
- A software engineer, mainly PHP, Rust, and related things.
- * Location
- Finland
- * Joined
- Mar 12, 2019
-
- • [73]May 28 '21
- (BUTTON)
- * [74]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- You fight complexity with ... more complexity?
-
- (BUTTON) 1 like Like Thread
-
- [75]gotofritz profile image
- [76]fritz
- (BUTTON) fritz
- [77]fritz
- (button) Follow
- * Location
- Berlin
- * Joined
- Sep 28, 2018
-
- • [78]May 28 '21
- (BUTTON)
- * [79]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- You are getting it wrong. The aim is not "to fight complexity". The aim
- is to fulfil complex needs. I am saying for that you often need more
- complex tools.
-
- (BUTTON) 1 like Like Thread
-
- [80]ojrask profile image
- [81]Otto Rask
- (BUTTON) Otto Rask
- [82]Otto Rask
- (button) Follow
- A software engineer, mainly PHP, Rust, and related things.
- * Location
- Finland
- * Joined
- Mar 12, 2019
-
- • [83]May 28 '21
- (BUTTON)
- * [84]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- What percentage of modern web is a "complex needs" target that requires
- a complex solution such as React or Vue or perhaps something custom
- written in WASM? 50% 25%? 5% 1%?
-
- (BUTTON) 2 likes Like Thread
-
- [85]gotofritz profile image
- [86]fritz
- (BUTTON) fritz
- [87]fritz
- (button) Follow
- * Location
- Berlin
- * Joined
- Sep 28, 2018
-
- • [88]May 28 '21
- (BUTTON)
- * [89]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- All of it. Unless you have actual data that proves otherwise...
-
- (BUTTON) 2 likes Like Thread
-
- [90]jacobmakestheweb profile image
- [91]Jacob Ybarra
- (BUTTON) Jacob Ybarra
- [92]Jacob Ybarra
- (button) Follow
- dank web dev
- * Education
- school
- * Work
- nada
- * Joined
- Sep 21, 2021
-
- • [93]Sep 21 '21
- (BUTTON)
- * [94]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- uh what? the web is about content and media. not a software
- environment.
-
- (BUTTON) 1 like Like Reply
-
- [95]mark_saward profile image
- [96]Mark Saward
- (BUTTON) Mark Saward
- [97]Mark Saward
- (button) Follow
- CEO and Developer | PhD in Philosophy | Some things I like: Linux, Go,
- Rust, SQL, Devops
- * Location
- Victoria, Australia
- * Education
- BA/Bsc in Philosophy and Physics. PhD in Philosophy.
- * Work
- CEO/Software Developer at Episub
- * Joined
- May 13, 2020
-
- • [98]May 15 '20
- (BUTTON)
- * [99]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Some interesting thoughts, in the original article and your response.
- Certainly good for generating discussion :)
-
- It will take more than technological advancement to get the web
- there; it will take a cultural shift as well. But we certainly can't
- get there if we abandon our current trajectory.
-
- The problem as I see it is that the web -- in terms of client-side
- executed markup and code (HTML/CSS/JavaScript) just wasn't designed
- with these kinds of interactions in mind (the interactions that Ryan
- Florence highlighted). It's the wrong foundation for it.
-
- I don't think that "getting there" should be through bending original
- web technologies, but rather with something else entirely -- perhaps
- WebAssembly, or a return to actual native applications much like we've
- come to depend on on our tablets and phones. We already can do nice
- animations like that iPad demo with native desktop applications.
- There's many advantages to websites over native desktop apps, with the
- standout one being that they don't require someone to install an
- application on their machine. Maybe WebAssembly can give us a
- compromise -- desktop apps built with technology designed for that job,
- but available in a way that doesn't require any local installation.
- Then we can use tools that were purpose built for those kinds of tasks,
- instead of trying to wrangle the foundations of the web to fit
- something they were never built for.
-
- When I think back to how we used to build websites back in the day, and
- how we build sites with technologies in tools like React now, I'm
- honestly not sure that we've gained anything of great enough value
- relative to the simplicity we've lost. In short, I'd be happy to
- abandon our current trajectory and put our hope in alternative
- solutions for those situations where what we really need is a native
- application. Leave the web for what it's good at.
-
- (BUTTON) 23 likes Like Reply
-
- [100]ryansolid profile image
- [101]Ryan Carniato
- (BUTTON) Ryan Carniato
- [102]Ryan Carniato
- (button) Follow
- Frontend performance enthusiast and Fine-Grained Reactivity super fan.
- Author of the SolidJS UI library and MarkoJS Core Team Member.
- * Location
- San Jose, California
- * Education
- Computer Engineering B.A.Sc, University of British Columbia
- * Work
- Principal Engineer, Open Source, Netlify
- * Joined
- Jun 25, 2019
-
- • [103]May 15 '20
- (BUTTON)
- * [104]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- That's interesting. I mean I was there too, and the extent of what I
- can build with a modern library so extends what I could reasonably do
- before. And the reason for that is JavaScript. When I was building
- sites in the late 90s so many things weren't possible and you had no
- choice but to pay these costs for interactivity. Sure I view sourced a
- few cool tricks.. image maps etc, but with my table based layouts and a
- little JavaScript I could do very little. Part of it was the available
- DOM api's. My lack of understanding of the language but I think we look
- at the past with rose colored glasses.
-
- It's more interesting to me that native platforms have borrowed
- concepts from libraries like React in terms of declarative views etc.
- I'm not saying React invented this stuff but that the trend would
- suggest the contrary. These trends could be mistakes but popularity has
- as much stake in the course of events as innate value.
-
- I think this comes down to really this hope of a Silver Bullet. It
- doesn't exist. Instead we have momentum of a ubiquitous platform that
- just is constantly aiming to improve. It's not only that the other
- approaches have already lost, we're getting to a point where any new
- approach will have to atleast acknowledge the current web. At this
- point a competitor isn't going to change the tide, but something from
- within. It's more likely that the web addresses those fundamental
- shortcomings than people moving to a different platform. Native Apps
- didn't kill the web even with all their superior capabilities. And on a
- similar note it is going to take monumental change for this to
- fundamentally change. Even with React's reach, it wasn't alone in a
- movement that started years before. This is bigger than any particular
- library or framework.
-
- (BUTTON) 13 likes Like Reply
-
- [105]mark_saward profile image
- [106]Mark Saward
- (BUTTON) Mark Saward
- [107]Mark Saward
- (button) Follow
- CEO and Developer | PhD in Philosophy | Some things I like: Linux, Go,
- Rust, SQL, Devops
- * Location
- Victoria, Australia
- * Education
- BA/Bsc in Philosophy and Physics. PhD in Philosophy.
- * Work
- CEO/Software Developer at Episub
- * Joined
- May 13, 2020
-
- • [108]May 16 '20 • Edited on May 16 • Edited
- (BUTTON)
- * [109]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- There is absolutely no doubt that you can do incredible things with
- modern web, and the power unlocked by having a programming language in
- the browser has been amazing. However, when I think about a great deal
- of the websites I interact with, and ones I build, there would not be
- much lost if they significantly simplified the tech stack they work
- with to be closer to the core technologies of the web (including a
- splash of JavaScript).
-
- What I'm trying to convey is that I think our move to make everything a
- web app has been a mistake, for multiple reasons. You are absolutely
- right to say that this tide is going to be very hard (perhaps
- impossible) to turn, and I absolutely agree there is no silver bullet
- (I've looked), but that doesn't mean we haven't taken a worse path and
- shouldn't lament for what could have been.
-
- The advantages of web apps are compelling for developers -- they are
- easy to distribute, update, control, make cross platform, when compared
- to native apps. It is not hard to understand why and how we have ended
- up where we are. I just wish we were somewhere else -- but it would
- take a lot of work to create that 'silver bullet'.
-
- (BUTTON) 11 likes Like Thread
-
- [110]adrianus profile image
- [111]Adrianus
- (BUTTON) Adrianus
- [112]Adrianus
- (button) Follow
- Running a small company based in Kent.
- * Location
- Chatham, Kent
- * Education
- autodidactic
- * Work
- Entrepreneur at AVANDERGRINTEN Ltd.
- * Joined
- Jan 21, 2020
-
- • [113]May 19 '20 • Edited on May 20 • Edited
- (BUTTON)
- * [114]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- That whole app environment was basically triggered by one need, and one
- need only: bandwidth. No idea if anyone remembers when they launched
- this WAP protocol, making the internet available on smartphones, what
- failed for two reasons. The providers made it easy to access on their
- own portals aka AOL strategy at beginning of the web, leaving the rest
- of the market untouched, secondly the site performance was ridiculous.
- Apple stepped in, put a bunch of intelligence into the app,
- dramatically reducing the load time, did not convert so much traffic on
- their own apps and let developers do what they do best. By 2008 more
- than 50% of the whole mobile internet traffic was iPhone traffic.
-
- Bandwidth is no longer the breaking point.
-
- Google has for years campaigned the untapped goldmine local traffic,
- experience flows that often start at the search for getting something
- done in time, monetising on micro moments as more than half of all
- mobile searches have a local intend. I posted an example how something
- to get done interferes cross-applicational from the perspective of a
- user. With an app-only scheme this is getting impossible. Sure it is
- understandable that nobody pays so much attention. Most search engines
- run a change and heavily invested in AI to optimise traffic at the
- client's frontend. But even this is not enough, when it comes to
- intends other than something very individualised. I wouldn't care so
- much about the user, but more about what the user wants to achieve.
-
- (BUTTON) 1 like Like Reply
-
-
- [115]oenonono profile image
- [116]Junk
- (BUTTON) Junk
- [117]Junk
- (button) Follow
- * Joined
- Mar 12, 2017
-
- • [118]May 17 '20
- (BUTTON)
- * [119]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- React definitely didn't invent HTML.
-
- Declarative views, indeed.
-
- (BUTTON) 1 like Like Reply
-
-
- [120]v6 profile image
- [121]🦄N B🛡
- (BUTTON) 🦄N B🛡
- [122]🦄N B🛡
- (button) Follow
- // , “It is not so important to be serious as it is to be serious about
- the important things. The monkey wears an expression of seriousness...
- but the monkey is serious because he itches."(No/No)
- * Location
- (No/No)
- * Education
- (No/No)
- * Work
- Security
- * Joined
- Mar 1, 2018
-
- • [123]May 15 '20
- (BUTTON)
- * [124]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- The problem as I see it is that the web -- in terms of client-side
- executed markup and code (HTML/CSS/JavaScript) just wasn't designed
- with these kinds of interactions in mind (the interactions that Ryan
- Florence highlighted). It's the wrong foundation for it.
-
- Yes. Please. Can we please just accept that it's all broken.
-
- (BUTTON) 4 likes Like Reply
-
-
- [125]gotofritz profile image
- [126]fritz
- (BUTTON) fritz
- [127]fritz
- (button) Follow
- * Location
- Berlin
- * Joined
- Sep 28, 2018
-
- • [128]May 18 '20 • Edited on May 18 • Edited
- (BUTTON)
- * [129]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Not at all.
-
- CSS has media queries and all sort of crazy and wonderful stuff. HTML
- has tags for responsive design. JS has (in the browser) access to apis
- like mutation observer and orientation and speech recognition. It's
- TOTALLY built for that. Enough of the "get off my lawn" negativity
-
- (BUTTON) 8 likes Like Thread
-
- [130]v6 profile image
- [131]🦄N B🛡
- (BUTTON) 🦄N B🛡
- [132]🦄N B🛡
- (button) Follow
- // , “It is not so important to be serious as it is to be serious about
- the important things. The monkey wears an expression of seriousness...
- but the monkey is serious because he itches."(No/No)
- * Location
- (No/No)
- * Education
- (No/No)
- * Work
- Security
- * Joined
- Mar 1, 2018
-
- • [133]May 18 '20 • Edited on May 18 • Edited
- (BUTTON)
- * [134]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- shakes his cane at you
-
- mutters incomprehensibly
-
- (BUTTON) 4 likes Like Reply
-
-
- [135]stew_sims profile image
- [136]Stewart Sims
- (BUTTON) Stewart Sims
- [137]Stewart Sims
- (button) Follow
- * Joined
- May 31, 2019
-
- • [138]May 15 '20 • Edited on May 15 • Edited
- (BUTTON)
- * [139]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- There's a lot to agree with in both of these takes. However, one
- criticism of this one (and I realise we're getting into hugely
- subjective territory) is the assumption that the goal should be to
- 'build experiences that compete with native on UX'. It strikes me that
- the web never was and never will be anything like any other platform
- for building applications. Whether or not someone wants to turn it into
- that is their prerogative and any success they have probably will help
- others build better things. But it ultimately depends on what you want
- to build and why, and emulating a native application might not always
- be the best option. I think the key is to allow ourselves to question
- the assumptions we all hold which seems to be exactly what both of you
- are doing with different approaches, reaching different conclusions. So
- I would say; keep doing that and keep doing your thing, but just don't
- expect everyone to agree and do things the same way. The world is a
- better place when we allow and encourage people not to homogenise in
- their thinking.
-
- (BUTTON) 34 likes Like Reply
-
-
- [140]rhymes profile image
- [141]rhymes
- (BUTTON) rhymes
- [142]rhymes
- (button) Follow
- Such software as dreams are made on. I mostly rant about performance,
- unnecessary complexity, privacy and data collection.
- * Joined
- Feb 2, 2017
-
- • [143]May 18 '20 • Edited on May 18 • Edited
- (BUTTON)
- * [144]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- It strikes me that the web never was and never will be anything like
- any other platform for building applications. Whether or not someone
- wants to turn it into that is their prerogative and any success they
- have probably will help others build better things. But it
- ultimately depends on what you want to build and why, and emulating
- a native application might not always be the best option.
-
- this :-)
-
- (BUTTON) 5 likes Like Reply
-
-
- [145]oenonono profile image
- [146]Junk
- (BUTTON) Junk
- [147]Junk
- (button) Follow
- * Joined
- Mar 12, 2017
-
- • [148]May 17 '20
- (BUTTON)
- * [149]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- points up
-
- (BUTTON) 1 like Like Reply
-
-
- [150]holdit profile image
- [151]holdit
- (BUTTON) holdit
- [152]holdit
- (button) Follow
- * Joined
- May 15, 2020
-
- • [153]May 15 '20
- (BUTTON)
- * [154]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Looking at the criticism made about some recent redesigns (reddit,
- facebook, etc) it seems that the main complaint (from a user point of
- view, at least) is how slow it feels compared to the previous version
- or to a "simple" site with HTML, CSS, and a little bit of javascript.
-
- I haven't checked it recently, but when the new reddit UI was released,
- scrolling was terrible on my $2500k laptop. It felt slow. Everything
- was sluggish. It also downloaded a few MB of javascript on pages that
- essentially had a thumbnail, a title, and some comments (not everyone
- lives in a big city or is connected to a super fast internet
- connection!). When the page was loaded, I was seeing more scrolling lag
- because they lazyload some content. I mean, it's hard to like this
- "modern web".
-
- As a user, I don't care about how things work behind the scenes. I
- don't mind some javascript on a page, after all we don't need a page
- reload just to preview a comment or "like" something. You can even use
- javascript for everything, I don't mind. But it needs to be fast and it
- needs to work well... and right now some "modern" sites provide a worse
- experience than before.
-
- (BUTTON) 24 likes Like Reply
-
-
- [155]iamschulz profile image
- [156]Daniel Schulz
- (BUTTON) Daniel Schulz
- [157]Daniel Schulz
- (button) Follow
- Hi! I'm a frontend guy.
- * Location
- Germany
- * Education
- Studied Media Art and Design
- * Work
- Performance Engineer at Baqend
- * Joined
- Sep 17, 2018
-
- • [158]May 15 '20 • Edited on May 15 • Edited
- (BUTTON)
- * [159]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Tom identified the main weakness of modern web development correctly:
- It's based on javascript. He points out the sluggishness and
- accessibility problems that stem from that attitude, and hes absolutely
- right to do so. Static pages (as a paradigm, not as Gatsby in
- particular) are maybe not the cure for that, but they are definitely a
- step into the right direction.
- I just rewrote my website with hugo and specifically without a major JS
- framework, but settled for a vanilla approach rooted in a progressive
- enhancement mindset. I didn't even run into the problems that are
- inherent to React, Vue and Angular.
- Sure, you can serve HTML with SSR, but you still have to wait for the
- bundle in order to have a functional site, plus a truckload of
- ssr-related complexity. And that is utter rubbish. JS should never be a
- requirement, it needs to be put in its place as the cherry on top of
- the cake.
- Progressive enhancement needs not only to be a major approach to
- webdevelopment again, it needs to be out default mode of operation.
- This is also the core of Toms article. And I agree with him.
-
- That said, nothing stops you from adding features like nice
- transitions. But please be sure not to break standard web features
- while doing so.
- Transitions need to add to hyperlinks, not replace them.
-
- (BUTTON) 21 likes Like Reply
-
-
- [160]richharris profile image
- [161]Rich Harris
- (BUTTON) Rich Harris
- [162]Rich Harris
- (button) Follow
- I like turtles
- * Location
- Behind you
- * Work
- Graphics editor at the New York Times
- * Joined
- Jun 20, 2019
-
- • [163]May 15 '20
- (BUTTON)
- * [164]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- I feel like you didn't quite read the article closely enough ;) Of
- course progressive enhancement needs to be the default — that's why
- there's so much focus on SSR in all major meta-frameworks.
-
- Sure, you can serve HTML with SSR, but you still have to wait for
- the bundle in order to have a functional site
-
- This isn't true! Take [165]sapper.svelte.dev, which is a site built
- with Sapper and baked out as static pages. It works just fine without
- JavaScript, you just don't get client-side routing. It's a small site,
- but the same thing applies to larger ones like Gatsby's homepage — no
- JS? No problem.
-
- (BUTTON) 20 likes Like Reply
-
-
- [166]iamschulz profile image
- [167]Daniel Schulz
- (BUTTON) Daniel Schulz
- [168]Daniel Schulz
- (button) Follow
- Hi! I'm a frontend guy.
- * Location
- Germany
- * Education
- Studied Media Art and Design
- * Work
- Performance Engineer at Baqend
- * Joined
- Sep 17, 2018
-
- • [169]May 15 '20
- (BUTTON)
- * [170]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- It certainly is true for standard implementations of React-, Vue- and
- Angular- based sites. There may be a focus on SSR, but it still isn't
- close enough to deserve to be the default. It needs to come without
- extra complexity. Only then we're ready to take the step to fully
- embrace those solution.
-
- And this is my point. You need to take one step after the other. It was
- a mistake to build everything with javascript first and then try to
- look if it still works without afterwards. The damage to the web has
- been done.
-
- I didn't take a look at Sapper/Svelte. Though, in comparison, those are
- still a nieche product.
-
- (BUTTON) 7 likes Like Thread
-
- [171]martinmalinda profile image
- [172]Martin Malinda
- (BUTTON) Martin Malinda
- [173]Martin Malinda
- (button) Follow
- * Joined
- Apr 7, 2020
-
- • [174]May 18 '20
- (BUTTON)
- * [175]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- The damage to the web has been done.
-
- JS certainly caused a lot of damage on many websites. But now - finally
- - we're getting to the point of having frameworks which can, by
- default, offer client-side routing with SSR and hydration without
- shipping large bundles of JS. Up to this point the frontend devs should
- have been more conservative and they should have thought twice whether
- they should really go all-in into an SPA. But now's the time when it's
- really starting to be a viable option. Next, Nuxt, Marko and Sapper are
- finally technologies highly worth pursuing, even for content-based
- websites.
-
- (BUTTON) 2 likes Like Reply
-
-
- [176]ben profile image
- [177]Ben Halpern
- (BUTTON) Ben Halpern
- [178]Ben Halpern
- (button) Follow
- A Canadian software developer who thinks he’s funny.
- * Email
- [179]ben@forem.com
- * Location
- NY
- * Education
- Mount Allison University
- * Pronouns
- He/him
- * Work
- Co-founder at Forem
- * Joined
- Dec 27, 2015
-
- • [180]May 15 '20
- (BUTTON)
- * [181]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- The future I want — the future I see — is one with tooling that's
- accessible to the greatest number of people (including designers),
- that can intelligently move work between server and client as
- appropriate, that lets us build experiences that compete with native
- on UX (yes, even for blogs!), and where upgrading part of a site to
- 'interactive' or from 'static' to 'dynamic' doesn't involve
- communication across disparate teams using different technologies.
- We can only get there by committing to the paradigm Tom critiques —
- the JavaScript-ish component framework server-rendered SPA. (Better
- names welcomed.)
-
- I like this takeaway because it's heavy on acknowledging the process
- behind the technology which is often disparate and confusing. Even the
- most well-intentioned and organized dev team is going to get out of
- wack if succeeding with the tooling is experts only. We need to be able
- to achieve great performance, UX and accessibility even under
- conditions where designers do some work, devs pop in some hotfixes here
- and there, old devs leave with some of the knowledge, priorities
- change, etc.
-
- (BUTTON) 19 likes Like Reply
-
-
- [182]v6 profile image
- [183]🦄N B🛡
- (BUTTON) 🦄N B🛡
- [184]🦄N B🛡
- (button) Follow
- // , “It is not so important to be serious as it is to be serious about
- the important things. The monkey wears an expression of seriousness...
- but the monkey is serious because he itches."(No/No)
- * Location
- (No/No)
- * Education
- (No/No)
- * Work
- Security
- * Joined
- Mar 1, 2018
-
- • [185]May 15 '20 • Edited on May 15 • Edited
- (BUTTON)
- * [186]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- I like this aspect of Mr. Harris' article, too. It's the first
- principle of the Tao of HashiCorp: [187]Workflows, not Technologies.
-
- The HashiCorp approach is to focus on the end goal and workflow,
- rather than the underlying technologies. Software and hardware will
- evolve and improve, and it is our goal to make adoption of new
- tooling simple, while still providing the most streamlined user
- experience possible. Product design starts with an envisioned
- workflow to achieve a set goal. We then identify existing tools that
- simplify the workflow. If a sufficient tool does not exist, we step
- in to build it. This leads to a fundamentally technology-agnostic
- view — we will use the best technology available to solve the
- problem. As technologies evolve and better tooling emerges, the
- ideal workflow is just updated to leverage those technologies.
- Technologies change, end goals stay the same.
-
- And it's why Sacrificial Architecture appeases the dark ones.
-
- (BUTTON) 4 likes Like Reply
-
-
- [188]phlash profile image
- [189]Phil Ashby
- (BUTTON) Phil Ashby
- [190]Phil Ashby
- (button) Follow
- 30+ years of tech, retired from an identity intelligence company, job
- done! Dev community mod - mostly light gardening & weeding out spam :)
- * Location
- Felixstowe, UK
- * Education
- M.Eng (hons) Electronics, MIET, MBCS, AMCIISec, CEH
- * Pronouns
- he/him
- * Work
- Retired!
- * Joined
- Apr 2, 2017
-
- • [191]May 15 '20
- (BUTTON)
- * [192]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Good response, opinions are always worth having, as long as you are
- prepared to discuss/defend/change them! I had a few thoughts on this
- topic last year in response to your good self and web components that I
- think is worth referring back to: [193]dev.to/phlash909/comment/cghl
-
- In essence, the DOM and page model of HTML is a constraint around the
- outside of applications that might be better inverted: I'd like to see
- browsers that support HTML/DOM content if required, but do not
- constrain devs to always go though it. Let's stop thinking of them as
- HTML rendering engines, and start thinking of pre-installed runtimes
- with excellent web-based application management!
-
- We'll want to retain the benefits of dynamic software running on the
- client (native UX, easy architecture changes, no user-install step,
- etc.), while leveraging the effort that goes into making that a
- portable & safe thing to do (common APIs, sandboxes, browsers as the
- standard runtime for client-side applications). We are nearly there
- with PWAs perhaps? WASM then expands the available languages for the
- runtime, allowing common client/server languages and development
- processes to ease developer adoption. As/when a document needs
- rendering, then HTML/DOM/CSS is there to perform it's proper function,
- however many apps many be better off with a UX library (eg: SDL) or
- widget set (eg: wxWidgets) atop the runtime bindings.
-
- (BUTTON) 11 likes Like Reply
-
-
- [194]v6 profile image
- [195]🦄N B🛡
- (BUTTON) 🦄N B🛡
- [196]🦄N B🛡
- (button) Follow
- // , “It is not so important to be serious as it is to be serious about
- the important things. The monkey wears an expression of seriousness...
- but the monkey is serious because he itches."(No/No)
- * Location
- (No/No)
- * Education
- (No/No)
- * Work
- Security
- * Joined
- Mar 1, 2018
-
- • [197]May 15 '20
- (BUTTON)
- * [198]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- start thinking of pre-installed runtimes with excellent web-based
- application management!
-
- If you were to remove the "web-based" part, it'd almost describe the
- beginning of OSes back in the day.
-
- Which is perhaps what they are: The UI part of a vast "operating
- system" by which we access the "applications" of the internet.
-
- (BUTTON) 4 likes Like Reply
-
-
- [199]panesofglass profile image
- [200]panesofglass
- (BUTTON) panesofglass
- [201]panesofglass
- (button) Follow
- * Joined
- Jul 23, 2020
-
- • [202]Jul 23 '20
- (BUTTON)
- * [203]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- I believe at the point you fundamentally push to render things other
- than markup, you start making a different application. And that is
- perfectly reasonable. I’m frankly surprised how well HTTP has held up
- to so many use cases. I long ago expected to see far more protocols for
- more kinds of apps, but HTTP seems to have solved so many problems well
- enough that it now hosts other protocols.
-
- There are probably more protocols that could be written and hosted on
- other ports. Those would likely address many of these issues in a far
- better way. I just wonder when the industry will pivot back to building
- protocols and leave HTTP well enough alone.
-
- (BUTTON) 1 like Like Reply
-
-
- [204]rhymes profile image
- [205]rhymes
- (BUTTON) rhymes
- [206]rhymes
- (button) Follow
- Such software as dreams are made on. I mostly rant about performance,
- unnecessary complexity, privacy and data collection.
- * Joined
- Feb 2, 2017
-
- • [207]Jul 23 '20
- (BUTTON)
- * [208]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- I think we're past that as most recent innovations in the web space are
- either formats or evolutions of HTTP. Why reinvent the wheel if the
- wheel works well? What do you think?
-
- (BUTTON) 1 like Like Thread
-
- [209]panesofglass profile image
- [210]panesofglass
- (BUTTON) panesofglass
- [211]panesofglass
- (button) Follow
- * Joined
- Jul 23, 2020
-
- • [212]Jul 23 '20
- (BUTTON)
- * [213]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- HTTP/3 with QUIC seems like a great improvement, but it is changing
- HTTP. I don’t see why HTTP needs changing for most things. Why not
- update SMTP or FTP, as well? QUIC solves specific problems, and it
- might be better for those who need QUIC for it to have features better
- suited to their needs.
-
- In some ways, this also feels like the mash of several formats into
- HTML5 to avoid name spacing. While we focus on and champion components
- within our own apps, we continue to avoid and break components in the
- infrastructure.
-
- Therefore, I think we may see new protocols emerge as the weight of
- these complexities begin to cause problems. That could still be some
- way off.
-
- (BUTTON) 1 like Like Thread
-
- [214]rhymes profile image
- [215]rhymes
- (BUTTON) rhymes
- [216]rhymes
- (button) Follow
- Such software as dreams are made on. I mostly rant about performance,
- unnecessary complexity, privacy and data collection.
- * Joined
- Feb 2, 2017
-
- • [217]Jul 23 '20
- (BUTTON)
- * [218]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- I'm not sure it is changing HTTP, it's HTTP over UDP. The protocol is
- basically the same as HTTP/1 and HTTP/2.
-
- QUIC solves specific problems, and it might be better for those who
- need QUIC for it to have features better suited to their needs.
-
- QUIC solves a specific problem HTTP has because it sits on top of TCP
- though, basically pipelining
-
- In some ways, this also feels like the mash of several formats into
- HTML5 to avoid name spacing. While we focus on and champion
- components within our own apps, we continue to avoid and break
- components in the infrastructure.
-
- I'm not sure I follow the analogy with HTML5, sorry :( IIRC HTML5 was
- created to stop having to revise HTML as a a single unit and let things
- evolve at their own pace. Same with CSS 3 I guess. I don't think it's
- the same thing here: HTTP/3 is the result of the entire world using
- HTTP and needing to improve performance.
-
- Could they have created a new protocol? Sure, but why break
- compatibility with millions of browsers, proxies, machines, software
- application and so on that understand and function through HTTP? I
- think the decision to rewrite the transport layer to be a smart one.
-
- This doesn't mean that other protocols can't emerge, but it's okay not
- to throw away those that work already
-
- (BUTTON) 1 like Like Reply
-
-
- [219]gregfletcher profile image
- [220]Greg Fletcher
- (BUTTON) Greg Fletcher
- [221]Greg Fletcher
- (button) Follow
- loop { refactoring() }
- * Work
- Full Stack at Freelance
- * Joined
- Mar 16, 2019
-
- • [222]May 15 '20
- (BUTTON)
- * [223]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Great article!
-
- Doesn't a lot of this disagreement stem from --> "keep the web as it
- is, coz it's fine" vs "let's make it better by making mistakes along
- the way coz that's how software development works"?
-
- (BUTTON) 14 likes Like Reply
-
-
- [224]v6 profile image
- [225]🦄N B🛡
- (BUTTON) 🦄N B🛡
- [226]🦄N B🛡
- (button) Follow
- // , “It is not so important to be serious as it is to be serious about
- the important things. The monkey wears an expression of seriousness...
- but the monkey is serious because he itches."(No/No)
- * Location
- (No/No)
- * Education
- (No/No)
- * Work
- Security
- * Joined
- Mar 1, 2018
-
- • [227]May 15 '20
- (BUTTON)
- * [228]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- What about making it better by [229]sacrificing it?
-
- We can [230]learn this lesson from Biology, that the best way to avoid
- excessive optimization is the ultimate flexibility: Keeping the option
- on the table to throw out the code, or well abstracted parts of it, and
- rewrite that code or product from scratch.
-
- It's a little known "dark" pattern of Software Design, from the shadows
- of Agile, called "Sacrificial Architecture."
-
- [231]exponential growth isnt kind to architectural decisions
-
- (BUTTON) 5 likes Like Reply
-
-
- [232]richharris profile image
- [233]Rich Harris
- (BUTTON) Rich Harris
- [234]Rich Harris
- (button) Follow
- I like turtles
- * Location
- Behind you
- * Work
- Graphics editor at the New York Times
- * Joined
- Jun 20, 2019
-
- • [235]May 15 '20
- (BUTTON)
- * [236]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Is the Web for applications?
-
- I feel like this question sort of answers itself! Have you heard of
- Amazon? Gmail? Facebook?
-
- (BUTTON) 13 likes Like Reply
-
-
- [237]ben profile image
- [238]Ben Halpern
- (BUTTON) Ben Halpern
- [239]Ben Halpern
- (button) Follow
- A Canadian software developer who thinks he’s funny.
- * Email
- [240]ben@forem.com
- * Location
- NY
- * Education
- Mount Allison University
- * Pronouns
- He/him
- * Work
- Co-founder at Forem
- * Joined
- Dec 27, 2015
-
- • [241]May 15 '20
- (BUTTON)
- * [242]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- My perpective: The web is for applications. The web is also for rich
- documents where reading and simple linking can take priority.
-
- And there is an uncanny valley when you the latter is the sensible
- choice, but the former is the approach taken.
-
- And many, the web is whatever Google tells them it is. Is AMP the web?
-
- (BUTTON) 22 likes Like Reply
-
-
- [243]gotofritz profile image
- [244]fritz
- (BUTTON) fritz
- [245]fritz
- (button) Follow
- * Location
- Berlin
- * Joined
- Sep 28, 2018
-
- • [246]May 22 '20
- (BUTTON)
- * [247]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- We need to have a similar approach in client side frameworks.
-
- No we don't... if the The One True Omniscient God Framework approach
- that Rails developers are constantly pining for was really the best
- one, then Rails would be ruling. It isn't; it peaked in 2012 or
- thereabouts, knocked off its perch by Node, among other technologies.
- It's a single point of failure and it cannot adapt quickly enough to
- the bewilderingly fast changing environment in which we operate.
-
- Alternatively, you can pick one of the two frameworks that follow the
- model you advocate: Ember (actually inspired by Rails) or Angular (more
- of a C# flavour), both of which strive to be a nanny that remove as
- much as possible the need to (god forbid!) make your own decisions or
- (the horror!) having to learn new tools
-
- If I could have the framework of my dreams ... It would allow me to
- focus on HTML with a sprinkle of JavaScript.
-
- You may want to consider [248]stimulusjs.org/, which comes from the
- Rails universe (it was created by no other than David Heinemeier
- Hansson, the Rails Superstar) and does exactly what you want
-
- (BUTTON) 5 likes Like Thread
-
- [249]loilo profile image
- [250]Florian Reuschel
- (BUTTON) Florian Reuschel
- [251]Florian Reuschel
- (button) Follow
- Web developer (JS, PHP), OSS enthusiast, loves to explain things to
- beginners
- * Location
- Karlsruhe, DE
- * Joined
- Jan 14, 2017
-
- • [252]May 22 '20
- (BUTTON)
- * [253]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Can confirm that the Stimulus framework works great for that exact use
- case. But if you're used to the more common frameworks, you might
- quickly miss the declarative "give me data, I give you DOM" approach
- they provide.
-
- I haven't tried it myself yet, but [254]Alpine.js gained some steam
- lately and might be a good middle ground between Stimulus and the "top
- dogs".
-
- (BUTTON) 4 likes Like Reply
-
-
- [255]mattwelke profile image
- [256]Matt Welke
- (BUTTON) Matt Welke
- [257]Matt Welke
- (button) Follow
- Back end software developer, open source enthusiast.
- * Location
- Ontario, Canada
- * Education
- Seneca College
- * Work
- Backend software engineer at DigitalOcean
- * Joined
- Aug 16, 2019
-
- • [258]May 27 '20
- (BUTTON)
- * [259]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- writing an Express API requires "old javascript" unless you want to
- go through the hassle of setting Babel up
-
- Not sure what you mean here. You can use very recent JS features in
- Node. We have async/await, async iteration, ES module imports, and more
- now. I've never felt the need to set up Babel in an Express project.
-
- (BUTTON) 5 likes Like Reply
-
-
- [260]mattgperry profile image
- [261]Matt Perry
- (BUTTON) Matt Perry
- [262]Matt Perry
- (button) Follow
- Creator of Framer Motion, Popmotion and Pose
- * Location
- Amsterdam
- * Joined
- May 15, 2020
-
- • [263]May 15 '20
- (BUTTON)
- * [264]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- it's widely understood that if you want 60fps animation, you will
- likely have to bypass the React update cycle and do things in a more
- imperative fashion (indeed, this is what libraries like react-spring
- do)
-
- Probably aside from the article, which I largely agree with, but I
- think this is an odd point to try and make. This is true of any
- component library that has overhead above imperative JS. But there's
- nothing stopping you from using CSS in React, which is all Svelte does
- anyway.
-
- (BUTTON) 9 likes Like Reply
-
-
- [265]richharris profile image
- [266]Rich Harris
- (BUTTON) Rich Harris
- [267]Rich Harris
- (button) Follow
- I like turtles
- * Location
- Behind you
- * Work
- Graphics editor at the New York Times
- * Joined
- Jun 20, 2019
-
- • [268]May 15 '20
- (BUTTON)
- * [269]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Wrong, sorry :)
-
- This isn't a CSS demo: [270]twitter.com/Rich_Harris/status/120...
-
- (BUTTON) 11 likes Like Reply
-
-
- [271]daniel15 profile image
- [272]Daniel Lo Nigro
- (BUTTON) Daniel Lo Nigro
- [273]Daniel Lo Nigro
- (button) Follow
- Australian living in the San Francisco Bay Area. Front End Engineer at
- Facebook.
- * Location
- Palo Alto, CA
- * Education
- Swinburne University, Australia
- * Work
- Front End Engineer at Facebook
- * Joined
- Jan 11, 2017
-
- • [274]May 15 '20 • Edited on May 15 • Edited
- (BUTTON)
- * [275]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- We can provide better visual feedback that loading is taking place
-
- I'm not so sure about that... IMO, so many single-page apps get this
- wrong. The native browser loading indicator is still a lot better than
- many SPAs, and unfortunately it's something that can't be triggered
- from JS (apart from ugly hacks like infinitely-loading iframes)
-
- With the advent of Node, that changed. The fact that we can do
- server-side rendering and communicate with databases and
- what-have-you using a language native to the web is a wonderful
- development.
-
- Server-side JS was a thing looooong before Node. I remember using
- Microsoft's version of JavaScript ("JScript") server-side via Classic
- ASP in the early 2000s. The issue back then was that JavaScript just
- wasn't quite that popular yet. ES5 wasn't around yet (it was all ES3),
- and there was a lack of good third-party libraries. But still, it was
- absolutely in use long before Node even existed.
-
- What Node did do was cross-platform support, introduce a module system
- (CommonJS) as standard, and introduced the concept of easily obtaining
- third-party packages via "npm", taking ideas from similar systems like
- Perl's CPAN.
-
- (BUTTON) 4 likes Like Reply
-
-
- [276]mrispoli24 profile image
- [277]Mike Rispoli
- (BUTTON) Mike Rispoli
- [278]Mike Rispoli
- (button) Follow
- I'm an award-winning designer, engineer and creative technologist that
- helps daring founders ship valuable software.
- * Location
- New York City
- * Work
- Co-founder & CTO at Cause of a Kind
- * Joined
- Mar 8, 2019
-
- • [279]May 15 '20
- (BUTTON)
- * [280]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- So one thing I wondered after reading Tom's article and now yours is
- how you feel about modern UI being so tied to node or javascript run
- times on the backend specifically. For instance if you were to be
- running something in Go and Phoenix you could dynamically render HTML
- on the back end and serve it up quite a bit faster that the current SSR
- environments based in Next or Nuxt or Sapper? So essentially somewhat
- the way Stimulus JS works where you can send over static HTML, rendered
- anywhere, by any type of server and the frontend could just hydrate
- that and build components from it.
-
- (BUTTON) 3 likes Like Reply
-
-
- [281]richharris profile image
- [282]Rich Harris
- (BUTTON) Rich Harris
- [283]Rich Harris
- (button) Follow
- I like turtles
- * Location
- Behind you
- * Work
- Graphics editor at the New York Times
- * Joined
- Jun 20, 2019
-
- • [284]May 15 '20
- (BUTTON)
- * [285]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- This is the 'PHP with jQuery sprinkles' approach I mention in the
- article, except with shinier things than PHP and jQuery. I'm not a fan,
- personally.
-
- Phoenix LiveView is an interesting take on the problem, but I suspect
- you hit a limit as to how ambitious your UI can be when deltas have to
- come across web sockets at a consistent 60fps.
-
- (BUTTON) 5 likes Like Reply
-
-
- [286]mrispoli24 profile image
- [287]Mike Rispoli
- (BUTTON) Mike Rispoli
- [288]Mike Rispoli
- (button) Follow
- I'm an award-winning designer, engineer and creative technologist that
- helps daring founders ship valuable software.
- * Location
- New York City
- * Work
- Co-founder & CTO at Cause of a Kind
- * Joined
- Mar 8, 2019
-
- • [289]May 15 '20
- (BUTTON)
- * [290]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- So do you think it’s impossible for a framework to effectively hydrate
- static HTML not rendered by that frameworks specified renderToString
- method?
-
- I really don’t know what these functions do under the hood to allow
- rehydration so I’m just curious if it would be possible and achieve a
- good frame rate.
-
- (BUTTON) 2 likes Like Reply
-
-
- [291]lawwantsin profile image
- [292]Lawrence Whiteside
- (BUTTON) Lawrence Whiteside
- [293]Lawrence Whiteside
- (button) Follow
- I'm a freelance web developer working remotely. Inquire about projects.
- * Location
- Austin, TX
- * Work
- Freelance Web Developer at Self-employeed
- * Joined
- Jun 19, 2019
-
- • [294]May 15 '20
- (BUTTON)
- * [295]Copy link
- *
- * (BUTTON) Hide
- *
- *
- *
-
- Universal Javascript is a need for only Juniors out of Bootcamp. And
- the cost is great. Just learn about parsers and you'll never look at a
- framework or template library ever again. Good on you for jumping on
- how terrible Gatsby is.
-
- (BUTTON) 3 likes Like Reply
-
- [296]View full discussion (98 comments)
-
- [297]Code of Conduct • [298]Report abuse
-
- Are you sure you want to hide this comment? It will become hidden in
- your post, but will still be visible via the comment's [299]permalink.
- [ ]
-
- Hide child comments as well
-
- (BUTTON) Confirm
-
- For further actions, you may consider blocking this person and/or
- [300]reporting abuse
+Subscribe
+pic
+[ ]
+Personal Trusted User
+[59] Create template
+
+Templates let you quickly answer FAQs or store snippets for re-use.
+
+Submit Preview [62]Dismiss
+
+[63] twigman08 profile image
+[64] Chad Smith
+Chad Smith
+[66] [71bd929d-4] Chad Smith
+Follow
+Work with C# all day everyday creating web applications. Huge baseball buff.
+
+ • Location
+ Texas
+ • Education
+ B.S in Computer Science
+ • Joined
+ Dec 17, 2017
+
+• [68] May 15 '20
+
+ • [70]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Honestly my biggest issue with the current state of the web is the current
+state of how complex the tools or build process is.
+
+I miss the days of some html, add a bit of JavaScript to the page and you were
+done. You didn't worry about going and making sure you had a complete build or
+bundling process to get everything good. You spent your time worrying about how
+to develop your app. Which in my opinion was better for the users. There was
+less bugs. We actually spent more time making sure the application worked rock
+solid.
+
+Nowadays to get anything cool to be be ready for production you have spend
+needless time on the configuration. Did you do this? Did you configure it to do
+that? Oh you can't do that unless you eject it that build tool and use this
+build tool. That's where the current state of the web is failing.
+
+Sure we have taken steps forward in some areas. But we have to be honest with
+ourselves. We took major steps back in other areas of the web. Sometimes I
+wonder if we took too many steps back.
+
+61 likes Like [73] Reply
+
+[74] gotofritz profile image
+[75] fritz
+fritz
+[77] [4e77b2fc-1] fritz
+Follow
+
+ • Location
+ Berlin
+ • Joined
+ Sep 28, 2018
+
+• [79] May 18 '20
+
+ • [81]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+I don't get it. Nobody's stopping you from firing up an HTML doc in Notepad and
+FTPing the result to a web server, if that's all you need. But other people
+have more complex needs (in the "good ole days" there were no smart phones, to
+mention just one thing) and therefore we need more complex tools. Why do you
+want to force me to party like it's 1999?
+
+23 likes Like [84] Reply
+
+[85] twigman08 profile image
+[86] Chad Smith
+Chad Smith
+[88] [71bd929d-4] Chad Smith
+Follow
+Work with C# all day everyday creating web applications. Huge baseball buff.
+
+ • Location
+ Texas
+ • Education
+ B.S in Computer Science
+ • Joined
+ Dec 17, 2017
+
+• [90] May 19 '20
+
+ • [92]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+My issue isn't with applications are too complex really. I develop complex
+applications too at work.
+
+My issue is with all the moving parts with a modern web application. Fighting
+if I can use certain language features. Oh I can't, now I have to bother with
+setting up and making sure I can use Babel or something to do it properly, or
+even loading in polyfills (cool just added another dependency the browser has
+to load before the application can be used).
+
+That still hasn't covered bundling everything. What's the correct way bundle
+this? Well crap I now have to go and correctly configure WebPack. Unless you're
+one of the VERY FEW experts on that ,that will take time to figure out to get
+right. Ok so I think it bundles right, well now how should I lazy load this
+code for the user? What should be lazy loaded? What should i use to set it up?
+
+That's just the beginning. I could go on and on about the other complex moving
+parts with a modern web application.
+
+I am not asking anyone to make applications like it is 1999. All I'm asking for
+is a more modern and simpler process that is a STANDARD.
+
+Maybe it is because I come from compiled language background. Where I have to
+worry about that one single binary. I only have to worry if the compiler
+supports the language version I'm using. Where I can just pass in a single flag
+to the compiler for the optimization level I want.
+
+Yes I will be the first to say that in some areas of modern web application
+development we have taken steps forward. I just wonder if we have taken steps
+back in some areas to take those steps forward.
+
+13 likes Like Thread
+
+[95] gotofritz profile image
+[96] fritz
+fritz
+[98] [4e77b2fc-1] fritz
+Follow
+
+ • Location
+ Berlin
+ • Joined
+ Sep 28, 2018
+
+• [100] May 22 '20 • Edited on May 22 • Edited
+
+ • [102]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ All I'm asking for is a more modern and simpler process that is a STANDARD
+ ...
+ Maybe it is because I come from compiled language background ...
+
+Well I am sorry, but web development is a complete different kettle of fish. We
+download all the parts that make up an application asynchronously, on a wide
+variety of devices, with different specs and rendering capabilities - all
+things which the app, once downloaded, need to adapt to. We have progressive
+rendering and respond to all sort of sensors. All while ensuring boot up time
+for the app is in the microseconds range and security for both you who download
+the code and the server.
+
+Your expectations are simply unrealistic, sorry.
+
+Also, we always had polyfills, even "back in the day". Except that back then
+everyone had to bake their own. In fact, we had browser wars and appalling
+browser (IE5 for the Mac, anyone??!?) and it was a real pain in the neck.
+
+10 likes Like [105] Reply
+
+[106] adrianus profile image
+[107] Adrianus
+Adrianus
+[109] [4e6de1e2-6] Adrianus
+Follow
+Running a small company based in Kent.
+
+ • Location
+ Chatham, Kent
+ • Education
+ autodidactic
+ • Work
+ Entrepreneur at AVANDERGRINTEN Ltd.
+ • Joined
+ Jan 21, 2020
+
+• [111] May 19 '20 • Edited on May 20 • Edited
+
+ • [113]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Bingo, the complexity today is a must, at least because of the growing
+smartphone usage. The simple reason why "Native Apps didn't kill the web even
+with all their superior capabilities" (Ryan) is simply UX. As internet usage
+often starts with searching for something having in mind, that all-app-thinking
+interrupts exactly this flow, leaving at least 30% of all traffic untouched.
+For what? For 5-minutes-crafts skyrocketing their YouTube traffic? Although not
+everything needs server side complexity plus having API's and webhooks easily
+integrated using browser capabilities not existing in the god old days, the
+architecture underneath is not the real issue.
+
+3 likes Like [116] Reply
+
+[117] ojrask profile image
+[118] Otto Rask
+Otto Rask
+[120] [f4751361-7] Otto Rask
+Follow
+A software engineer, mainly PHP, Rust, and related things.
+
+ • Location
+ Finland
+ • Joined
+ Mar 12, 2019
+
+• [122] May 28 '21
+
+ • [124]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+You fight complexity with ... more complexity?
+
+1 like Like Thread
+
+[127] gotofritz profile image
+[128] fritz
+fritz
+[130] [4e77b2fc-1] fritz
+Follow
+
+ • Location
+ Berlin
+ • Joined
+ Sep 28, 2018
+
+• [132] May 28 '21
+
+ • [134]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+You are getting it wrong. The aim is not "to fight complexity". The aim is to
+fulfil complex needs. I am saying for that you often need more complex tools.
+
+1 like Like Thread
+
+[137] ojrask profile image
+[138] Otto Rask
+Otto Rask
+[140] [f4751361-7] Otto Rask
+Follow
+A software engineer, mainly PHP, Rust, and related things.
+
+ • Location
+ Finland
+ • Joined
+ Mar 12, 2019
+
+• [142] May 28 '21
+
+ • [144]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+What percentage of modern web is a "complex needs" target that requires a
+complex solution such as React or Vue or perhaps something custom written in
+WASM? 50% 25%? 5% 1%?
+
+2 likes Like Thread
+
+[147] gotofritz profile image
+[148] fritz
+fritz
+[150] [4e77b2fc-1] fritz
+Follow
+
+ • Location
+ Berlin
+ • Joined
+ Sep 28, 2018
+
+• [152] May 28 '21
+
+ • [154]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+All of it. Unless you have actual data that proves otherwise...
+
+2 likes Like Thread
+
+[157] jacobmakestheweb profile image
+[158] Jacob Ybarra
+Jacob Ybarra
+[160] [ea7fc8c6-1] Jacob Ybarra
+Follow
+dank web dev
+
+ • Education
+ school
+ • Work
+ nada
+ • Joined
+ Sep 21, 2021
+
+• [162] Sep 21 '21
+
+ • [164]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+uh what? the web is about content and media. not a software environment.
+
+1 like Like [167] Reply
+
+[168] techbelle profile image
+[169] rachelle palmer
+rachelle palmer
+[171] [16c23058-3] rachelle palmer
+Follow
+I decided I would try to build an app in every programming language. That
+didn't happen, but what I learned along the way was really valuable.
+
+ • Location
+ Raleigh, NC
+ • Joined
+ Sep 23, 2020
+
+• [173] Feb 25 '21
+
+ • [175]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+re: sessions --> I keep tabs open for months at a time, not sure about anyone
+else
+
+1 like Like [178] Reply
+
+[179] mark_saward profile image
+[180] Mark Saward
+Mark Saward
+[182] [2c925970-7] Mark Saward
+Follow
+CEO and Developer | PhD in Philosophy | Some things I like: Linux, Go, Rust,
+SQL, Devops
+
+ • Location
+ Victoria, Australia
+ • Education
+ BA/Bsc in Philosophy and Physics. PhD in Philosophy.
+ • Work
+ CEO/Software Developer at Episub
+ • Joined
+ May 13, 2020
+
+• [184] May 15 '20
+
+ • [186]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Some interesting thoughts, in the original article and your response. Certainly
+good for generating discussion :)
+
+ It will take more than technological advancement to get the web there; it
+ will take a cultural shift as well. But we certainly can't get there if we
+ abandon our current trajectory.
+
+The problem as I see it is that the web -- in terms of client-side executed
+markup and code (HTML/CSS/JavaScript) just wasn't designed with these kinds of
+interactions in mind (the interactions that Ryan Florence highlighted). It's
+the wrong foundation for it.
+
+I don't think that "getting there" should be through bending original web
+technologies, but rather with something else entirely -- perhaps WebAssembly,
+or a return to actual native applications much like we've come to depend on on
+our tablets and phones. We already can do nice animations like that iPad demo
+with native desktop applications. There's many advantages to websites over
+native desktop apps, with the standout one being that they don't require
+someone to install an application on their machine. Maybe WebAssembly can give
+us a compromise -- desktop apps built with technology designed for that job,
+but available in a way that doesn't require any local installation. Then we can
+use tools that were purpose built for those kinds of tasks, instead of trying
+to wrangle the foundations of the web to fit something they were never built
+for.
+
+When I think back to how we used to build websites back in the day, and how we
+build sites with technologies in tools like React now, I'm honestly not sure
+that we've gained anything of great enough value relative to the simplicity
+we've lost. In short, I'd be happy to abandon our current trajectory and put
+our hope in alternative solutions for those situations where what we really
+need is a native application. Leave the web for what it's good at.
+
+23 likes Like [189] Reply
+
+[190] ryansolid profile image
+[191] Ryan Carniato
+Ryan Carniato
+[193] [a3d1cfed-a] Ryan Carniato
+Follow
+Frontend performance enthusiast and Fine-Grained Reactivity super fan. Author
+of the SolidJS UI library and MarkoJS Core Team Member.
+
+ • Location
+ San Jose, California
+ • Education
+ Computer Engineering B.A.Sc, University of British Columbia
+ • Work
+ Principal Engineer, Open Source, Netlify
+ • Joined
+ Jun 25, 2019
+
+• [195] May 15 '20
+
+ • [197]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+That's interesting. I mean I was there too, and the extent of what I can build
+with a modern library so extends what I could reasonably do before. And the
+reason for that is JavaScript. When I was building sites in the late 90s so
+many things weren't possible and you had no choice but to pay these costs for
+interactivity. Sure I view sourced a few cool tricks.. image maps etc, but with
+my table based layouts and a little JavaScript I could do very little. Part of
+it was the available DOM api's. My lack of understanding of the language but I
+think we look at the past with rose colored glasses.
+
+It's more interesting to me that native platforms have borrowed concepts from
+libraries like React in terms of declarative views etc. I'm not saying React
+invented this stuff but that the trend would suggest the contrary. These trends
+could be mistakes but popularity has as much stake in the course of events as
+innate value.
+
+I think this comes down to really this hope of a Silver Bullet. It doesn't
+exist. Instead we have momentum of a ubiquitous platform that just is
+constantly aiming to improve. It's not only that the other approaches have
+already lost, we're getting to a point where any new approach will have to
+atleast acknowledge the current web. At this point a competitor isn't going to
+change the tide, but something from within. It's more likely that the web
+addresses those fundamental shortcomings than people moving to a different
+platform. Native Apps didn't kill the web even with all their superior
+capabilities. And on a similar note it is going to take monumental change for
+this to fundamentally change. Even with React's reach, it wasn't alone in a
+movement that started years before. This is bigger than any particular library
+or framework.
+
+13 likes Like [200] Reply
+
+[201] mark_saward profile image
+[202] Mark Saward
+Mark Saward
+[204] [2c925970-7] Mark Saward
+Follow
+CEO and Developer | PhD in Philosophy | Some things I like: Linux, Go, Rust,
+SQL, Devops
+
+ • Location
+ Victoria, Australia
+ • Education
+ BA/Bsc in Philosophy and Physics. PhD in Philosophy.
+ • Work
+ CEO/Software Developer at Episub
+ • Joined
+ May 13, 2020
+
+• [206] May 16 '20 • Edited on May 16 • Edited
+
+ • [208]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+There is absolutely no doubt that you can do incredible things with modern web,
+and the power unlocked by having a programming language in the browser has been
+amazing. However, when I think about a great deal of the websites I interact
+with, and ones I build, there would not be much lost if they significantly
+simplified the tech stack they work with to be closer to the core technologies
+of the web (including a splash of JavaScript).
+
+What I'm trying to convey is that I think our move to make everything a web app
+has been a mistake, for multiple reasons. You are absolutely right to say that
+this tide is going to be very hard (perhaps impossible) to turn, and I
+absolutely agree there is no silver bullet (I've looked), but that doesn't mean
+we haven't taken a worse path and shouldn't lament for what could have been.
+
+The advantages of web apps are compelling for developers -- they are easy to
+distribute, update, control, make cross platform, when compared to native apps.
+It is not hard to understand why and how we have ended up where we are. I just
+wish we were somewhere else -- but it would take a lot of work to create that
+'silver bullet'.
+
+11 likes Like Thread
+
+[211] adrianus profile image
+[212] Adrianus
+Adrianus
+[214] [4e6de1e2-6] Adrianus
+Follow
+Running a small company based in Kent.
+
+ • Location
+ Chatham, Kent
+ • Education
+ autodidactic
+ • Work
+ Entrepreneur at AVANDERGRINTEN Ltd.
+ • Joined
+ Jan 21, 2020
+
+• [216] May 19 '20 • Edited on May 20 • Edited
+
+ • [218]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+That whole app environment was basically triggered by one need, and one need
+only: bandwidth. No idea if anyone remembers when they launched this WAP
+protocol, making the internet available on smartphones, what failed for two
+reasons. The providers made it easy to access on their own portals aka AOL
+strategy at beginning of the web, leaving the rest of the market untouched,
+secondly the site performance was ridiculous. Apple stepped in, put a bunch of
+intelligence into the app, dramatically reducing the load time, did not convert
+so much traffic on their own apps and let developers do what they do best. By
+2008 more than 50% of the whole mobile internet traffic was iPhone traffic.
+
+Bandwidth is no longer the breaking point.
+
+Google has for years campaigned the untapped goldmine local traffic, experience
+flows that often start at the search for getting something done in time,
+monetising on micro moments as more than half of all mobile searches have a
+local intend. I posted an example how something to get done interferes
+cross-applicational from the perspective of a user. With an app-only scheme
+this is getting impossible. Sure it is understandable that nobody pays so much
+attention. Most search engines run a change and heavily invested in AI to
+optimise traffic at the client's frontend. But even this is not enough, when it
+comes to intends other than something very individualised. I wouldn't care so
+much about the user, but more about what the user wants to achieve.
+
+1 like Like [221] Reply
+
+[222] oenonono profile image
+[223] Junk
+Junk
+[225] [default_pr] Junk
+Follow
+
+ • Joined
+ Mar 12, 2017
+
+• [227] May 17 '20
+
+ • [229]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+React definitely didn't invent HTML.
+
+Declarative views, indeed.
+
+1 like Like [232] Reply
+
+[233] v6 profile image
+[234] 🦄N B🛡
+🦄N B🛡
+[236] [8267c2c7-f] 🦄N B🛡
+Follow
+// , “It is not so important to be serious as it is to be serious about the
+important things. The monkey wears an expression of seriousness... but the
+monkey is serious because he itches."(No/No)
+
+ • Location
+ (No/No)
+ • Education
+ (No/No)
+ • Work
+ Security
+ • Joined
+ Mar 1, 2018
+
+• [238] May 15 '20
+
+ • [240]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ The problem as I see it is that the web -- in terms of client-side executed
+ markup and code (HTML/CSS/JavaScript) just wasn't designed with these kinds
+ of interactions in mind (the interactions that Ryan Florence highlighted).
+ It's the wrong foundation for it.
+
+Yes. Please. Can we please just accept that it's all broken.
+
+4 likes Like [243] Reply
+
+[244] gotofritz profile image
+[245] fritz
+fritz
+[247] [4e77b2fc-1] fritz
+Follow
+
+ • Location
+ Berlin
+ • Joined
+ Sep 28, 2018
+
+• [249] May 18 '20 • Edited on May 18 • Edited
+
+ • [251]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Not at all.
+
+CSS has media queries and all sort of crazy and wonderful stuff. HTML has tags
+for responsive design. JS has (in the browser) access to apis like mutation
+observer and orientation and speech recognition. It's TOTALLY built for that.
+Enough of the "get off my lawn" negativity
+
+8 likes Like Thread
+
+[254] v6 profile image
+[255] 🦄N B🛡
+🦄N B🛡
+[257] [8267c2c7-f] 🦄N B🛡
+Follow
+// , “It is not so important to be serious as it is to be serious about the
+important things. The monkey wears an expression of seriousness... but the
+monkey is serious because he itches."(No/No)
+
+ • Location
+ (No/No)
+ • Education
+ (No/No)
+ • Work
+ Security
+ • Joined
+ Mar 1, 2018
+
+• [259] May 18 '20 • Edited on May 18 • Edited
+
+ • [261]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+shakes his cane at you
+
+mutters incomprehensibly
+
+4 likes Like [264] Reply
+
+[265] holdit profile image
+[266] holdit
+holdit
+[268] [6f8ff7f5-7] holdit
+Follow
+
+ • Joined
+ May 15, 2020
+
+• [270] May 15 '20
+
+ • [272]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Looking at the criticism made about some recent redesigns (reddit, facebook,
+etc) it seems that the main complaint (from a user point of view, at least) is
+how slow it feels compared to the previous version or to a "simple" site with
+HTML, CSS, and a little bit of javascript.
+
+I haven't checked it recently, but when the new reddit UI was released,
+scrolling was terrible on my $2500k laptop. It felt slow. Everything was
+sluggish. It also downloaded a few MB of javascript on pages that essentially
+had a thumbnail, a title, and some comments (not everyone lives in a big city
+or is connected to a super fast internet connection!). When the page was
+loaded, I was seeing more scrolling lag because they lazyload some content. I
+mean, it's hard to like this "modern web".
+
+As a user, I don't care about how things work behind the scenes. I don't mind
+some javascript on a page, after all we don't need a page reload just to
+preview a comment or "like" something. You can even use javascript for
+everything, I don't mind. But it needs to be fast and it needs to work well...
+and right now some "modern" sites provide a worse experience than before.
+
+24 likes Like [275] Reply
+
+[276] iamschulz profile image
+[277] Daniel Schulz
+Daniel Schulz
+[279] [0f4b16d2-a] Daniel Schulz
+Follow
+Hi! I'm a frontend guy.
+
+ • Location
+ Germany
+ • Education
+ Studied Media Art and Design
+ • Work
+ Performance Engineer at Baqend
+ • Joined
+ Sep 17, 2018
+
+• [281] May 15 '20 • Edited on May 15 • Edited
+
+ • [283]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Tom identified the main weakness of modern web development correctly: It's
+based on javascript. He points out the sluggishness and accessibility problems
+that stem from that attitude, and hes absolutely right to do so. Static pages
+(as a paradigm, not as Gatsby in particular) are maybe not the cure for that,
+but they are definitely a step into the right direction.
+I just rewrote my website with hugo and specifically without a major JS
+framework, but settled for a vanilla approach rooted in a progressive
+enhancement mindset. I didn't even run into the problems that are inherent to
+React, Vue and Angular.
+Sure, you can serve HTML with SSR, but you still have to wait for the bundle in
+order to have a functional site, plus a truckload of ssr-related complexity.
+And that is utter rubbish. JS should never be a requirement, it needs to be put
+in its place as the cherry on top of the cake.
+Progressive enhancement needs not only to be a major approach to webdevelopment
+again, it needs to be out default mode of operation.
+This is also the core of Toms article. And I agree with him.
+
+That said, nothing stops you from adding features like nice transitions. But
+please be sure not to break standard web features while doing so.
+Transitions need to add to hyperlinks, not replace them.
+
+21 likes Like [286] Reply
+
+[287] richharris profile image
+[288] Rich Harris
+Rich Harris
+[290] [92d6b6d1-4] Rich Harris
+Follow
+I like turtles
+
+ • Location
+ Behind you
+ • Work
+ Graphics editor at the New York Times
+ • Joined
+ Jun 20, 2019
+
+• [292] May 15 '20
+
+ • [294]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+I feel like you didn't quite read the article closely enough ;) Of course
+progressive enhancement needs to be the default — that's why there's so much
+focus on SSR in all major meta-frameworks.
+
+ Sure, you can serve HTML with SSR, but you still have to wait for the
+ bundle in order to have a functional site
+
+This isn't true! Take [296]sapper.svelte.dev, which is a site built with Sapper
+and baked out as static pages. It works just fine without JavaScript, you just
+don't get client-side routing. It's a small site, but the same thing applies to
+larger ones like Gatsby's homepage — no JS? No problem.
+
+20 likes Like [298] Reply
+
+[299] iamschulz profile image
+[300] Daniel Schulz
+Daniel Schulz
+[302] [0f4b16d2-a] Daniel Schulz
+Follow
+Hi! I'm a frontend guy.
+
+ • Location
+ Germany
+ • Education
+ Studied Media Art and Design
+ • Work
+ Performance Engineer at Baqend
+ • Joined
+ Sep 17, 2018
+
+• [304] May 15 '20
+
+ • [306]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+It certainly is true for standard implementations of React-, Vue- and Angular-
+based sites. There may be a focus on SSR, but it still isn't close enough to
+deserve to be the default. It needs to come without extra complexity. Only then
+we're ready to take the step to fully embrace those solution.
+
+And this is my point. You need to take one step after the other. It was a
+mistake to build everything with javascript first and then try to look if it
+still works without afterwards. The damage to the web has been done.
+
+I didn't take a look at Sapper/Svelte. Though, in comparison, those are still a
+nieche product.
+
+7 likes Like Thread
+
+[309] martinmalinda profile image
+[310] Martin Malinda
+Martin Malinda
+[312] [2ee5ec39-1] Martin Malinda
+Follow
+
+ • Joined
+ Apr 7, 2020
+
+• [314] May 18 '20
+
+ • [316]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ The damage to the web has been done.
+
+JS certainly caused a lot of damage on many websites. But now - finally - we're
+getting to the point of having frameworks which can, by default, offer
+client-side routing with SSR and hydration without shipping large bundles of
+JS. Up to this point the frontend devs should have been more conservative and
+they should have thought twice whether they should really go all-in into an
+SPA. But now's the time when it's really starting to be a viable option. Next,
+Nuxt, Marko and Sapper are finally technologies highly worth pursuing, even for
+content-based websites.
+
+2 likes Like [319] Reply
+
+[320] ben profile image
+[321] Ben Halpern
+Ben Halpern
+[323] [f451a206-1] Ben Halpern
+Follow
+A Canadian software developer who thinks he’s funny.
+
+ • Email
+ [325]ben@forem.com
+ • Location
+ NY
+ • Education
+ Mount Allison University
+ • Pronouns
+ He/him
+ • Work
+ Co-founder at Forem
+ • Joined
+ Dec 27, 2015
+
+• [326] May 15 '20
+
+ • [328]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ The future I want — the future I see — is one with tooling that's
+ accessible to the greatest number of people (including designers), that can
+ intelligently move work between server and client as appropriate, that lets
+ us build experiences that compete with native on UX (yes, even for blogs!),
+ and where upgrading part of a site to 'interactive' or from 'static' to
+ 'dynamic' doesn't involve communication across disparate teams using
+ different technologies. We can only get there by committing to the paradigm
+ Tom critiques — the JavaScript-ish component framework server-rendered SPA.
+ (Better names welcomed.)
+
+I like this takeaway because it's heavy on acknowledging the process behind the
+technology which is often disparate and confusing. Even the most
+well-intentioned and organized dev team is going to get out of wack if
+succeeding with the tooling is experts only. We need to be able to achieve
+great performance, UX and accessibility even under conditions where designers
+do some work, devs pop in some hotfixes here and there, old devs leave with
+some of the knowledge, priorities change, etc.
+
+19 likes Like [331] Reply
+
+[332] v6 profile image
+[333] 🦄N B🛡
+🦄N B🛡
+[335] [8267c2c7-f] 🦄N B🛡
+Follow
+// , “It is not so important to be serious as it is to be serious about the
+important things. The monkey wears an expression of seriousness... but the
+monkey is serious because he itches."(No/No)
+
+ • Location
+ (No/No)
+ • Education
+ (No/No)
+ • Work
+ Security
+ • Joined
+ Mar 1, 2018
+
+• [337] May 15 '20 • Edited on May 15 • Edited
+
+ • [339]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+I like this aspect of Mr. Harris' article, too. It's the first principle of the
+Tao of HashiCorp: [341]Workflows, not Technologies.
+
+ The HashiCorp approach is to focus on the end goal and workflow, rather
+ than the underlying technologies. Software and hardware will evolve and
+ improve, and it is our goal to make adoption of new tooling simple, while
+ still providing the most streamlined user experience possible. Product
+ design starts with an envisioned workflow to achieve a set goal. We then
+ identify existing tools that simplify the workflow. If a sufficient tool
+ does not exist, we step in to build it. This leads to a fundamentally
+ technology-agnostic view — we will use the best technology available to
+ solve the problem. As technologies evolve and better tooling emerges, the
+ ideal workflow is just updated to leverage those technologies. Technologies
+ change, end goals stay the same.
+
+And it's why Sacrificial Architecture appeases the dark ones.
+
+4 likes Like [343] Reply
+
+[344] phlash profile image
+[345] Phil Ashby
+Phil Ashby
+[347] [e6bffa0e-3] Phil Ashby
+Follow
+30+ years of tech, retired from an identity intelligence company, job done! Dev
+community mod - mostly light gardening & weeding out spam :)
+
+ • Location
+ Felixstowe, UK
+ • Education
+ M.Eng (hons) Electronics, MIET, MBCS, AMCIISec, CEH
+ • Pronouns
+ he/him
+ • Work
+ Retired!
+ • Joined
+ Apr 2, 2017
+
+• [349] May 15 '20
+
+ • [351]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Good response, opinions are always worth having, as long as you are prepared to
+discuss/defend/change them! I had a few thoughts on this topic last year in
+response to your good self and web components that I think is worth referring
+back to: [353]dev.to/phlash909/comment/cghl
+
+In essence, the DOM and page model of HTML is a constraint around the outside
+of applications that might be better inverted: I'd like to see browsers that
+support HTML/DOM content if required, but do not constrain devs to always go
+though it. Let's stop thinking of them as HTML rendering engines, and start
+thinking of pre-installed runtimes with excellent web-based application
+management!
+
+We'll want to retain the benefits of dynamic software running on the client
+(native UX, easy architecture changes, no user-install step, etc.), while
+leveraging the effort that goes into making that a portable & safe thing to do
+(common APIs, sandboxes, browsers as the standard runtime for client-side
+applications). We are nearly there with PWAs perhaps? WASM then expands the
+available languages for the runtime, allowing common client/server languages
+and development processes to ease developer adoption. As/when a document needs
+rendering, then HTML/DOM/CSS is there to perform it's proper function, however
+many apps many be better off with a UX library (eg: SDL) or widget set (eg:
+wxWidgets) atop the runtime bindings.
+
+11 likes Like [355] Reply
+
+[356] v6 profile image
+[357] 🦄N B🛡
+🦄N B🛡
+[359] [8267c2c7-f] 🦄N B🛡
+Follow
+// , “It is not so important to be serious as it is to be serious about the
+important things. The monkey wears an expression of seriousness... but the
+monkey is serious because he itches."(No/No)
+
+ • Location
+ (No/No)
+ • Education
+ (No/No)
+ • Work
+ Security
+ • Joined
+ Mar 1, 2018
+
+• [361] May 15 '20
+
+ • [363]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ start thinking of pre-installed runtimes with excellent web-based
+ application management!
+
+If you were to remove the "web-based" part, it'd almost describe the beginning
+of OSes back in the day.
+
+Which is perhaps what they are: The UI part of a vast "operating system" by
+which we access the "applications" of the internet.
+
+4 likes Like [366] Reply
+
+[367] panesofglass profile image
+[368] panesofglass
+panesofglass
+[370] [b5aa0a77-5] panesofglass
+Follow
+
+ • Joined
+ Jul 23, 2020
+
+• [372] Jul 23 '20
+
+ • [374]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+I believe at the point you fundamentally push to render things other than
+markup, you start making a different application. And that is perfectly
+reasonable. I’m frankly surprised how well HTTP has held up to so many use
+cases. I long ago expected to see far more protocols for more kinds of apps,
+but HTTP seems to have solved so many problems well enough that it now hosts
+other protocols.
+
+There are probably more protocols that could be written and hosted on other
+ports. Those would likely address many of these issues in a far better way. I
+just wonder when the industry will pivot back to building protocols and leave
+HTTP well enough alone.
+
+1 like Like [377] Reply
+
+[378] rhymes profile image
+[379] rhymes
+rhymes
+[381] [bfd9a4a5-9] rhymes
+Follow
+Such software as dreams are made on. I mostly rant about performance,
+unnecessary complexity, privacy and data collection.
+
+ • Joined
+ Feb 2, 2017
+
+• [383] Jul 23 '20
+
+ • [385]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+I think we're past that as most recent innovations in the web space are either
+formats or evolutions of HTTP. Why reinvent the wheel if the wheel works well?
+What do you think?
+
+1 like Like Thread
+
+[388] panesofglass profile image
+[389] panesofglass
+panesofglass
+[391] [b5aa0a77-5] panesofglass
+Follow
+
+ • Joined
+ Jul 23, 2020
+
+• [393] Jul 23 '20
+
+ • [395]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+HTTP/3 with QUIC seems like a great improvement, but it is changing HTTP. I
+don’t see why HTTP needs changing for most things. Why not update SMTP or FTP,
+as well? QUIC solves specific problems, and it might be better for those who
+need QUIC for it to have features better suited to their needs.
+
+In some ways, this also feels like the mash of several formats into HTML5 to
+avoid name spacing. While we focus on and champion components within our own
+apps, we continue to avoid and break components in the infrastructure.
+
+Therefore, I think we may see new protocols emerge as the weight of these
+complexities begin to cause problems. That could still be some way off.
+
+1 like Like Thread
+
+[398] rhymes profile image
+[399] rhymes
+rhymes
+[401] [bfd9a4a5-9] rhymes
+Follow
+Such software as dreams are made on. I mostly rant about performance,
+unnecessary complexity, privacy and data collection.
+
+ • Joined
+ Feb 2, 2017
+
+• [403] Jul 23 '20
+
+ • [405]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+I'm not sure it is changing HTTP, it's HTTP over UDP. The protocol is basically
+the same as HTTP/1 and HTTP/2.
+
+ QUIC solves specific problems, and it might be better for those who need
+ QUIC for it to have features better suited to their needs.
+
+QUIC solves a specific problem HTTP has because it sits on top of TCP though,
+basically pipelining
+
+ In some ways, this also feels like the mash of several formats into HTML5
+ to avoid name spacing. While we focus on and champion components within our
+ own apps, we continue to avoid and break components in the infrastructure.
+
+I'm not sure I follow the analogy with HTML5, sorry :( IIRC HTML5 was created
+to stop having to revise HTML as a a single unit and let things evolve at their
+own pace. Same with CSS 3 I guess. I don't think it's the same thing here: HTTP
+/3 is the result of the entire world using HTTP and needing to improve
+performance.
+
+Could they have created a new protocol? Sure, but why break compatibility with
+millions of browsers, proxies, machines, software application and so on that
+understand and function through HTTP? I think the decision to rewrite the
+transport layer to be a smart one.
+
+This doesn't mean that other protocols can't emerge, but it's okay not to throw
+away those that work already
+
+1 like Like [408] Reply
+
+[409] gregfletcher profile image
+[410] Greg Fletcher
+Greg Fletcher
+[412] [60dd3143-5] Greg Fletcher
+Follow
+loop { refactoring() }
+
+ • Work
+ Full Stack at Freelance
+ • Joined
+ Mar 16, 2019
+
+• [414] May 15 '20
+
+ • [416]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Great article!
+
+Doesn't a lot of this disagreement stem from --> "keep the web as it is, coz
+it's fine" vs "let's make it better by making mistakes along the way coz that's
+how software development works"?
+
+14 likes Like [419] Reply
+
+[420] v6 profile image
+[421] 🦄N B🛡
+🦄N B🛡
+[423] [8267c2c7-f] 🦄N B🛡
+Follow
+// , “It is not so important to be serious as it is to be serious about the
+important things. The monkey wears an expression of seriousness... but the
+monkey is serious because he itches."(No/No)
+
+ • Location
+ (No/No)
+ • Education
+ (No/No)
+ • Work
+ Security
+ • Joined
+ Mar 1, 2018
+
+• [425] May 15 '20
+
+ • [427]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+What about making it better by [429]sacrificing it?
+
+We can [430]learn this lesson from Biology, that the best way to avoid
+excessive optimization is the ultimate flexibility: Keeping the option on the
+table to throw out the code, or well abstracted parts of it, and rewrite that
+code or product from scratch.
+
+It's a little known "dark" pattern of Software Design, from the shadows of
+Agile, called "Sacrificial Architecture."
+
+[431]exponential growth isnt kind to architectural decisions
+
+5 likes Like [433] Reply
+
+[434] richharris profile image
+[435] Rich Harris
+Rich Harris
+[437] [92d6b6d1-4] Rich Harris
+Follow
+I like turtles
+
+ • Location
+ Behind you
+ • Work
+ Graphics editor at the New York Times
+ • Joined
+ Jun 20, 2019
+
+• [439] May 15 '20
+
+ • [441]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ Is the Web for applications?
+
+I feel like this question sort of answers itself! Have you heard of Amazon?
+Gmail? Facebook?
+
+13 likes Like [444] Reply
+
+[445] ben profile image
+[446] Ben Halpern
+Ben Halpern
+[448] [f451a206-1] Ben Halpern
+Follow
+A Canadian software developer who thinks he’s funny.
+
+ • Email
+ [450]ben@forem.com
+ • Location
+ NY
+ • Education
+ Mount Allison University
+ • Pronouns
+ He/him
+ • Work
+ Co-founder at Forem
+ • Joined
+ Dec 27, 2015
+
+• [451] May 15 '20
+
+ • [453]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+My perpective: The web is for applications. The web is also for rich documents
+where reading and simple linking can take priority.
+
+And there is an uncanny valley when you the latter is the sensible choice, but
+the former is the approach taken.
+
+And many, the web is whatever Google tells them it is. Is AMP the web?
+
+22 likes Like [456] Reply
+
+[457] rhymes profile image
+[458] rhymes
+rhymes
+[460] [bfd9a4a5-9] rhymes
+Follow
+Such software as dreams are made on. I mostly rant about performance,
+unnecessary complexity, privacy and data collection.
+
+ • Joined
+ Feb 2, 2017
+
+• [462] May 18 '20 • Edited on May 18 • Edited
+
+ • [464]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ It strikes me that the web never was and never will be anything like any
+ other platform for building applications. Whether or not someone wants to
+ turn it into that is their prerogative and any success they have probably
+ will help others build better things. But it ultimately depends on what you
+ want to build and why, and emulating a native application might not always
+ be the best option.
+
+this :-)
+
+5 likes Like [467] Reply
+
+[468] gotofritz profile image
+[469] fritz
+fritz
+[471] [4e77b2fc-1] fritz
+Follow
+
+ • Location
+ Berlin
+ • Joined
+ Sep 28, 2018
+
+• [473] May 22 '20
+
+ • [475]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ We need to have a similar approach in client side frameworks.
+
+No we don't... if the The One True Omniscient God Framework approach that Rails
+developers are constantly pining for was really the best one, then Rails would
+be ruling. It isn't; it peaked in 2012 or thereabouts, knocked off its perch by
+Node, among other technologies. It's a single point of failure and it cannot
+adapt quickly enough to the bewilderingly fast changing environment in which we
+operate.
+
+Alternatively, you can pick one of the two frameworks that follow the model you
+advocate: Ember (actually inspired by Rails) or Angular (more of a C# flavour),
+both of which strive to be a nanny that remove as much as possible the need to
+(god forbid!) make your own decisions or (the horror!) having to learn new
+tools
+
+ If I could have the framework of my dreams ... It would allow me to focus
+ on HTML with a sprinkle of JavaScript.
+
+You may want to consider [477]stimulusjs.org/, which comes from the Rails
+universe (it was created by no other than David Heinemeier Hansson, the Rails
+Superstar) and does exactly what you want
+
+5 likes Like Thread
+
+[479] loilo profile image
+[480] Florian Reuschel
+Florian Reuschel
+[482] [13456f88-0] Florian Reuschel
+Follow
+Web developer (JS, PHP), OSS enthusiast, loves to explain things to beginners
+
+ • Location
+ Karlsruhe, DE
+ • Joined
+ Jan 14, 2017
+
+• [484] May 22 '20
+
+ • [486]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Can confirm that the Stimulus framework works great for that exact use case.
+But if you're used to the more common frameworks, you might quickly miss the
+declarative "give me data, I give you DOM" approach they provide.
+
+I haven't tried it myself yet, but [488]Alpine.js gained some steam lately and
+might be a good middle ground between Stimulus and the "top dogs".
+
+4 likes Like [490] Reply
+
+[491] mattwelke profile image
+[492] Matt Welke
+Matt Welke
+[494] [666b194b-1] Matt Welke
+Follow
+Back end software developer, open source enthusiast.
+
+ • Location
+ Ontario, Canada
+ • Education
+ Seneca College
+ • Work
+ Backend software engineer at DigitalOcean
+ • Joined
+ Aug 16, 2019
+
+• [496] May 27 '20
+
+ • [498]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ writing an Express API requires "old javascript" unless you want to go
+ through the hassle of setting Babel up
+
+Not sure what you mean here. You can use very recent JS features in Node. We
+have async/await, async iteration, ES module imports, and more now. I've never
+felt the need to set up Babel in an Express project.
+
+5 likes Like [501] Reply
+
+[502] mattgperry profile image
+[503] Matt Perry
+Matt Perry
+[505] [f6c730d5-6] Matt Perry
+Follow
+Creator of Framer Motion, Popmotion and Pose
+
+ • Location
+ Amsterdam
+ • Joined
+ May 15, 2020
+
+• [507] May 15 '20
+
+ • [509]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ it's widely understood that if you want 60fps animation, you will likely
+ have to bypass the React update cycle and do things in a more imperative
+ fashion (indeed, this is what libraries like react-spring do)
+
+Probably aside from the article, which I largely agree with, but I think this
+is an odd point to try and make. This is true of any component library that has
+overhead above imperative JS. But there's nothing stopping you from using CSS
+in React, which is all Svelte does anyway.
+
+9 likes Like [512] Reply
+
+[513] richharris profile image
+[514] Rich Harris
+Rich Harris
+[516] [92d6b6d1-4] Rich Harris
+Follow
+I like turtles
+
+ • Location
+ Behind you
+ • Work
+ Graphics editor at the New York Times
+ • Joined
+ Jun 20, 2019
+
+• [518] May 15 '20
+
+ • [520]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Wrong, sorry :)
+
+This isn't a CSS demo: [522]twitter.com/Rich_Harris/status/120...
+
+11 likes Like [524] Reply
+
+[525] daniel15 profile image
+[526] Daniel Lo Nigro
+Daniel Lo Nigro
+[528] [91933] Daniel Lo Nigro
+Follow
+Australian living in the San Francisco Bay Area. Senior Front End Engineer at
+Meta
+
+ • Location
+ San Francisco Bay Area
+ • Education
+ Swinburne University, Australia
+ • Work
+ Senior Front End Engineer at Meta
+ • Joined
+ Jan 11, 2017
+
+• [530] May 15 '20 • Edited on May 15 • Edited
+
+ • [532]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+ We can provide better visual feedback that loading is taking place
+
+I'm not so sure about that... IMO, so many single-page apps get this wrong. The
+native browser loading indicator is still a lot better than many SPAs, and
+unfortunately it's something that can't be triggered from JS (apart from ugly
+hacks like infinitely-loading iframes)
+
+ With the advent of Node, that changed. The fact that we can do server-side
+ rendering and communicate with databases and what-have-you using a language
+ native to the web is a wonderful development.
+
+Server-side JS was a thing looooong before Node. I remember using Microsoft's
+version of JavaScript ("JScript") server-side via Classic ASP in the early
+2000s. The issue back then was that JavaScript just wasn't quite that popular
+yet. ES5 wasn't around yet (it was all ES3), and there was a lack of good
+third-party libraries. But still, it was absolutely in use long before Node
+even existed.
+
+What Node did do was cross-platform support, introduce a module system
+(CommonJS) as standard, and introduced the concept of easily obtaining
+third-party packages via "npm", taking ideas from similar systems like Perl's
+CPAN.
+
+4 likes Like [535] Reply
+
+[536] mrispoli24 profile image
+[537] Mike Rispoli
+Mike Rispoli
+[539] [93acebe4-b] Mike Rispoli
+Follow
+I'm an award-winning designer, engineer and creative technologist that helps
+daring founders ship valuable software.
+
+ • Location
+ New York City
+ • Work
+ Co-founder & CTO at Cause of a Kind
+ • Joined
+ Mar 8, 2019
+
+• [541] May 15 '20
+
+ • [543]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+So one thing I wondered after reading Tom's article and now yours is how you
+feel about modern UI being so tied to node or javascript run times on the
+backend specifically. For instance if you were to be running something in Go
+and Phoenix you could dynamically render HTML on the back end and serve it up
+quite a bit faster that the current SSR environments based in Next or Nuxt or
+Sapper? So essentially somewhat the way Stimulus JS works where you can send
+over static HTML, rendered anywhere, by any type of server and the frontend
+could just hydrate that and build components from it.
+
+3 likes Like [546] Reply
+
+[547] richharris profile image
+[548] Rich Harris
+Rich Harris
+[550] [92d6b6d1-4] Rich Harris
+Follow
+I like turtles
+
+ • Location
+ Behind you
+ • Work
+ Graphics editor at the New York Times
+ • Joined
+ Jun 20, 2019
+
+• [552] May 15 '20
+
+ • [554]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+This is the 'PHP with jQuery sprinkles' approach I mention in the article,
+except with shinier things than PHP and jQuery. I'm not a fan, personally.
+
+Phoenix LiveView is an interesting take on the problem, but I suspect you hit a
+limit as to how ambitious your UI can be when deltas have to come across web
+sockets at a consistent 60fps.
+
+5 likes Like [557] Reply
+
+[558] mrispoli24 profile image
+[559] Mike Rispoli
+Mike Rispoli
+[561] [93acebe4-b] Mike Rispoli
+Follow
+I'm an award-winning designer, engineer and creative technologist that helps
+daring founders ship valuable software.
+
+ • Location
+ New York City
+ • Work
+ Co-founder & CTO at Cause of a Kind
+ • Joined
+ Mar 8, 2019
+
+• [563] May 15 '20
+
+ • [565]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+So do you think it’s impossible for a framework to effectively hydrate static
+HTML not rendered by that frameworks specified renderToString method?
+
+I really don’t know what these functions do under the hood to allow rehydration
+so I’m just curious if it would be possible and achieve a good frame rate.
+
+2 likes Like [568] Reply
+
+[569] vintharas profile image
+[570] Jaime González García
+Jaime González García
+[572] [09d69d89-7] Jaime González García
+Follow
+Senior Software Engineer at Google working on Google Meet 👨💻 Helping
+developers be more awesome 🔥 author, speaker & nerd 🧙🏼♂️ into JavaScript,
+TypeScript, Vim & pixelart ❤️
+
+ • Location
+ Stockholm
+ • Education
+ MsC Telecommunications Engineering
+ • Work
+ Senior Software Engineer at Google
+ • Joined
+ Aug 15, 2018
+
+• [574] May 15 '20
+
+ • [576]Copy link
+ •
+ • Hide
+ •
+ •
+ •
+
+Beautifully written and very inspiring 😀👏👏👏
+
+4 likes Like [579] Reply
+[580] View full discussion (98 comments)
+[581]Code of Conduct • [582]Report abuse
+
+Are you sure you want to hide this comment? It will become hidden in your post,
+but will still be visible via the comment's [586]permalink.
+
+[588][ ]
+
+Hide child comments as well
+
+Confirm
+
+For further actions, you may consider blocking this person and/or [590]
+reporting abuse
Read next
- franciscomendes10866 profile image
+[591]
+tthroo profile image
-Next.js and GraphQL: The Perfect Combination for Full Stack Development
+Build your SaaS landing page in 15 minutes using Mantine
- Francisco Mendes - Jul 1
+TThroo-Dev - Jan 11
- bdbch profile image
+[592]
+tlaloces profile image
-Sharing your Tailwind Configuration between Monorepo Packages
+Authentication example with FastAPI and JWT, is it as easy and straightforward
+as they claim?
- bdbch - Jun 23
+Tlaloc-Es - Jan 11
- desoga profile image
+[593]
+myogeshchavan97 profile image
-How to Fetch Data using the provideHttpClient in Angular
+I Launched The Most Awaited Complete React Course
- deji adesoga - Jul 1
+Yogesh Chavan - Jan 13
- jeetvora331 profile image
+[594]
+ziontutorial profile image
-React Hooks vs Functions made easy
+Build a Dynamic Currency Converter Beginner React Project
- jeetvora331 - Jun 19
+ziontutorial - Jan 11
- [301]Rich Harris
- (button) Follow
- I like turtles
- * Location
- Behind you
- * Work
- Graphics editor at the New York Times
- * Joined
- Jun 20, 2019
+[595] [92d6b6d1-4] Rich Harris
+Follow
+I like turtles
-More from [302]Rich Harris
+ • Location
+ Behind you
+ • Work
+ Graphics editor at the New York Times
+ • Joined
+ Jun 20, 2019
- [303]Stay alert
- #javascript
- [304]A new technique for making responsive, JavaScript-free charts
- #dataviz #svelte #javascript
+More from [597]Rich Harris
- Once suspended, richharris will not be able to comment or publish posts
- until their suspension is removed.
- Note:
- ______________________________________________________________________
- ______________________________________________________________________
- ______________________________________________________________________
- ______________________________________________________________________
+[598] Stay alert
+#javascript
+[599] A new technique for making responsive, JavaScript-free charts
+#dataviz #svelte #javascript
- (BUTTON) Submit & Suspend
+Once suspended, richharris will not be able to comment or publish posts until
+their suspension is removed.
- Once unsuspended, richharris will be able to comment and publish posts
- again.
- Note:
- ______________________________________________________________________
- ______________________________________________________________________
- ______________________________________________________________________
- ______________________________________________________________________
+ [ ]
+ [ ]
+ [ ]
+Note: [ ]
- (BUTTON) Submit & Unsuspend
+Submit & Suspend
- Once unpublished, all posts by richharris will become hidden and only
- accessible to themselves.
+Once unsuspended, richharris will be able to comment and publish posts again.
- If richharris is not suspended, they can still re-publish their posts
- from their dashboard.
+ [ ]
+ [ ]
+ [ ]
+Note: [ ]
- Note:
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- (BUTTON) Unpublish all posts
+Submit & Unsuspend
- Once unpublished, this post will become invisible to the public and
- only accessible to Rich Harris.
+Once unpublished, all posts by richharris will become hidden and only
+accessible to themselves.
- They can still re-publish the post if they are not suspended.
- (BUTTON) Unpublish Post
+If richharris is not suspended, they can still re-publish their posts from
+their dashboard.
- Thanks for keeping DEV Community safe. Here is what you can do to flag
- richharris:
- (*) Make all posts by richharris less visible
+Note:[ ]
- richharris consistently posts content that violates DEV Community's
- code of conduct because it is harassing, offensive or spammy.
- [305]Report other inappropriate conduct
+Unpublish all posts
- (BUTTON) Confirm Flag
+Once unpublished, this post will become invisible to the public and only
+accessible to Rich Harris.
- Unflagging richharris will restore default visibility to their posts.
- (BUTTON) Confirm Unflag
+They can still re-publish the post if they are not suspended.
- [306]DEV Community — A constructive and inclusive social network for
- software developers. With you every step of your journey.
- * [307]Home
- * [308]Listings
- * [309]Podcasts
- * [310]Videos
- * [311]Tags
- * [312]FAQ
- * [313]Forem Shop
- * [314]Sponsors
- * [315]About
- * [316]Contact
- * [317]Guides
- * [318]Software comparisons
+Unpublish Post
- * [319]Code of Conduct
- * [320]Privacy Policy
- * [321]Terms of use
+Thanks for keeping DEV Community safe. Here is what you can do to flag
+richharris:
- Built on [322]Forem — the [323]open source software that powers
- [324]DEV and other inclusive communities.
+[607]( ) Make all posts by richharris less visible
- Made with love and [325]Ruby on Rails. DEV Community © 2016 - 2023.
+richharris consistently posts content that violates DEV Community's code of
+conduct because it is harassing, offensive or spammy.
- DEV Community
+[608] Report other inappropriate conduct
- We're a place where coders share, stay up-to-date and grow their
- careers.
- [326]Log in [327]Create account
+Confirm Flag
-References
+Unflagging richharris will restore default visibility to their posts.
- Visible links:
- 1. https://dev.to/open-search.xml
- 2. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#main-content
- 3. file:///
- 4. file:///enter
- 5. file:///enter?state=new-user
- 6. https://twitter.com/intent/tweet?text="In defense of the modern web" by @Rich_Harris #DEVCommunity https://dev.to/richharris/in-defense-of-the-modern-web-2nia
- 7. https://www.linkedin.com/shareArticle?mini=true&url=https://dev.to/richharris/in-defense-of-the-modern-web-2nia&title=In defense of the modern web&summary=I expect I'll annoy everyone with this post: the anti-JavaScript crusaders, justly aghast at how much...&source=DEV Community
- 8. https://www.reddit.com/submit?url=https://dev.to/richharris/in-defense-of-the-modern-web-2nia&title=In defense of the modern web
- 9. https://news.ycombinator.com/submitlink?u=https://dev.to/richharris/in-defense-of-the-modern-web-2nia&t=In defense of the modern web
- 10. https://www.facebook.com/sharer.php?u=https://dev.to/richharris/in-defense-of-the-modern-web-2nia
- 11. https://toot.kytta.dev/?text=https://dev.to/richharris/in-defense-of-the-modern-web-2nia
- 12. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html
- 13. file:///report-abuse
- 14. file:///richharris
- 15. file:///richharris
- 16. file:///t/javascript
- 17. file:///t/react
- 18. file:///t/svelte
- 19. file:///t/webdev
- 20. https://twitter.com/tmcw
- 21. https://macwright.org/2020/05/10/spa-fatigue.html
- 22. https://twitter.com/tmcw/status/1259600386094030848
- 23. https://www.react-spring.io/
- 24. https://svelte.dev/
- 25. https://macwright.org/2020/05/10/spa-fatigue.html
- 26. https://gatsbyjs.org/
- 27. https://res.cloudinary.com/practicaldev/image/fetch/s--L4S_VLxO--/c_limit,f_auto,fl_progressive,q_auto,w_880/https://user-images.githubusercontent.com/1162160/82001896-43e38b00-962a-11ea-9ae7-bda853a8cec1.png
- 28. https://webpagetest.org/lighthouse.php?test=200515_N4_a92cbdd5b87d402522f710a8d82d2228&run=1
- 29. https://webpagetest.org/easy
- 30. https://dev.to/ryanflorence
- 31. https://twitter.com/intent/tweet?in_reply_to=1186675229621248000
- 32. https://twitter.com/intent/retweet?tweet_id=1186675229621248000
- 33. https://twitter.com/intent/like?tweet_id=1186675229621248000
- 34. https://nextjs.org/
- 35. https://medium.com/@mlrawlings/maybe-you-dont-need-that-spa-f2c659bc7fec
- 36. https://sapper.svelte.dev/
- 37. https://svelte.dev/
- 38. file:///settings/response-templates
- 39. file:///404.html
- 40. https://dev.to/twigman08
- 41. https://dev.to/twigman08
- 42. file:///twigman08
- 43. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j6
- 44. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j6
- 45. https://dev.to/gotofritz
- 46. https://dev.to/gotofritz
- 47. file:///gotofritz
- 48. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gj
- 49. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gj
- 50. https://dev.to/twigman08
- 51. https://dev.to/twigman08
- 52. file:///twigman08
- 53. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ke
- 54. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ke
- 55. https://dev.to/gotofritz
- 56. https://dev.to/gotofritz
- 57. file:///gotofritz
- 58. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paob
- 59. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paob
- 60. https://dev.to/adrianus
- 61. https://dev.to/adrianus
- 62. file:///adrianus
- 63. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6g5
- 64. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6g5
- 65. https://dev.to/techbelle
- 66. https://dev.to/techbelle
- 67. file:///techbelle
- 68. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1bp6j
- 69. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1bp6j
- 70. https://dev.to/ojrask
- 71. https://dev.to/ojrask
- 72. file:///ojrask
- 73. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjh
- 74. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjh
- 75. https://dev.to/gotofritz
- 76. https://dev.to/gotofritz
- 77. file:///gotofritz
- 78. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjk
- 79. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjk
- 80. https://dev.to/ojrask
- 81. https://dev.to/ojrask
- 82. file:///ojrask
- 83. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epn5
- 84. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epn5
- 85. https://dev.to/gotofritz
- 86. https://dev.to/gotofritz
- 87. file:///gotofritz
- 88. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1f04h
- 89. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1f04h
- 90. https://dev.to/jacobmakestheweb
- 91. https://dev.to/jacobmakestheweb
- 92. file:///jacobmakestheweb
- 93. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1i7gc
- 94. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1i7gc
- 95. https://dev.to/mark_saward
- 96. https://dev.to/mark_saward
- 97. file:///mark_saward
- 98. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2k0
- 99. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2k0
- 100. https://dev.to/ryansolid
- 101. https://dev.to/ryansolid
- 102. file:///ryansolid
- 103. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p369
- 104. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p369
- 105. https://dev.to/mark_saward
- 106. https://dev.to/mark_saward
- 107. file:///mark_saward
- 108. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p3b8
- 109. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p3b8
- 110. https://dev.to/adrianus
- 111. https://dev.to/adrianus
- 112. file:///adrianus
- 113. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ka
- 114. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ka
- 115. https://dev.to/oenonono
- 116. https://dev.to/oenonono
- 117. file:///oenonono
- 118. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p4hk
- 119. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p4hk
- 120. https://dev.to/v6
- 121. https://dev.to/v6
- 122. file:///v6
- 123. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34a
- 124. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34a
- 125. https://dev.to/gotofritz
- 126. https://dev.to/gotofritz
- 127. file:///gotofritz
- 128. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gf
- 129. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gf
- 130. https://dev.to/v6
- 131. https://dev.to/v6
- 132. file:///v6
- 133. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5lf
- 134. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5lf
- 135. https://dev.to/stew_sims
- 136. https://dev.to/stew_sims
- 137. file:///stew_sims
- 138. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2kj
- 139. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2kj
- 140. https://dev.to/rhymes
- 141. https://dev.to/rhymes
- 142. file:///rhymes
- 143. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6cm
- 144. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6cm
- 145. https://dev.to/oenonono
- 146. https://dev.to/oenonono
- 147. file:///oenonono
- 148. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p4hm
- 149. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p4hm
- 150. https://dev.to/holdit
- 151. https://dev.to/holdit
- 152. file:///holdit
- 153. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p4
- 154. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p4
- 155. https://dev.to/iamschulz
- 156. https://dev.to/iamschulz
- 157. file:///iamschulz
- 158. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2hk
- 159. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2hk
- 160. https://dev.to/richharris
- 161. https://dev.to/richharris
- 162. file:///richharris
- 163. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i2
- 164. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i2
- 165. https://sapper.svelte.dev/
- 166. https://dev.to/iamschulz
- 167. https://dev.to/iamschulz
- 168. file:///iamschulz
- 169. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2id
- 170. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2id
- 171. https://dev.to/martinmalinda
- 172. https://dev.to/martinmalinda
- 173. file:///martinmalinda
- 174. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5d6
- 175. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5d6
- 176. https://dev.to/ben
- 177. https://dev.to/ben
- 178. file:///ben
- 179. mailto:ben@forem.com
- 180. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2jk
- 181. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2jk
- 182. https://dev.to/v6
- 183. https://dev.to/v6
- 184. file:///v6
- 185. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34f
- 186. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34f
- 187. https://www.hashicorp.com/tao-of-hashicorp#workflows,-not-technologies
- 188. https://dev.to/phlash
- 189. https://dev.to/phlash
- 190. file:///phlash
- 191. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j3
- 192. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j3
- 193. https://dev.to/phlash909/comment/cghl
- 194. https://dev.to/v6
- 195. https://dev.to/v6
- 196. file:///v6
- 197. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p348
- 198. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p348
- 199. https://dev.to/panesofglass
- 200. https://dev.to/panesofglass
- 201. file:///panesofglass
- 202. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d20
- 203. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d20
- 204. https://dev.to/rhymes
- 205. https://dev.to/rhymes
- 206. file:///rhymes
- 207. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d40
- 208. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d40
- 209. https://dev.to/panesofglass
- 210. https://dev.to/panesofglass
- 211. file:///panesofglass
- 212. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12dc2
- 213. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12dc2
- 214. https://dev.to/rhymes
- 215. https://dev.to/rhymes
- 216. file:///rhymes
- 217. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12df6
- 218. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12df6
- 219. https://dev.to/gregfletcher
- 220. https://dev.to/gregfletcher
- 221. file:///gregfletcher
- 222. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j2
- 223. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j2
- 224. https://dev.to/v6
- 225. https://dev.to/v6
- 226. file:///v6
- 227. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34d
- 228. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34d
- 229. https://martinfowler.com/bliki/SacrificialArchitecture.html
- 230. https://youtu.be/oKg1hTOQXoY?t=1754
- 231. https://res.cloudinary.com/practicaldev/image/fetch/s--KIKmJfBA--/c_limit,f_auto,fl_progressive,q_66,w_880/https://dev-to-uploads.s3.amazonaws.com/i/5ehz4jt3d7skefmuwg6d.gif
- 232. https://dev.to/richharris
- 233. https://dev.to/richharris
- 234. file:///richharris
- 235. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n0
- 236. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n0
- 237. https://dev.to/ben
- 238. https://dev.to/ben
- 239. file:///ben
- 240. mailto:ben@forem.com
- 241. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2nd
- 242. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2nd
- 243. https://dev.to/gotofritz
- 244. https://dev.to/gotofritz
- 245. file:///gotofritz
- 246. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paom
- 247. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paom
- 248. https://stimulusjs.org/
- 249. https://dev.to/loilo
- 250. https://dev.to/loilo
- 251. file:///loilo
- 252. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pb3c
- 253. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pb3c
- 254. https://github.com/alpinejs/alpine
- 255. https://dev.to/mattwelke
- 256. https://dev.to/mattwelke
- 257. file:///mattwelke
- 258. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pg9g
- 259. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pg9g
- 260. https://dev.to/mattgperry
- 261. https://dev.to/mattgperry
- 262. file:///mattgperry
- 263. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i0
- 264. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i0
- 265. https://dev.to/richharris
- 266. https://dev.to/richharris
- 267. file:///richharris
- 268. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2je
- 269. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2je
- 270. https://twitter.com/Rich_Harris/status/1200807516529147904
- 271. https://dev.to/daniel15
- 272. https://dev.to/daniel15
- 273. file:///daniel15
- 274. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n6
- 275. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n6
- 276. https://dev.to/mrispoli24
- 277. https://dev.to/mrispoli24
- 278. file:///mrispoli24
- 279. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2kc
- 280. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2kc
- 281. https://dev.to/richharris
- 282. https://dev.to/richharris
- 283. file:///richharris
- 284. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p5
- 285. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p5
- 286. https://dev.to/mrispoli24
- 287. https://dev.to/mrispoli24
- 288. file:///mrispoli24
- 289. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p35p
- 290. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p35p
- 291. https://dev.to/lawwantsin
- 292. https://dev.to/lawwantsin
- 293. file:///lawwantsin
- 294. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i8
- 295. https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i8
- 296. file:///richharris/in-defense-of-the-modern-web-2nia/comments
- 297. file:///code-of-conduct
- 298. file:///report-abuse
- 299. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html
- 300. file:///report-abuse
- 301. file:///richharris
- 302. file:///richharris
- 303. file:///richharris/stay-alert-d
- 304. file:///richharris/a-new-technique-for-making-responsive-javascript-free-charts-gmp
- 305. javascript:void(0);
- 306. file:///
- 307. file:///
- 308. file:///listings
- 309. file:///pod
- 310. file:///videos
- 311. file:///tags
- 312. file:///faq
- 313. https://shop.forem.com/
- 314. file:///sponsorships
- 315. file:///about
- 316. file:///contact
- 317. file:///guides
- 318. file:///software-comparisons
- 319. file:///code-of-conduct
- 320. file:///privacy
- 321. file:///terms
- 322. https://www.forem.com/
- 323. https://dev.to/t/opensource
- 324. https://dev.to/
- 325. https://dev.to/t/rails
- 326. file:///enter
- 327. file:///enter?state=new-user
+Confirm Unflag
- Hidden links:
- 329. file://localhost/search
- 330. file://localhost/richharris/in-defense-of-the-modern-web-2nia?comments_sort=top#toggle-comments-sort-dropdown
- 331. file://localhost/richharris/in-defense-of-the-modern-web-2nia?comments_sort=latest#toggle-comments-sort-dropdown
- 332. file://localhost/richharris/in-defense-of-the-modern-web-2nia?comments_sort=oldest#toggle-comments-sort-dropdown
- 333. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2j6
- 334. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p5gj
- 335. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/paob
- 336. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p6g5
- 337. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/1bp6j
- 338. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/1i7gc
- 339. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2k0
- 340. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p369
- 341. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p7ka
- 342. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p4hk
- 343. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p34a
- 344. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p5lf
- 345. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2kj
- 346. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p6cm
- 347. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p4hm
- 348. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2p4
- 349. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2hk
- 350. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2i2
- 351. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p5d6
- 352. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2jk
- 353. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p34f
- 354. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2j3
- 355. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p348
- 356. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/12d20
- 357. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/12df6
- 358. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2j2
- 359. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p34d
- 360. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2n0
- 361. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2nd
- 362. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/pb3c
- 363. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/pg9g
- 364. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2i0
- 365. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2je
- 366. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2n6
- 367. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2kc
- 368. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2p5
- 369. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p35p
- 370. file://localhost/var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L12384-4857TMP.html#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2i8
- 371. file://localhost/franciscomendes10866/nextjs-and-graphql-the-perfect-combination-for-full-stack-development-18l7
- 372. file://localhost/bdbch/sharing-your-tailwind-configuration-between-monorepo-packages-4o5k
- 373. file://localhost/this-is-angular/how-to-fetch-data-using-the-providehttpclient-in-angular-5h47
- 374. file://localhost/jeetvora331/react-hooks-vs-functions-made-easy-2g2l
+[611]DEV Community — A constructive and inclusive social network for software
+developers. With you every step of your journey.
+
+ • [612] Home
+ • [613] Podcasts
+ • [614] Videos
+ • [615] Tags
+ • [616] FAQ
+ • [617] Forem Shop
+ • [618] Advertise on DEV
+ • [619] About
+ • [620] Contact
+ • [621] Guides
+ • [622] Software comparisons
+
+ • [623] Code of Conduct
+ • [624] Privacy Policy
+ • [625] Terms of use
+
+Built on [626]Forem — the [627]open source software that powers [628]DEV and
+other inclusive communities.
+
+Made with love and [629]Ruby on Rails. DEV Community © 2016 - 2024.
+
+DEV Community
+
+We're a place where coders share, stay up-to-date and grow their careers.
+
+[630] Log in [631] Create account
+● ● ● ● ●
+
+References:
+
+[1] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#main-content
+[3] https://dev.to/
+[6] https://dev.to/search
+[7] https://dev.to/enter
+[8] https://dev.to/enter?state=new-user
+[20] https://twitter.com/intent/tweet?text=%22In%20defense%20of%20the%20modern%20web%22%20by%20%40Rich_Harris%20%23DEVCommunity%20https%3A%2F%2Fdev.to%2Frichharris%2Fin-defense-of-the-modern-web-2nia
+[21] https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fdev.to%2Frichharris%2Fin-defense-of-the-modern-web-2nia&title=In%20defense%20of%20the%20modern%20web&summary=I%20expect%20I%27ll%20annoy%20everyone%20with%20this%20post%3A%20the%20anti-JavaScript%20crusaders%2C%20justly%20aghast%20at%20how%20much...&source=DEV%20Community
+[22] https://www.reddit.com/submit?url=https%3A%2F%2Fdev.to%2Frichharris%2Fin-defense-of-the-modern-web-2nia&title=In%20defense%20of%20the%20modern%20web
+[23] https://news.ycombinator.com/submitlink?u=https%3A%2F%2Fdev.to%2Frichharris%2Fin-defense-of-the-modern-web-2nia&t=In%20defense%20of%20the%20modern%20web
+[24] https://www.facebook.com/sharer.php?u=https%3A%2F%2Fdev.to%2Frichharris%2Fin-defense-of-the-modern-web-2nia
+[25] https://toot.kytta.dev/?text=https%3A%2F%2Fdev.to%2Frichharris%2Fin-defense-of-the-modern-web-2nia
+[26] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#
+[27] https://dev.to/report-abuse
+[28] https://dev.to/richharris
+[29] https://dev.to/richharris
+[30] https://dev.to/t/javascript
+[31] https://dev.to/t/react
+[32] https://dev.to/t/svelte
+[33] https://dev.to/t/webdev
+[34] https://twitter.com/tmcw
+[35] https://macwright.org/2020/05/10/spa-fatigue.html
+[36] https://twitter.com/tmcw/status/1259600386094030848
+[37] https://www.react-spring.io/
+[38] https://svelte.dev/
+[39] https://macwright.org/2020/05/10/spa-fatigue.html
+[40] https://gatsbyjs.org/
+[41] https://res.cloudinary.com/practicaldev/image/fetch/s--L4S_VLxO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1162160/82001896-43e38b00-962a-11ea-9ae7-bda853a8cec1.png
+[42] https://webpagetest.org/lighthouse.php?test=200515_N4_a92cbdd5b87d402522f710a8d82d2228&run=1
+[43] https://webpagetest.org/easy
+[44] https://dev.to/ryanflorence
+[45] https://twitter.com/intent/tweet?in_reply_to=1186675229621248000
+[46] https://twitter.com/intent/retweet?tweet_id=1186675229621248000
+[47] https://twitter.com/intent/like?tweet_id=1186675229621248000
+[48] https://nextjs.org/
+[49] https://medium.com/@mlrawlings/maybe-you-dont-need-that-spa-f2c659bc7fec
+[50] https://sapper.svelte.dev/
+[51] https://svelte.dev/
+[59] https://dev.to/settings/response-templates
+[62] https://dev.to/404.html
+[63] https://dev.to/twigman08
+[64] https://dev.to/twigman08
+[66] https://dev.to/twigman08
+[68] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j6
+[70] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j6
+[73] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2j6
+[74] https://dev.to/gotofritz
+[75] https://dev.to/gotofritz
+[77] https://dev.to/gotofritz
+[79] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gj
+[81] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gj
+[84] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p5gj
+[85] https://dev.to/twigman08
+[86] https://dev.to/twigman08
+[88] https://dev.to/twigman08
+[90] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ke
+[92] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ke
+[95] https://dev.to/gotofritz
+[96] https://dev.to/gotofritz
+[98] https://dev.to/gotofritz
+[100] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paob
+[102] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paob
+[105] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/paob
+[106] https://dev.to/adrianus
+[107] https://dev.to/adrianus
+[109] https://dev.to/adrianus
+[111] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6g5
+[113] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6g5
+[116] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p6g5
+[117] https://dev.to/ojrask
+[118] https://dev.to/ojrask
+[120] https://dev.to/ojrask
+[122] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjh
+[124] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjh
+[127] https://dev.to/gotofritz
+[128] https://dev.to/gotofritz
+[130] https://dev.to/gotofritz
+[132] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjk
+[134] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epjk
+[137] https://dev.to/ojrask
+[138] https://dev.to/ojrask
+[140] https://dev.to/ojrask
+[142] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epn5
+[144] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1epn5
+[147] https://dev.to/gotofritz
+[148] https://dev.to/gotofritz
+[150] https://dev.to/gotofritz
+[152] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1f04h
+[154] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1f04h
+[157] https://dev.to/jacobmakestheweb
+[158] https://dev.to/jacobmakestheweb
+[160] https://dev.to/jacobmakestheweb
+[162] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1i7gc
+[164] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1i7gc
+[167] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/1i7gc
+[168] https://dev.to/techbelle
+[169] https://dev.to/techbelle
+[171] https://dev.to/techbelle
+[173] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1bp6j
+[175] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-1bp6j
+[178] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/1bp6j
+[179] https://dev.to/mark_saward
+[180] https://dev.to/mark_saward
+[182] https://dev.to/mark_saward
+[184] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2k0
+[186] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2k0
+[189] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2k0
+[190] https://dev.to/ryansolid
+[191] https://dev.to/ryansolid
+[193] https://dev.to/ryansolid
+[195] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p369
+[197] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p369
+[200] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p369
+[201] https://dev.to/mark_saward
+[202] https://dev.to/mark_saward
+[204] https://dev.to/mark_saward
+[206] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p3b8
+[208] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p3b8
+[211] https://dev.to/adrianus
+[212] https://dev.to/adrianus
+[214] https://dev.to/adrianus
+[216] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ka
+[218] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p7ka
+[221] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p7ka
+[222] https://dev.to/oenonono
+[223] https://dev.to/oenonono
+[225] https://dev.to/oenonono
+[227] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p4hk
+[229] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p4hk
+[232] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p4hk
+[233] https://dev.to/v6
+[234] https://dev.to/v6
+[236] https://dev.to/v6
+[238] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34a
+[240] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34a
+[243] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p34a
+[244] https://dev.to/gotofritz
+[245] https://dev.to/gotofritz
+[247] https://dev.to/gotofritz
+[249] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gf
+[251] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5gf
+[254] https://dev.to/v6
+[255] https://dev.to/v6
+[257] https://dev.to/v6
+[259] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5lf
+[261] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5lf
+[264] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p5lf
+[265] https://dev.to/holdit
+[266] https://dev.to/holdit
+[268] https://dev.to/holdit
+[270] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p4
+[272] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p4
+[275] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2p4
+[276] https://dev.to/iamschulz
+[277] https://dev.to/iamschulz
+[279] https://dev.to/iamschulz
+[281] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2hk
+[283] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2hk
+[286] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2hk
+[287] https://dev.to/richharris
+[288] https://dev.to/richharris
+[290] https://dev.to/richharris
+[292] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i2
+[294] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i2
+[296] https://sapper.svelte.dev/
+[298] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2i2
+[299] https://dev.to/iamschulz
+[300] https://dev.to/iamschulz
+[302] https://dev.to/iamschulz
+[304] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2id
+[306] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2id
+[309] https://dev.to/martinmalinda
+[310] https://dev.to/martinmalinda
+[312] https://dev.to/martinmalinda
+[314] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5d6
+[316] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p5d6
+[319] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p5d6
+[320] https://dev.to/ben
+[321] https://dev.to/ben
+[323] https://dev.to/ben
+[325] mailto:ben@forem.com
+[326] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2jk
+[328] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2jk
+[331] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2jk
+[332] https://dev.to/v6
+[333] https://dev.to/v6
+[335] https://dev.to/v6
+[337] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34f
+[339] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34f
+[341] https://www.hashicorp.com/tao-of-hashicorp#workflows,-not-technologies
+[343] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p34f
+[344] https://dev.to/phlash
+[345] https://dev.to/phlash
+[347] https://dev.to/phlash
+[349] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j3
+[351] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j3
+[353] https://dev.to/phlash909/comment/cghl
+[355] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2j3
+[356] https://dev.to/v6
+[357] https://dev.to/v6
+[359] https://dev.to/v6
+[361] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p348
+[363] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p348
+[366] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p348
+[367] https://dev.to/panesofglass
+[368] https://dev.to/panesofglass
+[370] https://dev.to/panesofglass
+[372] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d20
+[374] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d20
+[377] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/12d20
+[378] https://dev.to/rhymes
+[379] https://dev.to/rhymes
+[381] https://dev.to/rhymes
+[383] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d40
+[385] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12d40
+[388] https://dev.to/panesofglass
+[389] https://dev.to/panesofglass
+[391] https://dev.to/panesofglass
+[393] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12dc2
+[395] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12dc2
+[398] https://dev.to/rhymes
+[399] https://dev.to/rhymes
+[401] https://dev.to/rhymes
+[403] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12df6
+[405] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-12df6
+[408] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/12df6
+[409] https://dev.to/gregfletcher
+[410] https://dev.to/gregfletcher
+[412] https://dev.to/gregfletcher
+[414] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j2
+[416] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2j2
+[419] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2j2
+[420] https://dev.to/v6
+[421] https://dev.to/v6
+[423] https://dev.to/v6
+[425] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34d
+[427] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p34d
+[429] https://martinfowler.com/bliki/SacrificialArchitecture.html
+[430] https://youtu.be/oKg1hTOQXoY?t=1754
+[431] https://res.cloudinary.com/practicaldev/image/fetch/s--KIKmJfBA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5ehz4jt3d7skefmuwg6d.gif
+[433] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p34d
+[434] https://dev.to/richharris
+[435] https://dev.to/richharris
+[437] https://dev.to/richharris
+[439] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n0
+[441] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n0
+[444] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2n0
+[445] https://dev.to/ben
+[446] https://dev.to/ben
+[448] https://dev.to/ben
+[450] mailto:ben@forem.com
+[451] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2nd
+[453] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2nd
+[456] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2nd
+[457] https://dev.to/rhymes
+[458] https://dev.to/rhymes
+[460] https://dev.to/rhymes
+[462] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6cm
+[464] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p6cm
+[467] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p6cm
+[468] https://dev.to/gotofritz
+[469] https://dev.to/gotofritz
+[471] https://dev.to/gotofritz
+[473] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paom
+[475] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-paom
+[477] https://stimulusjs.org/
+[479] https://dev.to/loilo
+[480] https://dev.to/loilo
+[482] https://dev.to/loilo
+[484] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pb3c
+[486] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pb3c
+[488] https://github.com/alpinejs/alpine
+[490] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/pb3c
+[491] https://dev.to/mattwelke
+[492] https://dev.to/mattwelke
+[494] https://dev.to/mattwelke
+[496] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pg9g
+[498] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-pg9g
+[501] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/pg9g
+[502] https://dev.to/mattgperry
+[503] https://dev.to/mattgperry
+[505] https://dev.to/mattgperry
+[507] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i0
+[509] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2i0
+[512] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2i0
+[513] https://dev.to/richharris
+[514] https://dev.to/richharris
+[516] https://dev.to/richharris
+[518] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2je
+[520] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2je
+[522] https://twitter.com/Rich_Harris/status/1200807516529147904
+[524] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2je
+[525] https://dev.to/daniel15
+[526] https://dev.to/daniel15
+[528] https://dev.to/daniel15
+[530] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n6
+[532] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2n6
+[535] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2n6
+[536] https://dev.to/mrispoli24
+[537] https://dev.to/mrispoli24
+[539] https://dev.to/mrispoli24
+[541] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2kc
+[543] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2kc
+[546] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2kc
+[547] https://dev.to/richharris
+[548] https://dev.to/richharris
+[550] https://dev.to/richharris
+[552] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p5
+[554] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2p5
+[557] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2p5
+[558] https://dev.to/mrispoli24
+[559] https://dev.to/mrispoli24
+[561] https://dev.to/mrispoli24
+[563] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p35p
+[565] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p35p
+[568] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p35p
+[569] https://dev.to/vintharas
+[570] https://dev.to/vintharas
+[572] https://dev.to/vintharas
+[574] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2hp
+[576] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#comment-p2hp
+[579] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#/richharris/in-defense-of-the-modern-web-2nia/comments/new/p2hp
+[580] https://dev.to/richharris/in-defense-of-the-modern-web-2nia/comments
+[581] https://dev.to/code-of-conduct
+[582] https://dev.to/report-abuse
+[586] https://dev.to/richharris/in-defense-of-the-modern-web-2nia#
+[590] https://dev.to/report-abuse
+[591] https://dev.to/tthroo/build-your-saas-landing-page-in-15-minutes-using-mantine-111a
+[592] https://dev.to/tlaloces/authentication-example-with-fastapi-and-jwt-is-it-as-easy-and-straightforward-as-they-claim-16m1
+[593] https://dev.to/myogeshchavan97/i-launched-the-most-awaited-complete-react-course-1efe
+[594] https://dev.to/ziontutorial/build-a-dynamic-currency-converter-beginner-react-project-5cb8
+[595] https://dev.to/richharris
+[597] https://dev.to/richharris
+[598] https://dev.to/richharris/stay-alert-d
+[599] https://dev.to/richharris/a-new-technique-for-making-responsive-javascript-free-charts-gmp
+[608] javascript:void(0);
+[611] https://dev.to/
+[612] https://dev.to/
+[613] https://dev.to/pod
+[614] https://dev.to/videos
+[615] https://dev.to/tags
+[616] https://dev.to/faq
+[617] https://shop.forem.com/
+[618] https://dev.to/advertise
+[619] https://dev.to/about
+[620] https://dev.to/contact
+[621] https://dev.to/guides
+[622] https://dev.to/software-comparisons
+[623] https://dev.to/code-of-conduct
+[624] https://dev.to/privacy
+[625] https://dev.to/terms
+[626] https://www.forem.com/
+[627] https://dev.to/t/opensource
+[628] https://dev.to/
+[629] https://dev.to/t/rails
+[630] https://dev.to/enter
+[631] https://dev.to/enter?state=new-user
diff --git a/static/archive/edmtips-com-05su6g.txt b/static/archive/edmtips-com-05su6g.txt
index 4e8dc83..9a87737 100644
--- a/static/archive/edmtips-com-05su6g.txt
+++ b/static/archive/edmtips-com-05su6g.txt
@@ -1,622 +1,619 @@
- [tr?id=279433711742018&ev=PageView&noscript=1] #[1]EDM Tips » EDM Song
- Structure: Arrange Your Loop into a Full Song Comments Feed
- [2]alternate [3]alternate [4]alternate
+*
+*
+[1] EDM Tips
+
- IFRAME: [5]https://www.googletagmanager.com/ns.html?id=GTM-N5SBWB6
+ • [2]FREE
+ • [3]COURSES
+ • [4]BLOG
+ • [5]JOIN
+ • [6]LOGIN
+ • Search
+ [7][ ] [8][ ] [9][SUBMIT]
+ More results...
- [6]EDM Tips
-
-
- * [7]FREE
- * [8]COURSES
- * [9]BLOG
- * [10]JOIN
- * [11]LOGIN
- * Search
- ____________________ ____________________ Submit
- More results...
-
- [ ]
- [X]
- [X]
- [X]
- [ ]
-
- Filter by Custom Post Type
-
- [X]
+ [12][ ]
+ [13][*]
+ [14][*]
+ [15][*]
+ [16][ ]
+ Filter by Custom Post Type
+ [17][*]
EDM Song Structure: Arrange Your Loop into a Full Song
- [12]6 Comments
+[18] 6 Comments
+[19]Share33
+[20]Tweet
+33 Shares
- [13]Share33
- [14]Tweet
- 33 Shares
+So you’ve created a killer 8-bar loop and want to take your great idea to a
+full song, but don’t know where to go from here? We’ve all been there before!
- So you’ve created a killer 8-bar loop and want to take your great idea
- to a full song, but don’t know where to go from here? We’ve all been
- there before!
+The good news is that you don’t need to feel disheartened: this is a super
+common problem that happens to all music producers, and thankfully there are
+some very straightforward steps you can take to get out of the loop and to a
+finished arrangement….
- The good news is that you don’t need to feel disheartened: this is a
- super common problem that happens to all music producers, and
- thankfully there are some very straightforward steps you can take to
- get out of the loop and to a finished arrangement….
+We get stuck because it can be very difficult to imagine each individual
+section of a track before it exists. So, how do we fix this?
+
+Start 2022 the right way! Download your FREE “New Producer Starter Pack” here.
+
+Let’s look into EDM song structure, and use that knowledge as a template for
+our own tracks almost like one of those Paint-by-Numbers books. If you use the
+techniques outlined below, you’ll be writing full tracks and streamlining your
+workflow in no time!
- We get stuck because it can be very difficult to imagine each
- individual section of a track before it exists. So, how do we fix
- this?
- Start 2022 the right way! Download your FREE “New Producer Starter
- Pack” here.
- Let’s look into EDM song structure, and use that knowledge as a
- template for our own tracks almost like one of those Paint-by-Numbers
- books. If you use the techniques outlined below, you’ll be writing full
- tracks and streamlining your workflow in no time!
- IFRAME:
- [15]https://www.youtube.com/embed/EXx9At3iUOw?feature=oembed&iv_load_po
- licy=3&modestbranding=1&rel=0&autohide=1&playsinline=0&autoplay=0
EDM Song Structure
- So what exactly are the benefits of learning EDM song structure? Well,
- for one, by learning the common ways in which other artists create and
- sculpt their songs, we can use that as a template for when we get stuck
- in creating our own music.
+So what exactly are the benefits of learning EDM song structure? Well, for one,
+by learning the common ways in which other artists create and sculpt their
+songs, we can use that as a template for when we get stuck in creating our own
+music.
- Additionally, using known song structures helps increase relatability
- and appeal to a wider audience. The practice of purposely arranging
- your music in a carefully crafted way is called arrangement, and is
- used in all types of music – not just Electronic Dance Music.
+Additionally, using known song structures helps increase relatability and
+appeal to a wider audience. The practice of purposely arranging your music in a
+carefully crafted way is called arrangement, and is used in all types of music
+– not just Electronic Dance Music.
- In most Electronic Dance Music genres, your track will be in 4/4 time.
- This means that in every bar (also known as a measure), there will be 4
- beats, and that the quarter note (the kick on every beat), will carry
- the song.
+In most Electronic Dance Music genres, your track will be in 4/4 time. This
+means that in every bar (also known as a measure), there will be 4 beats, and
+that the quarter note (the kick on every beat), will carry the song.
- In this format, a bar is 4 beats, and a musical phrase is usually a
- multiple of 2 or 4 bars. In music theory, a phrase is generally just a
- grouping of bars whose energy flows nicely. For example, your build
- might contain two separate phrases; one that first hints at the melody
- followed by a second that introduces a snare or clap build up.
+In this format, a bar is 4 beats, and a musical phrase is usually a multiple of
+2 or 4 bars. In music theory, a phrase is generally just a grouping of bars
+whose energy flows nicely. For example, your build might contain two separate
+phrases; one that first hints at the melody followed by a second that
+introduces a snare or clap build up.
- Phrases build up, take down, or play around with the energy of a
- section of your track to build interest, and create and release
- tension.
+Phrases build up, take down, or play around with the energy of a section of
+your track to build interest, and create and release tension.
- However, let’s take a step back and see what the main overall sections
- of an EDM song structure are.
+However, let’s take a step back and see what the main overall sections of an
+EDM song structure are.
- They are as follows:
- * Intro
- * Verse
- * Build up
- * Drop
+They are as follows:
- Each of these distinct sections contains elements of your loop
- simplified, modified, or generally expanded upon. Knowing what makes up
- these sections and how they’re crafted is at the heart of how you
- transform your loop into a full-fledged song.
+ • Intro
+ • Verse
+ • Build up
+ • Drop
- Now, let’s see a rundown of which elements each section usually
- contains.
+Each of these distinct sections contains elements of your loop simplified,
+modified, or generally expanded upon. Knowing what makes up these sections and
+how they’re crafted is at the heart of how you transform your loop into a
+full-fledged song.
+
+Now, let’s see a rundown of which elements each section usually contains.
Intro
- The intro is usually the simplest part of your entire track. It will
- usually contain a stripped down beat to allow DJ’s to more easily
- transition into your track, or – if you’re making a radio or Spotify
- edit – will have a very short 2 to 4 bar phrase introducing the main
- theme of your track. The intro also sets the pace and expectations for
- what the track will deliver. (Will it be a break-neck speed drum-n-bass
- track? Will it be a more chilled-out deep house track?)
+The intro is usually the simplest part of your entire track. It will usually
+contain a stripped down beat to allow DJ’s to more easily transition into your
+track, or – if you’re making a radio or Spotify edit – will have a very short 2
+to 4 bar phrase introducing the main theme of your track. The intro also sets
+the pace and expectations for what the track will deliver. (Will it be a
+break-neck speed drum-n-bass track? Will it be a more chilled-out deep house
+track?)
Verse
- The verse is more complex than the intro, but often less complex than
- the drop (or at least, conveying less energy). In vocal driven music,
- this is where the majority of the storytelling of songwriting occurs,
- but in a lot of EDM, this is where you establish your melodic motifs.
- These motifs – or small musical ideas – should hint at your main drop
- melody without giving away your big, exciting, energetic drop.
+The verse is more complex than the intro, but often less complex than the drop
+(or at least, conveying less energy). In vocal driven music, this is where the
+majority of the storytelling of songwriting occurs, but in a lot of EDM, this
+is where you establish your melodic motifs. These motifs – or small musical
+ideas – should hint at your main drop melody without giving away your big,
+exciting, energetic drop.
Build up
- The build up typically contains risers, repetitive melodic motifs, and
- is generally rather short (a notable exception to this rule might be an
- 8-minute trance track). When creating build ups, you can also consider
- stripping down your percussion and drums to the bare essentials, in
- order to juxtapose to the heavy drop.
+The build up typically contains risers, repetitive melodic motifs, and is
+generally rather short (a notable exception to this rule might be an 8-minute
+trance track). When creating build ups, you can also consider stripping down
+your percussion and drums to the bare essentials, in order to juxtapose to the
+heavy drop.
Drop
- The drop is the hardest hitting part of your track. This is where the
- main hook of your song lies, and where the energy in your track should
- be the highest. You want people to get up and dance when they hear your
- drop! The drop can be very simple, or very complex; this heavily relies
- on genre, so make sure to listen to your favorite songs and use them as
- reference.
+The drop is the hardest hitting part of your track. This is where the main hook
+of your song lies, and where the energy in your track should be the highest.
+You want people to get up and dance when they hear your drop! The drop can be
+very simple, or very complex; this heavily relies on genre, so make sure to
+listen to your favorite songs and use them as reference.
Structures
- Many songs you hear on the radio or in the club utilize similar song
- structures, with some key variation to keep it interesting. When
- deciding how to structure your own track, listening and referencing
- your favorite track in the same genre can be immensely valuable, as
- that track is likely commercially successful and has a structure that
- is proven and works.
+Many songs you hear on the radio or in the club utilize similar song
+structures, with some key variation to keep it interesting. When deciding how
+to structure your own track, listening and referencing your favorite track in
+the same genre can be immensely valuable, as that track is likely commercially
+successful and has a structure that is proven and works.
- As a high level overview, structuring your song is a bit like designing
- a roller-coaster. We want to bring the listener on a journey with the
- emotion and energy from the track. This will help keep your listeners
- engaged, prevent them from becoming bored, and hopefully keep playing
- your track for days, months, and years to come.
+As a high level overview, structuring your song is a bit like designing a
+roller-coaster. We want to bring the listener on a journey with the emotion and
+energy from the track. This will help keep your listeners engaged, prevent them
+from becoming bored, and hopefully keep playing your track for days, months,
+and years to come.
- You can even analyse the structure of existing songs and draw in an
- “energy map” using an automation line, as shown here.
+You can even analyse the structure of existing songs and draw in an “energy
+map” using an automation line, as shown here.
- There are a few ways of representing song structure, but by far the
- most common is to use letters to represent each part of a track. For
- example, a common song structure in pop music goes as follows:
+[EDM-Song-Structure-Energy-Map]
- A B D B D E D A
+There are a few ways of representing song structure, but by far the most common
+is to use letters to represent each part of a track. For example, a common song
+structure in pop music goes as follows:
- In this instance, the letter A stands for an intro or outtro, B stands
- for a verse, D stands for a chorus or drop, and E stands for the bridge
- of the song, adding variety. Using this notation, we can quickly and
- easily create and plan our song’s structure without getting too deep
- into the details and slowing us down.
+A B D B D E D A
- If we wanted to use a similar structure for EDM, we could use A B D B D
- A or A B D E D A, both of which are fairly basic but common structures.
- In this instance, however, the E section is an extended breakdown,
- bridge, or a new section or extended verse.
+In this instance, the letter A stands for an intro or outtro, B stands for a
+verse, D stands for a chorus or drop, and E stands for the bridge of the song,
+adding variety. Using this notation, we can quickly and easily create and plan
+our song’s structure without getting too deep into the details and slowing us
+down.
- Now we understand how song structure notation works, let’s look at a
- common example of a more complex EDM song structure.
+If we wanted to use a similar structure for EDM, we could use A B D B D A or A
+B D E D A, both of which are fairly basic but common structures. In this
+instance, however, the E section is an extended breakdown, bridge, or a new
+section or extended verse.
- A B C D B C D A
+Now we understand how song structure notation works, let’s look at a common
+example of a more complex EDM song structure.
- This structure breaks down like so:
- * A: These are the intro and outtro of the track. They are typically
- 8 or 16 bars in length. In some genres, you may have 4 bar intro
- and outtros; it’s important to reference the genre you’re producing
- to ensure your song fits in well with the genre.
- * B: This is the verse in your track. The first verse is typically 16
- bars, and the second verse is 16 or 32 bars.
- * C: This is the build of the track. Both builds are typically 8 bars
- in length, although in some genres can be 4 or even 10 or 12 bars
- long.
- * D: This is the drop of your track. A drop can vary in length but
- are usually 8 to 16 bars. The second drop is typically either the
- same length as the first, or slightly longer to develop a little
- bit of additional energy.
+A B C D B C D A
- EDM Song Structure - Track Breakdown
+This structure breaks down like so:
- This is only one example of how you can structure your song, feel free
- to deviate as much or as little as you want. During the music
- production process, there’s tons of room for experimentation,
- innovation, and self-expression; however, the vast majority of the
- time, you do not want to experiment with EDM song structure. By doing
- so you make your track more difficult to understand. No need to
- reinvent the wheel!
+ • A: These are the intro and outtro of the track. They are typically 8 or 16
+ bars in length. In some genres, you may have 4 bar intro and outtros; it’s
+ important to reference the genre you’re producing to ensure your song fits
+ in well with the genre.
+
+ • B: This is the verse in your track. The first verse is typically 16 bars,
+ and the second verse is 16 or 32 bars.
+
+ • C: This is the build of the track. Both builds are typically 8 bars in
+ length, although in some genres can be 4 or even 10 or 12 bars long.
+
+ • D: This is the drop of your track. A drop can vary in length but are
+ usually 8 to 16 bars. The second drop is typically either the same length
+ as the first, or slightly longer to develop a little bit of additional
+ energy.
+
+EDM Song Structure - Track Breakdown
+
+This is only one example of how you can structure your song, feel free to
+deviate as much or as little as you want. During the music production process,
+there’s tons of room for experimentation, innovation, and self-expression;
+however, the vast majority of the time, you do not want to experiment with EDM
+song structure. By doing so you make your track more difficult to understand.
+No need to reinvent the wheel!
Song Structure and Genre
- Now for a quick note on genre. Genre itself dictates a lot of how your
- track should be structured. A tech house track is going to have a
- different song structure than a future bass track, which will be
- different than an EDM trap track. Additionally, the length of the track
- also fairly tightly correlates to the genre, with pop-y tracks being
- shorter and club and house tracks being on the longer side.
+Now for a quick note on genre. Genre itself dictates a lot of how your track
+should be structured. A tech house track is going to have a different song
+structure than a future bass track, which will be different than an EDM trap
+track. Additionally, the length of the track also fairly tightly correlates to
+the genre, with pop-y tracks being shorter and club and house tracks being on
+the longer side.
- For example, future bass typically follow a more pop-like structure,
- with longer fleshed out melodic verses and short 4 bar intros and
- outtros. Most house music, however, has a significantly longer intro
- and outtro; 8 to 16 bars, sometimes even 32. House music also typically
- has fewer purely melodic elements focused in the verses and breakdowns,
- and instead focuses on the vibe, atmosphere, and groove, building up to
- an epic drop.
+For example, future bass typically follow a more pop-like structure, with
+longer fleshed out melodic verses and short 4 bar intros and outtros. Most
+house music, however, has a significantly longer intro and outtro; 8 to 16
+bars, sometimes even 32. House music also typically has fewer purely melodic
+elements focused in the verses and breakdowns, and instead focuses on the vibe,
+atmosphere, and groove, building up to an epic drop.
- Let’s take a look at [16]“Chained For Love – B2A & Anklebreaker Remix”.
- This is a hardstyle track and has a song structure of:
+Let’s take a look at [21]“Chained For Love – B2A & Anklebreaker Remix”. This is
+a hardstyle track and has a song structure of:
- A B C D B C D A
+A B C D B C D A
- Where A stands for your intro and outtro, B is your verse, C is the
- build, and D is the drop. This is an extremely common structure in
- hardstyle tracks; the verse is also typically split into a more vocal
- or lower energy first half, and the second half is where your
- saw-driven leads come in to introduce components of the drop melody.
+Where A stands for your intro and outtro, B is your verse, C is the build, and
+D is the drop. This is an extremely common structure in hardstyle tracks; the
+verse is also typically split into a more vocal or lower energy first half, and
+the second half is where your saw-driven leads come in to introduce components
+of the drop melody.
- Now let’s examine a future bass track, [17]“Lifeline – LODIS, Josh
- Rubin”. This particular track has a structure like so:
+Now let’s examine a future bass track, [22]“Lifeline – LODIS, Josh Rubin”. This
+particular track has a structure like so:
- A B E C D B E C D A
+A B E C D B E C D A
- Note that this genre has a significantly longer intro than the previous
- hardstyle track, yet the overarching structure itself is remarkably
- similar. The key difference is the addition of E; which is a breakdown
- or pre-build. This component lowers the energy right before the build,
- allowing the producer to create a bigger feeling build.
+Note that this genre has a significantly longer intro than the previous
+hardstyle track, yet the overarching structure itself is remarkably similar.
+The key difference is the addition of E; which is a breakdown or pre-build.
+This component lowers the energy right before the build, allowing the producer
+to create a bigger feeling build.
- Finally, let’s take a look at a big room / EDM track. We’ll use
- [18]“Cold – Timmy Trumpet” as an example here. He utilizes the
- following structure for his track:
+Finally, let’s take a look at a big room / EDM track. We’ll use [23]“Cold –
+Timmy Trumpet” as an example here. He utilizes the following structure for his
+track:
- B C D B C D A
+B C D B C D A
- “Cold” also shares a similar structure to the other tracks. In fact,
- it’s virtually identical to “Chained For Love”, save for the lack of
- any sort of intro, even though the sounds and overall general vibe of
- the genre are strikingly different.
+“Cold” also shares a similar structure to the other tracks. In fact, it’s
+virtually identical to “Chained For Love”, save for the lack of any sort of
+intro, even though the sounds and overall general vibe of the genre are
+strikingly different.
EDM Song Structure and Arrangement
- Now we understand how songs are structured and how to structure our own
- track, we need to decide on the genre we want our loop to fit, or what
- genre the loop already fits. Then, identify which section of a track
- your loop fits into. Is it a heavy and energetic drop, or is it more a
- verse or breakdown?
+Now we understand how songs are structured and how to structure our own track,
+we need to decide on the genre we want our loop to fit, or what genre the loop
+already fits. Then, identify which section of a track your loop fits into. Is
+it a heavy and energetic drop, or is it more a verse or breakdown?
- Once you’ve figured out these overarching details, we can start to
- think about how we want to structure our track. You can use your DAW or
- even just a piece of paper to map out each section of our song, and
- what should go where. Now it’s as simple as filling in the gaps with
- elements from your loop, and you’re well on your way to finishing your
- track!
+Once you’ve figured out these overarching details, we can start to think about
+how we want to structure our track. You can use your DAW or even just a piece
+of paper to map out each section of our song, and what should go where. Now
+it’s as simple as filling in the gaps with elements from your loop, and you’re
+well on your way to finishing your track!
- Let’s go over some of the common scenarios you’ll find yourself in.
+Let’s go over some of the common scenarios you’ll find yourself in.
Starting with the Drop
- Your loop is energetic and pumping; this is your drop. Let’s use an A B
- C D B C D A structure for our track, just like the “Chained For Love –
- B2A & Anklebreaker Remix” prior example.
+Your loop is energetic and pumping; this is your drop. Let’s use an A B C D B C
+D A structure for our track, just like the “Chained For Love – B2A &
+Anklebreaker Remix” prior example.
- EDM Song Structure - Straring with a Drop
+EDM Song Structure - Straring with a Drop
- Now you’ve identified that you have a drop, let’s expand it to two
- sections with a little bit of melodic or rhythmic variation on the
- second iteration.
+Now you’ve identified that you have a drop, let’s expand it to two sections
+with a little bit of melodic or rhythmic variation on the second iteration.
- Now we’ve gotten a full drop, let’s take a look at the build up. We can
- use more filtered leads and pads, and switch up the snare or clap to a
- contrasting rhythm to build tension. We’ll open up the filters and
- speed up the percussion as the drop builds to further build up that
- tension before the drop.
+[EDM-Song-Structure-Starting-with-a-Drop-2]
- Let’s take a look at the intro and outtro. Take the melody, simplify it
- and the instrumentation, and use a stripped down drum pattern. You can
- also experiment with some low and simple bass or some rhythmically
- simple chord patterns. The outtro can be as simple as the intro, but
- instead of bringing in elements, we take them out.
+Now we’ve gotten a full drop, let’s take a look at the build up. We can use
+more filtered leads and pads, and switch up the snare or clap to a contrasting
+rhythm to build tension. We’ll open up the filters and speed up the percussion
+as the drop builds to further build up that tension before the drop.
- The verses should be a contrasting force to the drop, while still
- maintaining a similar vibe. To quickly get down a verse idea, you can
- take the drop melody, take it down to a lower register with some more
- interesting rhythmic chord structures that build nicely into the build
- up. We can also add our second verse, build, and drops.
+[EDM-Song-Structure-Strarting-with-a-Drop-3]
- EDM Song Structure - Starging with a Drop 5
+Let’s take a look at the intro and outtro. Take the melody, simplify it and the
+instrumentation, and use a stripped down drum pattern. You can also experiment
+with some low and simple bass or some rhythmically simple chord patterns. The
+outtro can be as simple as the intro, but instead of bringing in elements, we
+take them out.
+
+[EDM-Song-Structure-Starting-with-a-Drop-4-1024x337]
+
+The verses should be a contrasting force to the drop, while still maintaining a
+similar vibe. To quickly get down a verse idea, you can take the drop melody,
+take it down to a lower register with some more interesting rhythmic chord
+structures that build nicely into the build up. We can also add our second
+verse, build, and drops.
+
+EDM Song Structure - Starging with a Drop 5
Starting with a Breakdown, Verse or Intro
- So your loop isn’t super energetic, maybe it fits well as a verse or
- intro. To generate your placeholder verses, take the idea and evolve it
- with moving drum patterns and chord patterns. The build up will then
- come more naturally, and you can introduce a switch-up in drum patterns
- to help contrast this section from the verses and drop. Work up the
- energy in the build up, adding faster drums and risers and other
- effects. After this build is complete, usually you’ll have a solid idea
- for the drop itself; if not, don’t worry! Take your verse idea, take
- apart a one or two bar section, and build upon it to make it as high
- energy as possible.
+So your loop isn’t super energetic, maybe it fits well as a verse or intro. To
+generate your placeholder verses, take the idea and evolve it with moving drum
+patterns and chord patterns. The build up will then come more naturally, and
+you can introduce a switch-up in drum patterns to help contrast this section
+from the verses and drop. Work up the energy in the build up, adding faster
+drums and risers and other effects. After this build is complete, usually
+you’ll have a solid idea for the drop itself; if not, don’t worry! Take your
+verse idea, take apart a one or two bar section, and build upon it to make it
+as high energy as possible.
Referencing Existing Material
- If you’re still struggling to build out your loop into a full track
- scaffold, try using your favorite song as reference. In this example,
- we’ll use HOLIDAY by Lil Nas X, a pop and rap song.
+If you’re still struggling to build out your loop into a full track scaffold,
+try using your favorite song as reference. In this example, we’ll use HOLIDAY
+by Lil Nas X, a pop and rap song.
- Import the track into your DAW, and set the tempo equal to that of the
- track. Sometimes your DAW will do this for you, but if not, you can
- usually find it easily on Beatport or other sites.
+Import the track into your DAW, and set the tempo equal to that of the track.
+Sometimes your DAW will do this for you, but if not, you can usually find it
+easily on Beatport or other sites.
- EDM Song Structure - Referencing Existing Material
+EDM Song Structure - Referencing Existing Material
- Take a listen to the song in full. As you listen, mark down where each
- change occurs in the song, and what the upcoming section is.Take a
- listen to the song in full. As you listen, mark down where each change
- occurs in the song, and what the upcoming section is.
+Take a listen to the song in full. As you listen, mark down where each change
+occurs in the song, and what the upcoming section is.Take a listen to the song
+in full. As you listen, mark down where each change occurs in the song, and
+what the upcoming section is.
- EDM Song Structure- Referencing Existing Material 2
+EDM Song Structure- Referencing Existing Material 2
- After going through the entire track, you’ll have an accurate map of
- the full track, and can use the markers as guidelines on how you can
- structure your own track.
- Start 2022 the right way! Download your FREE “New Producer Starter
- Pack” here.
+After going through the entire track, you’ll have an accurate map of the full
+track, and can use the markers as guidelines on how you can structure your own
+track.
+
+Start 2022 the right way! Download your FREE “New Producer Starter Pack” here.
Conclusion
- One of the hardest parts of music production is actually finishing your
- own tracks, and not ending up with a hard drive full of unfinished
- loops. However, using song structuring techniques, we can use them as
- scaffolding for us to write better music, faster. When you create each
- section, make sure that each section captures and holds the user’s
- interest in its own right; the best songs are interesting throughout,
- (even in the intros and outtros!), not just during the drops.
+One of the hardest parts of music production is actually finishing your own
+tracks, and not ending up with a hard drive full of unfinished loops. However,
+using song structuring techniques, we can use them as scaffolding for us to
+write better music, faster. When you create each section, make sure that each
+section captures and holds the user’s interest in its own right; the best songs
+are interesting throughout, (even in the intros and outtros!), not just during
+the drops.
- What do you struggle with most when it comes to EDM song structure?
- Let us know in the comments!
- [19]Share33
- [20]Tweet
- 33 Shares
+What do you struggle with most when it comes to EDM song structure? Let us
+know in the comments!
- * [21]Music Theory & Arrangement
+[24]Share33
+[25]Tweet
+33 Shares
+
+ • [26]Music Theory & Arrangement
Related Posts
- How to Write Catchy Melodies from Scratch (The Ultimate Guide)
+[27]
- Everything an Electronic Music Producer Needs to Know About Drum
- Programming
+How to Write Catchy Melodies from Scratch (The Ultimate Guide)
+
+[28]
+
+Everything an Electronic Music Producer Needs to Know About Drum Programming
+
+[29]
About the Author
- My name's Will Darling. I've been making and playing dance music for
- over 25 years, and share what I've learnt on EDM Tips. Get in touch on
- [22]Facebook.
+My name's Will Darling. I've been making and playing dance music for over 25
+years, and share what I've learnt on EDM Tips. Get in touch on [30]Facebook.
Leave a Reply 6 comments
+[loading]
+
Leave a Reply:
- Name * ____________________
- E-Mail * ____________________
- Website ____________________
+Name * [31][ ]
- [ ] Save my name, email, and website in this browser for the next time
- I comment.
+E-Mail * [32][ ]
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- SUBMIT COMMENT
+Website [33][ ]
- Δ
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- _____________________________________________
- [23]←Previous post [24]Next post→
- What do you want to learn?
- * [25]Messages
- * [26]Mixing & Mastering
- * [27]Music Industry
- * [28]Music Theory & Arrangement
- * [29]Sound Design
- * [30]Workflow & Creativity
+[34][ ] Save my name, email, and website in this browser for the next time I
+comment.
- About EDM Tips
+[ ]
+[36][SUBMIT COMMENT]
- My name is Will Darling and I'm the founder of EDM Tips. I've been
- producing Electronic Dance Music for over 25 years, and each week help
- my readers achieve their music goals. [31]Read More...
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+Δ[ ]
- *
- * [32]Follow @edmtipsofficial
-
- *
+[42]←Previous post [43]Next post→
- Popular Posts
- [33]The Ultimate Guide to Success in Music Production in 2022
- [34]How To Make Chords
- [35]The Circle of Fifths (and how to use it…)
- [36]Make Better EDM Using Keys And Scales
- [37]The Ultimate EDM Production Glossary
+What do you want to learn?
- Archives
- * [38]April 2023
- * [39]March 2023
- * [40]February 2023
- * [41]January 2023
- * [42]November 2022
- * [43]October 2022
- * [44]September 2022
- * [45]July 2022
- * [46]May 2022
- * [47]March 2022
- * [48]February 2022
- * [49]January 2022
- * [50]October 2021
- * [51]September 2021
- * [52]August 2021
- * [53]June 2021
- * [54]May 2021
- * [55]April 2021
- * [56]March 2021
- * [57]February 2021
- * [58]January 2021
- * [59]December 2020
- * [60]November 2020
- * [61]October 2020
- * [62]September 2020
- * [63]August 2020
- * [64]July 2020
- * [65]June 2020
- * [66]May 2020
- * [67]April 2020
- * [68]March 2020
- * [69]February 2020
- * [70]January 2020
- * [71]December 2019
- * [72]November 2019
- * [73]October 2019
- * [74]September 2019
- * [75]August 2019
- * [76]July 2019
- * [77]June 2019
- * [78]May 2019
- * [79]April 2019
- * [80]February 2019
- * [81]January 2019
- * [82]December 2018
- * [83]November 2018
- * [84]September 2018
- * [85]August 2018
- * [86]July 2018
- * [87]June 2018
- * [88]May 2018
- * [89]April 2018
- * [90]March 2018
- * [91]January 2018
- * [92]December 2017
- * [93]November 2017
- * [94]October 2017
- * [95]September 2017
- * [96]August 2017
- * [97]July 2017
- * [98]June 2017
- * [99]May 2017
- * [100]April 2017
- * [101]February 2017
- * [102]January 2017
- * [103]December 2016
- * [104]November 2016
- * [105]October 2016
- * [106]September 2016
- * [107]August 2016
+ • [44]Messages
+ • [45]Mixing & Mastering
+ • [46]Music Industry
+ • [47]Music Theory & Arrangement
+ • [48]Sound Design
+ • [49]Workflow & Creativity
- Copyright 2023 EDM Tips Ltd.
- * [108]
- * [109]
- * [110]
+About EDM Tips
-References
+[Will-Darli]
- Visible links:
- 1. https://edmtips.com/edm-song-structure/feed/
- 2. https://edmtips.com/wp-json/wp/v2/posts/3828
- 3. https://edmtips.com/wp-json/oembed/1.0/embed?url=https://edmtips.com/edm-song-structure/
- 4. https://edmtips.com/wp-json/oembed/1.0/embed?url=https://edmtips.com/edm-song-structure/&format=xml
- 5. https://www.googletagmanager.com/ns.html?id=GTM-N5SBWB6
- 6. https://edmtips.com/
- 7. https://edmtips.com/free-guides/
- 8. https://edmtips.com/products/
- 9. https://edmtips.com/blog/
- 10. https://edmtips.com/club/
- 11. https://academy.edmtips.com/login
- 12. https://edmtips.com/edm-song-structure/#comments
- 13. https://www.facebook.com/share.php?u=https://edmtips.com/edm-song-structure/
- 14. https://twitter.com/intent/tweet?text=EDM+Song+Structure:+Arrange+Your+Loop+into+a+Full+Song&url=https://edmtips.com/edm-song-structure/&via=EDMtipsOfficial
- 15. https://www.youtube.com/embed/EXx9At3iUOw?feature=oembed&iv_load_policy=3&modestbranding=1&rel=0&autohide=1&playsinline=0&autoplay=0
- 16. https://www.youtube.com/watch?v=F-tDyFu-YzQ
- 17. https://www.youtube.com/watch?v=QVtRH0znmqU
- 18. https://www.youtube.com/watch?v=Nld4XNwpZN8
- 19. https://www.facebook.com/share.php?u=https://edmtips.com/edm-song-structure/
- 20. https://twitter.com/intent/tweet?text=EDM+Song+Structure:+Arrange+Your+Loop+into+a+Full+Song&url=https://edmtips.com/edm-song-structure/&via=EDMtipsOfficial
- 21. https://edmtips.com/category/composition-arrangement/
- 22. https://www.facebook.com/EDMtipsOfficial/
- 23. https://edmtips.com/how-to-make-edm-like-martin-garrix/
- 24. https://edmtips.com/guide-into-music-production-software-for-beginners/
- 25. https://edmtips.com/category/messages/
- 26. https://edmtips.com/category/mixing-mastering/
- 27. https://edmtips.com/category/music-industry/
- 28. https://edmtips.com/category/composition-arrangement/
- 29. https://edmtips.com/category/sound-design/
- 30. https://edmtips.com/category/workflow-creativity/
- 31. http://edmtips.com/about/
- 32. http://twitter.com/http://edmtipsofficial
- 33. https://edmtips.com/success-music-production/
- 34. https://edmtips.com/how-to-make-chords/
- 35. https://edmtips.com/the-circle-of-fifths-and-how-to-use-it/
- 36. https://edmtips.com/how-to-use-keys-make-edm/
- 37. https://edmtips.com/ultimate-edm-production-glossary/
- 38. https://edmtips.com/2023/04/
- 39. https://edmtips.com/2023/03/
- 40. https://edmtips.com/2023/02/
- 41. https://edmtips.com/2023/01/
- 42. https://edmtips.com/2022/11/
- 43. https://edmtips.com/2022/10/
- 44. https://edmtips.com/2022/09/
- 45. https://edmtips.com/2022/07/
- 46. https://edmtips.com/2022/05/
- 47. https://edmtips.com/2022/03/
- 48. https://edmtips.com/2022/02/
- 49. https://edmtips.com/2022/01/
- 50. https://edmtips.com/2021/10/
- 51. https://edmtips.com/2021/09/
- 52. https://edmtips.com/2021/08/
- 53. https://edmtips.com/2021/06/
- 54. https://edmtips.com/2021/05/
- 55. https://edmtips.com/2021/04/
- 56. https://edmtips.com/2021/03/
- 57. https://edmtips.com/2021/02/
- 58. https://edmtips.com/2021/01/
- 59. https://edmtips.com/2020/12/
- 60. https://edmtips.com/2020/11/
- 61. https://edmtips.com/2020/10/
- 62. https://edmtips.com/2020/09/
- 63. https://edmtips.com/2020/08/
- 64. https://edmtips.com/2020/07/
- 65. https://edmtips.com/2020/06/
- 66. https://edmtips.com/2020/05/
- 67. https://edmtips.com/2020/04/
- 68. https://edmtips.com/2020/03/
- 69. https://edmtips.com/2020/02/
- 70. https://edmtips.com/2020/01/
- 71. https://edmtips.com/2019/12/
- 72. https://edmtips.com/2019/11/
- 73. https://edmtips.com/2019/10/
- 74. https://edmtips.com/2019/09/
- 75. https://edmtips.com/2019/08/
- 76. https://edmtips.com/2019/07/
- 77. https://edmtips.com/2019/06/
- 78. https://edmtips.com/2019/05/
- 79. https://edmtips.com/2019/04/
- 80. https://edmtips.com/2019/02/
- 81. https://edmtips.com/2019/01/
- 82. https://edmtips.com/2018/12/
- 83. https://edmtips.com/2018/11/
- 84. https://edmtips.com/2018/09/
- 85. https://edmtips.com/2018/08/
- 86. https://edmtips.com/2018/07/
- 87. https://edmtips.com/2018/06/
- 88. https://edmtips.com/2018/05/
- 89. https://edmtips.com/2018/04/
- 90. https://edmtips.com/2018/03/
- 91. https://edmtips.com/2018/01/
- 92. https://edmtips.com/2017/12/
- 93. https://edmtips.com/2017/11/
- 94. https://edmtips.com/2017/10/
- 95. https://edmtips.com/2017/09/
- 96. https://edmtips.com/2017/08/
- 97. https://edmtips.com/2017/07/
- 98. https://edmtips.com/2017/06/
- 99. https://edmtips.com/2017/05/
- 100. https://edmtips.com/2017/04/
- 101. https://edmtips.com/2017/02/
- 102. https://edmtips.com/2017/01/
- 103. https://edmtips.com/2016/12/
- 104. https://edmtips.com/2016/11/
- 105. https://edmtips.com/2016/10/
- 106. https://edmtips.com/2016/09/
- 107. https://edmtips.com/2016/08/
- 108. https://www.facebook.com/EDMtipsOfficial/
- 109. https://twitter.com/edmtipsofficial
- 110. http://youtube.com/c/edmtips?sub_confirmation=1
+My name is Will Darling and I'm the founder of EDM Tips. I've been producing
+Electronic Dance Music for over 25 years, and each week help my readers achieve
+their music goals. [50]Read More...
- Hidden links:
- 112. https://edmtips.com/how-to-write-catchy-melodies-from-scratch-the-ultimate-guide/
- 113. https://edmtips.com/drum-programming/
- 114. https://edmtips.com/author/edmtips/
+ •
+
+ • [51]Follow @edmtipsofficial
+
+ •
+
+
+Popular Posts
+
+[52]The Ultimate Guide to Success in Music Production in 2022
+[53]How To Make Chords
+[54]The Circle of Fifths (and how to use it…)
+[55]Make Better EDM Using Keys And Scales
+[56]The Ultimate EDM Production Glossary
+
+Archives
+
+ • [57]April 2023
+ • [58]March 2023
+ • [59]February 2023
+ • [60]January 2023
+ • [61]November 2022
+ • [62]October 2022
+ • [63]September 2022
+ • [64]July 2022
+ • [65]May 2022
+ • [66]March 2022
+ • [67]February 2022
+ • [68]January 2022
+ • [69]October 2021
+ • [70]September 2021
+ • [71]August 2021
+ • [72]June 2021
+ • [73]May 2021
+ • [74]April 2021
+ • [75]March 2021
+ • [76]February 2021
+ • [77]January 2021
+ • [78]December 2020
+ • [79]November 2020
+ • [80]October 2020
+ • [81]September 2020
+ • [82]August 2020
+ • [83]July 2020
+ • [84]June 2020
+ • [85]May 2020
+ • [86]April 2020
+ • [87]March 2020
+ • [88]February 2020
+ • [89]January 2020
+ • [90]December 2019
+ • [91]November 2019
+ • [92]October 2019
+ • [93]September 2019
+ • [94]August 2019
+ • [95]July 2019
+ • [96]June 2019
+ • [97]May 2019
+ • [98]April 2019
+ • [99]February 2019
+ • [100]January 2019
+ • [101]December 2018
+ • [102]November 2018
+ • [103]September 2018
+ • [104]August 2018
+ • [105]July 2018
+ • [106]June 2018
+ • [107]May 2018
+ • [108]April 2018
+ • [109]March 2018
+ • [110]January 2018
+ • [111]December 2017
+ • [112]November 2017
+ • [113]October 2017
+ • [114]September 2017
+ • [115]August 2017
+ • [116]July 2017
+ • [117]June 2017
+ • [118]May 2017
+ • [119]April 2017
+ • [120]February 2017
+ • [121]January 2017
+ • [122]December 2016
+ • [123]November 2016
+ • [124]October 2016
+ • [125]September 2016
+ • [126]August 2016
+
+Copyright 2023 EDM Tips Ltd.
+
+ • [127]
+ • [128]
+ • [129]
+
+
+References:
+
+[1] https://edmtips.com/
+[2] https://edmtips.com/free-guides/
+[3] https://edmtips.com/products/
+[4] https://edmtips.com/blog/
+[5] https://edmtips.com/club/
+[6] https://academy.edmtips.com/login
+[18] https://edmtips.com/edm-song-structure/#comments
+[19] https://www.facebook.com/share.php?u=https%3A%2F%2Fedmtips.com%2Fedm-song-structure%2F
+[20] https://twitter.com/intent/tweet?text=EDM+Song+Structure%3A+Arrange+Your+Loop+into+a+Full+Song&url=https%3A%2F%2Fedmtips.com%2Fedm-song-structure%2F&via=EDMtipsOfficial
+[21] https://www.youtube.com/watch?v=F-tDyFu-YzQ
+[22] https://www.youtube.com/watch?v=QVtRH0znmqU
+[23] https://www.youtube.com/watch?v=Nld4XNwpZN8
+[24] https://www.facebook.com/share.php?u=https%3A%2F%2Fedmtips.com%2Fedm-song-structure%2F
+[25] https://twitter.com/intent/tweet?text=EDM+Song+Structure%3A+Arrange+Your+Loop+into+a+Full+Song&url=https%3A%2F%2Fedmtips.com%2Fedm-song-structure%2F&via=EDMtipsOfficial
+[26] https://edmtips.com/category/composition-arrangement/
+[27] https://edmtips.com/how-to-write-catchy-melodies-from-scratch-the-ultimate-guide/
+[28] https://edmtips.com/drum-programming/
+[29] https://edmtips.com/author/edmtips/
+[30] https://www.facebook.com/EDMtipsOfficial/
+[42] https://edmtips.com/how-to-make-edm-like-martin-garrix/
+[43] https://edmtips.com/guide-into-music-production-software-for-beginners/
+[44] https://edmtips.com/category/messages/
+[45] https://edmtips.com/category/mixing-mastering/
+[46] https://edmtips.com/category/music-industry/
+[47] https://edmtips.com/category/composition-arrangement/
+[48] https://edmtips.com/category/sound-design/
+[49] https://edmtips.com/category/workflow-creativity/
+[50] http://edmtips.com/about/
+[51] http://twitter.com/http://edmtipsofficial
+[52] https://edmtips.com/success-music-production/
+[53] https://edmtips.com/how-to-make-chords/
+[54] https://edmtips.com/the-circle-of-fifths-and-how-to-use-it/
+[55] https://edmtips.com/how-to-use-keys-make-edm/
+[56] https://edmtips.com/ultimate-edm-production-glossary/
+[57] https://edmtips.com/2023/04/
+[58] https://edmtips.com/2023/03/
+[59] https://edmtips.com/2023/02/
+[60] https://edmtips.com/2023/01/
+[61] https://edmtips.com/2022/11/
+[62] https://edmtips.com/2022/10/
+[63] https://edmtips.com/2022/09/
+[64] https://edmtips.com/2022/07/
+[65] https://edmtips.com/2022/05/
+[66] https://edmtips.com/2022/03/
+[67] https://edmtips.com/2022/02/
+[68] https://edmtips.com/2022/01/
+[69] https://edmtips.com/2021/10/
+[70] https://edmtips.com/2021/09/
+[71] https://edmtips.com/2021/08/
+[72] https://edmtips.com/2021/06/
+[73] https://edmtips.com/2021/05/
+[74] https://edmtips.com/2021/04/
+[75] https://edmtips.com/2021/03/
+[76] https://edmtips.com/2021/02/
+[77] https://edmtips.com/2021/01/
+[78] https://edmtips.com/2020/12/
+[79] https://edmtips.com/2020/11/
+[80] https://edmtips.com/2020/10/
+[81] https://edmtips.com/2020/09/
+[82] https://edmtips.com/2020/08/
+[83] https://edmtips.com/2020/07/
+[84] https://edmtips.com/2020/06/
+[85] https://edmtips.com/2020/05/
+[86] https://edmtips.com/2020/04/
+[87] https://edmtips.com/2020/03/
+[88] https://edmtips.com/2020/02/
+[89] https://edmtips.com/2020/01/
+[90] https://edmtips.com/2019/12/
+[91] https://edmtips.com/2019/11/
+[92] https://edmtips.com/2019/10/
+[93] https://edmtips.com/2019/09/
+[94] https://edmtips.com/2019/08/
+[95] https://edmtips.com/2019/07/
+[96] https://edmtips.com/2019/06/
+[97] https://edmtips.com/2019/05/
+[98] https://edmtips.com/2019/04/
+[99] https://edmtips.com/2019/02/
+[100] https://edmtips.com/2019/01/
+[101] https://edmtips.com/2018/12/
+[102] https://edmtips.com/2018/11/
+[103] https://edmtips.com/2018/09/
+[104] https://edmtips.com/2018/08/
+[105] https://edmtips.com/2018/07/
+[106] https://edmtips.com/2018/06/
+[107] https://edmtips.com/2018/05/
+[108] https://edmtips.com/2018/04/
+[109] https://edmtips.com/2018/03/
+[110] https://edmtips.com/2018/01/
+[111] https://edmtips.com/2017/12/
+[112] https://edmtips.com/2017/11/
+[113] https://edmtips.com/2017/10/
+[114] https://edmtips.com/2017/09/
+[115] https://edmtips.com/2017/08/
+[116] https://edmtips.com/2017/07/
+[117] https://edmtips.com/2017/06/
+[118] https://edmtips.com/2017/05/
+[119] https://edmtips.com/2017/04/
+[120] https://edmtips.com/2017/02/
+[121] https://edmtips.com/2017/01/
+[122] https://edmtips.com/2016/12/
+[123] https://edmtips.com/2016/11/
+[124] https://edmtips.com/2016/10/
+[125] https://edmtips.com/2016/09/
+[126] https://edmtips.com/2016/08/
+[127] https://www.facebook.com/EDMtipsOfficial/
+[128] https://twitter.com/edmtipsofficial
+[129] http://youtube.com/c/edmtips?sub_confirmation=1
diff --git a/static/archive/funlandrehoboth-com-jrkd5r.txt b/static/archive/funlandrehoboth-com-jrkd5r.txt
index 604c837..bf53ece 100644
--- a/static/archive/funlandrehoboth-com-jrkd5r.txt
+++ b/static/archive/funlandrehoboth-com-jrkd5r.txt
@@ -1,311 +1,328 @@
- Funland is closed for the season! Our opening day next season is Sat,
- May 11!
- [1]Home
- Attractions
- * [2]Park Information
- * [3]Rides
- * [4]Games
- * [5]Retail & Food
+[1]
- [6]Schedule
- Work For Us
- * [7]Employee Testimonials
- * [8]Seasonal Rides/ Games
- * [9]Maintenance Manager
- * [10]Maintenance Mechanic
- * [11]Seasonal Park Cleaner
+Funland is closed for the season! Our opening day next season is Sat, May 11!
- Info
- * [12]Tickets
- * [13]Height Restrictions
- * [14]Photos
- * [15]Contact Us
- * [16]Report A Lost Item
+[2]Home
+[3]
+Attractions
- Funland Rehoboth
- [17]Home
- Attractions
- * [18]Park Information
- * [19]Rides
- * [20]Games
- * [21]Retail & Food
+ • [4]Park Information
+ • [5]Rides
+ • [6]Games
+ • [7]Retail & Food
- [22]Schedule
- Work For Us
- * [23]Employee Testimonials
- * [24]Seasonal Rides/ Games
- * [25]Maintenance Manager
- * [26]Maintenance Mechanic
- * [27]Seasonal Park Cleaner
+[8]Schedule
+[9]
+Work For Us
- Info
- * [28]Tickets
- * [29]Height Restrictions
- * [30]Photos
- * [31]Contact Us
- * [32]Report A Lost Item
+ • [10]Employee Testimonials
+ • [11]Seasonal Rides/ Games
+ • [12]Maintenance Manager
+ • [13]Maintenance Mechanic
+ • [14]Seasonal Park Cleaner
- More
- * [33]Home
- * Attractions
- + [34]Park Information
- + [35]Rides
- + [36]Games
- + [37]Retail & Food
- * [38]Schedule
- * Work For Us
- + [39]Employee Testimonials
- + [40]Seasonal Rides/ Games
- + [41]Maintenance Manager
- + [42]Maintenance Mechanic
- + [43]Seasonal Park Cleaner
- * Info
- + [44]Tickets
- + [45]Height Restrictions
- + [46]Photos
- + [47]Contact Us
- + [48]Report A Lost Item
+[15]
+Info
- * [49]Sign In
- *
- ______________________________________________________________
+ • [16]Tickets
+ • [17]Height Restrictions
+ • [18]Photos
+ • [19]Contact Us
+ • [20]Report A Lost Item
- * [50]My Account
+[21]
+Funland Rehoboth
+[22]Home
+[23]
+Attractions
- * Signed in as:
- * filler@godaddy.com
- *
- ______________________________________________________________
+ • [24]Park Information
+ • [25]Rides
+ • [26]Games
+ • [27]Retail & Food
- * [51]My Account
- * Sign out
+[28]Schedule
+[29]
+Work For Us
- Funland Rehoboth
+ • [30]Employee Testimonials
+ • [31]Seasonal Rides/ Games
+ • [32]Maintenance Manager
+ • [33]Maintenance Mechanic
+ • [34]Seasonal Park Cleaner
- Signed in as:
+[35]
+Info
- filler@godaddy.com
- * [52]Home
- * [53]Attractions
- + [54]Park Information
- + [55]Rides
- + [56]Games
- + [57]Retail & Food
- * [58]Schedule
- * [59]Work For Us
- + [60]Employee Testimonials
- + [61]Seasonal Rides/ Games
- + [62]Maintenance Manager
- + [63]Maintenance Mechanic
- + [64]Seasonal Park Cleaner
- * [65]Info
- + [66]Tickets
- + [67]Height Restrictions
- + [68]Photos
- + [69]Contact Us
- + [70]Report A Lost Item
+ • [36]Tickets
+ • [37]Height Restrictions
+ • [38]Photos
+ • [39]Contact Us
+ • [40]Report A Lost Item
- Account
- *
- ______________________________________________________________
+[41]
+More
- * [71]My Account
- * Sign out
+ • [42]Home
+ • Attractions
+ □ [43]Park Information
+ □ [44]Rides
+ □ [45]Games
+ □ [46]Retail & Food
+ • [47]Schedule
+ • Work For Us
+ □ [48]Employee Testimonials
+ □ [49]Seasonal Rides/ Games
+ □ [50]Maintenance Manager
+ □ [51]Maintenance Mechanic
+ □ [52]Seasonal Park Cleaner
+ • Info
+ □ [53]Tickets
+ □ [54]Height Restrictions
+ □ [55]Photos
+ □ [56]Contact Us
+ □ [57]Report A Lost Item
- *
- ______________________________________________________________
+[58]
+[59]
- * [72]Sign In
- * [73]My Account
+ • [60]Sign In
+ • ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ • [61]My Account
- [rs=w:388,h:388,cg:true,m]
- [74]Schedule
- [rs=w:388,h:388,cg:true]
- [75]Tickets
- [rs=w:388,h:388,cg:true,m]
- [76]Work for Us
- [cr=w:388,h:388]
- [77]Rides
- [rs=w:388,h:388,cg:true,m]
- [78]Games
- [rs=w:388,h:388,cg:true]
- [79]Park Info
+ • Signed in as:
- IFRAME: [80]javascript: window.frameElement.getAttribute("srcdoc");
+ • filler@godaddy.com
+
+ • ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ • [62]My Account
+ • Sign out
+
+[63]
+[64]
+Funland Rehoboth
+
+Signed in as:
+
+filler@godaddy.com
+
+ • [65]Home
+ • [66]Attractions
+ □ [67]Park Information
+ □ [68]Rides
+ □ [69]Games
+ □ [70]Retail & Food
+ • [71]Schedule
+ • [72]Work For Us
+ □ [73]Employee Testimonials
+ □ [74]Seasonal Rides/ Games
+ □ [75]Maintenance Manager
+ □ [76]Maintenance Mechanic
+ □ [77]Seasonal Park Cleaner
+ • [78]Info
+ □ [79]Tickets
+ □ [80]Height Restrictions
+ □ [81]Photos
+ □ [82]Contact Us
+ □ [83]Report A Lost Item
+
+Account
+
+ • ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ • [84]My Account
+ • Sign out
+
+ • ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ • [85]Sign In
+ • [86]My Account
+
+[rs]
+[87]Schedule
+[rs]
+[88]Tickets
+[rs]
+[89]Work for Us
+[cr]
+[90]Rides
+[rs]
+[91]Games
+[rs]
+[92]Park Info
History of Funland
- [ACwAAAAAAQABAAACADs=]
+[ACwAAAAAAQ]
It all started as an innocent vacation to the beach, back in 1961…
- Allen and Don Fasnacht, their wives Jean and Dee, and their parents Al
- and Sis visited the place that was to become Funland during a trip to
- the Delaware seashore in August of 1961.
+Allen and Don Fasnacht, their wives Jean and Dee, and their parents Al and Sis
+visited the place that was to become Funland during a trip to the Delaware
+seashore in August of 1961.
- At the time, the family was operating a small “picnic park” near
- Harrisburg, Pennsylvania, called Willow Mill Park. Being the park
- people that they were, they visited the Rehoboth Beach Sports Center,
- as it was called when the Dentino family owned it. While they were
- talking about the ins and outs of the park business with Mr Dentino, he
- asked if they might be interested in buying the Sports Center. Yeah
- right, was the thought not spoken, but that was going through the
- Fasnachts’ minds. Mr. Dentino affirmed that he was indeed interested
- in selling the business and that the Fasnachts should think about
- buying it.
- Think about it is exactly what the family did when they returned home.
- It became a recurring topic in the Fasnacht family. They called Mr.
- Dentino and decided to go through with the purchase.
+At the time, the family was operating a small “picnic park” near Harrisburg,
+Pennsylvania, called Willow Mill Park. Being the park people that they were,
+they visited the Rehoboth Beach Sports Center, as it was called when the
+Dentino family owned it. While they were talking about the ins and outs of the
+park business with Mr Dentino, he asked if they might be interested in buying
+the Sports Center. Yeah right, was the thought not spoken, but that was going
+through the Fasnachts’ minds. Mr. Dentino affirmed that he was indeed
+interested in selling the business and that the Fasnachts should think about
+buying it.
- By March 1962 everything was falling into place, but so was an unusual
- area of low pressure off the East Coast. This storm never developed
- into a hurricane but was the lowest pressure system ever recorded for
- the area. Settlement on the park was to be on March 15, 1962. The
- Great Atlantic Storm hit on March 6th, devastating the entire eastern
- seacoast. The Fasnacht family traveled down from Hershey, and the
- Dentino family came up from Florida to assess the situation. Both
- families agreed to go ahead with the deal after they worked out an
- allowance for the damage.
- The rest is history: expanding the park here and there, adding rides
- and games, and buying adjoining properties for the growing family and
- their children. From the original 1st and 2nd generation, there are
- now over twenty 3rd and 4th generation family members who are directly
- involved with the business. They, along with over ten 5th generation
- members coming up closely behind them, are all continuing that heritage
- that began half a century ago!
+Think about it is exactly what the family did when they returned home. It
+became a recurring topic in the Fasnacht family. They called Mr. Dentino and
+decided to go through with the purchase.
- If you would like to hear more about the Funland story check out the
- links below!
- CBS Sunday Morning: [81]“Old-Fashion Fun: Funland”
- Content Delaware Documentary: [82] “Nothing Beats Fun: The Funland
- Story!”.
- The Cape Gazette also featured a [83]Funland Retrospective which marked
- our 50th year of fun at the Rehoboth seashore.
+By March 1962 everything was falling into place, but so was an unusual area of
+low pressure off the East Coast. This storm never developed into a hurricane
+but was the lowest pressure system ever recorded for the area. Settlement on
+the park was to be on March 15, 1962. The Great Atlantic Storm hit on March
+6th, devastating the entire eastern seacoast. The Fasnacht family traveled
+down from Hershey, and the Dentino family came up from Florida to assess the
+situation. Both families agreed to go ahead with the deal after they worked
+out an allowance for the damage.
+
+
+The rest is history: expanding the park here and there, adding rides and games,
+and buying adjoining properties for the growing family and their children.
+ From the original 1st and 2nd generation, there are now over twenty 3rd and
+4th generation family members who are directly involved with the business.
+They, along with over ten 5th generation members coming up closely behind them,
+are all continuing that heritage that began half a century ago!
+
+
+If you would like to hear more about the Funland story check out the links
+below!
+
+CBS Sunday Morning: [93]“Old-Fashion Fun: Funland”
+Content Delaware Documentary: [94] “Nothing Beats Fun: The Funland Story!”.
+The Cape Gazette also featured a [95]Funland Retrospective which marked our
+50th year of fun at the Rehoboth seashore.
Subscribe
- Sign up to stay up to date with all announcements!
- ____________________Email
- (BUTTON) Sign up
- * [84]Seasonal Rides/ Games
- * [85]Park Policies
- * [86]Rider Safety Guide
- * [87]Contact Us
- * [88]Subscribe
+Sign up to stay up to date with all announcements!
- Funland
+[96][ ]Email
+Sign up
+ • [98]Seasonal Rides/ Games
+ • [99]Park Policies
+ • [100]Rider Safety Guide
+ • [101]Contact Us
+ • [102]Subscribe
- Copyright © 2020 Funland - All Rights Reserved.
+[103][104][105]
-References
+Funland
- Visible links:
- 1. https://funlandrehoboth.com/
- 2. https://funlandrehoboth.com/park-information
- 3. https://funlandrehoboth.com/rides
- 4. https://funlandrehoboth.com/games
- 5. https://funlandrehoboth.com/retail-&-food
- 6. https://funlandrehoboth.com/schedule
- 7. https://funlandrehoboth.com/employee-testimonials
- 8. https://funlandrehoboth.com/seasonal-rides/-games
- 9. https://funlandrehoboth.com/maintenance-manager
- 10. https://funlandrehoboth.com/maintenance-mechanic
- 11. https://funlandrehoboth.com/seasonal-park-cleaner
- 12. https://funlandrehoboth.com/tickets
- 13. https://funlandrehoboth.com/height-restrictions
- 14. https://funlandrehoboth.com/photos
- 15. https://funlandrehoboth.com/contact-us
- 16. https://funlandrehoboth.com/report-a-lost-item
- 17. https://funlandrehoboth.com/
- 18. https://funlandrehoboth.com/park-information
- 19. https://funlandrehoboth.com/rides
- 20. https://funlandrehoboth.com/games
- 21. https://funlandrehoboth.com/retail-&-food
- 22. https://funlandrehoboth.com/schedule
- 23. https://funlandrehoboth.com/employee-testimonials
- 24. https://funlandrehoboth.com/seasonal-rides/-games
- 25. https://funlandrehoboth.com/maintenance-manager
- 26. https://funlandrehoboth.com/maintenance-mechanic
- 27. https://funlandrehoboth.com/seasonal-park-cleaner
- 28. https://funlandrehoboth.com/tickets
- 29. https://funlandrehoboth.com/height-restrictions
- 30. https://funlandrehoboth.com/photos
- 31. https://funlandrehoboth.com/contact-us
- 32. https://funlandrehoboth.com/report-a-lost-item
- 33. https://funlandrehoboth.com/
- 34. https://funlandrehoboth.com/park-information
- 35. https://funlandrehoboth.com/rides
- 36. https://funlandrehoboth.com/games
- 37. https://funlandrehoboth.com/retail-&-food
- 38. https://funlandrehoboth.com/schedule
- 39. https://funlandrehoboth.com/employee-testimonials
- 40. https://funlandrehoboth.com/seasonal-rides/-games
- 41. https://funlandrehoboth.com/maintenance-manager
- 42. https://funlandrehoboth.com/maintenance-mechanic
- 43. https://funlandrehoboth.com/seasonal-park-cleaner
- 44. https://funlandrehoboth.com/tickets
- 45. https://funlandrehoboth.com/height-restrictions
- 46. https://funlandrehoboth.com/photos
- 47. https://funlandrehoboth.com/contact-us
- 48. https://funlandrehoboth.com/report-a-lost-item
- 49. https://funlandrehoboth.com/m/account
- 50. https://funlandrehoboth.com/m/account
- 51. https://funlandrehoboth.com/m/account
- 52. https://funlandrehoboth.com/
- 53. https://funlandrehoboth.com/
- 54. https://funlandrehoboth.com/park-information
- 55. https://funlandrehoboth.com/rides
- 56. https://funlandrehoboth.com/games
- 57. https://funlandrehoboth.com/retail-&-food
- 58. https://funlandrehoboth.com/schedule
- 59. https://funlandrehoboth.com/
- 60. https://funlandrehoboth.com/employee-testimonials
- 61. https://funlandrehoboth.com/seasonal-rides/-games
- 62. https://funlandrehoboth.com/maintenance-manager
- 63. https://funlandrehoboth.com/maintenance-mechanic
- 64. https://funlandrehoboth.com/seasonal-park-cleaner
- 65. https://funlandrehoboth.com/
- 66. https://funlandrehoboth.com/tickets
- 67. https://funlandrehoboth.com/height-restrictions
- 68. https://funlandrehoboth.com/photos
- 69. https://funlandrehoboth.com/contact-us
- 70. https://funlandrehoboth.com/report-a-lost-item
- 71. https://funlandrehoboth.com/m/account
- 72. https://funlandrehoboth.com/m/account
- 73. https://funlandrehoboth.com/m/account
- 74. https://funlandrehoboth.com/schedule
- 75. https://funlandrehoboth.com/tickets
- 76. https://funlandrehoboth.com/seasonal-rides/-games
- 77. https://funlandrehoboth.com/rides
- 78. https://funlandrehoboth.com/games
- 79. https://funlandrehoboth.com/park-information
- 80. javascript: window.frameElement.getAttribute("srcdoc");
- 81. https://www.youtube.com/watch?v=7sB9vcZvigA
- 82. http://www.youtube.com/watch?v=eyftYi7p4zs
- 83. http://capegazette.villagesoup.com/p/rehoboths-funland-marks-50-years-of-thrills/104065
- 84. https://funlandrehoboth.com/seasonal-rides/-games
- 85. https://funlandrehoboth.com/park-policies
- 86. https://funlandrehoboth.com/rider-safety-guide
- 87. https://funlandrehoboth.com/contact-us
- 88. https://funlandrehoboth.com/subscribe
+Copyright © 2020 Funland - All Rights Reserved.
- Hidden links:
- 90. https://funlandrehoboth.com/schedule
- 91. https://funlandrehoboth.com/
- 92. https://funlandrehoboth.com/
- 93. https://funlandrehoboth.com/
- 94. https://funlandrehoboth.com/
- 95. https://funlandrehoboth.com/
- 96. https://funlandrehoboth.com/
- 97. https://funlandrehoboth.com/
- 98. https://funlandrehoboth.com/
- 99. https://funlandrehoboth.com/
- 100. https://funlandrehoboth.com/
- 101. https://funlandrehoboth.com/
- 102. https://funlandrehoboth.com/
- 103. https://www.facebook.com/Funland.RehobothBeach?fref=ts
- 104. https://www.instagram.com/funlandrehoboth/
- 105. https://www.twitter.com/FunlandRehoboth
+
+References:
+
+[1] https://funlandrehoboth.com/schedule
+[2] https://funlandrehoboth.com/
+[3] https://funlandrehoboth.com/#
+[4] https://funlandrehoboth.com/park-information
+[5] https://funlandrehoboth.com/rides
+[6] https://funlandrehoboth.com/games
+[7] https://funlandrehoboth.com/retail-%26-food
+[8] https://funlandrehoboth.com/schedule
+[9] https://funlandrehoboth.com/#
+[10] https://funlandrehoboth.com/employee-testimonials
+[11] https://funlandrehoboth.com/seasonal-rides%2F-games
+[12] https://funlandrehoboth.com/maintenance-manager
+[13] https://funlandrehoboth.com/maintenance-mechanic
+[14] https://funlandrehoboth.com/seasonal-park-cleaner
+[15] https://funlandrehoboth.com/#
+[16] https://funlandrehoboth.com/tickets
+[17] https://funlandrehoboth.com/height-restrictions
+[18] https://funlandrehoboth.com/photos
+[19] https://funlandrehoboth.com/contact-us
+[20] https://funlandrehoboth.com/report-a-lost-item
+[21] https://funlandrehoboth.com/
+[22] https://funlandrehoboth.com/
+[23] https://funlandrehoboth.com/#
+[24] https://funlandrehoboth.com/park-information
+[25] https://funlandrehoboth.com/rides
+[26] https://funlandrehoboth.com/games
+[27] https://funlandrehoboth.com/retail-%26-food
+[28] https://funlandrehoboth.com/schedule
+[29] https://funlandrehoboth.com/#
+[30] https://funlandrehoboth.com/employee-testimonials
+[31] https://funlandrehoboth.com/seasonal-rides%2F-games
+[32] https://funlandrehoboth.com/maintenance-manager
+[33] https://funlandrehoboth.com/maintenance-mechanic
+[34] https://funlandrehoboth.com/seasonal-park-cleaner
+[35] https://funlandrehoboth.com/#
+[36] https://funlandrehoboth.com/tickets
+[37] https://funlandrehoboth.com/height-restrictions
+[38] https://funlandrehoboth.com/photos
+[39] https://funlandrehoboth.com/contact-us
+[40] https://funlandrehoboth.com/report-a-lost-item
+[41] https://funlandrehoboth.com/#
+[42] https://funlandrehoboth.com/
+[43] https://funlandrehoboth.com/park-information
+[44] https://funlandrehoboth.com/rides
+[45] https://funlandrehoboth.com/games
+[46] https://funlandrehoboth.com/retail-%26-food
+[47] https://funlandrehoboth.com/schedule
+[48] https://funlandrehoboth.com/employee-testimonials
+[49] https://funlandrehoboth.com/seasonal-rides%2F-games
+[50] https://funlandrehoboth.com/maintenance-manager
+[51] https://funlandrehoboth.com/maintenance-mechanic
+[52] https://funlandrehoboth.com/seasonal-park-cleaner
+[53] https://funlandrehoboth.com/tickets
+[54] https://funlandrehoboth.com/height-restrictions
+[55] https://funlandrehoboth.com/photos
+[56] https://funlandrehoboth.com/contact-us
+[57] https://funlandrehoboth.com/report-a-lost-item
+[58] https://funlandrehoboth.com/#
+[59] https://funlandrehoboth.com/#
+[60] https://funlandrehoboth.com/m/account
+[61] https://funlandrehoboth.com/m/account
+[62] https://funlandrehoboth.com/m/account
+[63] https://funlandrehoboth.com/#
+[64] https://funlandrehoboth.com/
+[65] https://funlandrehoboth.com/
+[66] https://funlandrehoboth.com/#
+[67] https://funlandrehoboth.com/park-information
+[68] https://funlandrehoboth.com/rides
+[69] https://funlandrehoboth.com/games
+[70] https://funlandrehoboth.com/retail-%26-food
+[71] https://funlandrehoboth.com/schedule
+[72] https://funlandrehoboth.com/#
+[73] https://funlandrehoboth.com/employee-testimonials
+[74] https://funlandrehoboth.com/seasonal-rides%2F-games
+[75] https://funlandrehoboth.com/maintenance-manager
+[76] https://funlandrehoboth.com/maintenance-mechanic
+[77] https://funlandrehoboth.com/seasonal-park-cleaner
+[78] https://funlandrehoboth.com/#
+[79] https://funlandrehoboth.com/tickets
+[80] https://funlandrehoboth.com/height-restrictions
+[81] https://funlandrehoboth.com/photos
+[82] https://funlandrehoboth.com/contact-us
+[83] https://funlandrehoboth.com/report-a-lost-item
+[84] https://funlandrehoboth.com/m/account
+[85] https://funlandrehoboth.com/m/account
+[86] https://funlandrehoboth.com/m/account
+[87] https://funlandrehoboth.com/schedule
+[88] https://funlandrehoboth.com/tickets
+[89] https://funlandrehoboth.com/seasonal-rides%2F-games
+[90] https://funlandrehoboth.com/rides
+[91] https://funlandrehoboth.com/games
+[92] https://funlandrehoboth.com/park-information
+[93] https://www.youtube.com/watch?v=7sB9vcZvigA
+[94] http://www.youtube.com/watch?v=eyftYi7p4zs
+[95] http://capegazette.villagesoup.com/p/rehoboths-funland-marks-50-years-of-thrills/104065
+[98] https://funlandrehoboth.com/seasonal-rides%2F-games
+[99] https://funlandrehoboth.com/park-policies
+[100] https://funlandrehoboth.com/rider-safety-guide
+[101] https://funlandrehoboth.com/contact-us
+[102] https://funlandrehoboth.com/subscribe
+[103] https://www.facebook.com/Funland.RehobothBeach?fref=ts
+[104] https://www.instagram.com/funlandrehoboth/
+[105] https://www.twitter.com/FunlandRehoboth
diff --git a/static/archive/go-dev-vfin4x.txt b/static/archive/go-dev-vfin4x.txt
index e8ace61..436f82e 100644
--- a/static/archive/go-dev-vfin4x.txt
+++ b/static/archive/go-dev-vfin4x.txt
@@ -1,307 +1,321 @@
- IFRAME: [1]https://www.googletagmanager.com/ns.html?id=GTM-W8MVQXG
+[1] Go
+[2] Skip to Main Content
- [2]Go
- [3]Skip to Main Content
- * [4]Why Go arrow_drop_down
- Press Enter to activate/deactivate dropdown
- + [5]Case Studies
- Common problems companies solve with Go
- + [6]Use Cases
- Stories about how and why companies use Go
- + [7]Security
- How Go can help keep you secure by default
- * [8]Learn
- Press Enter to activate/deactivate dropdown
- * [9]Docs arrow_drop_down
- Press Enter to activate/deactivate dropdown
- + [10]Effective Go
- Tips for writing clear, performant, and idiomatic Go code
- + [11]Go User Manual
- A complete introduction to building software with Go
- + [12]Standard library
- Reference documentation for Go's standard library
- + [13]Release Notes
- Learn what's new in each Go release
- * [14]Packages
- Press Enter to activate/deactivate dropdown
- * [15]Community arrow_drop_down
- Press Enter to activate/deactivate dropdown
- + [16]Recorded Talks
- Videos from prior events
- + [17]Meetups open_in_new
- Meet other local Go developers
- + [18]Conferences open_in_new
- Learn and network with Go developers from around the world
- + [19]Go blog
- The Go project's official blog.
- + [20]Go project
- Get help and stay informed from Go
- + Get connected
- [21][google-groups.svg] [22][github.svg] [23][twitter.svg]
- [24][reddit.svg] [25][slack.svg] [26][stack-overflow.svg]
+ • [3] Why Go arrow_drop_down
+ Press Enter to activate/deactivate dropdown
+ □ [4] Case Studies
- (BUTTON)
+ Common problems companies solve with Go
- [27]Go.
+ □ [5] Use Cases
- * [28]Why Go navigate_next
- [29]navigate_beforeWhy Go
- + [30]Case Studies
- + [31]Use Cases
- + [32]Security
- * [33]Learn
- * [34]Docs navigate_next
- [35]navigate_beforeDocs
- + [36]Effective Go
- + [37]Go User Manual
- + [38]Standard library
- + [39]Release Notes
- * [40]Packages
- * [41]Community navigate_next
- [42]navigate_beforeCommunity
- + [43]Recorded Talks
- + [44]Meetups open_in_new
- + [45]Conferences open_in_new
- + [46]Go blog
- + [47]Go project
- + Get connected
- [48][google-groups.svg] [49][github.svg] [50][twitter.svg]
- [51][reddit.svg] [52][slack.svg] [53][stack-overflow.svg]
+ Stories about how and why companies use Go
- 1. [54]Documentation
- 2. [55]Effective Go
+ □ [6] Security
- Effective Go
+ How Go can help keep you secure by default
+
+ • [7] Learn
+ Press Enter to activate/deactivate dropdown
+ • [8] Docs arrow_drop_down
+ Press Enter to activate/deactivate dropdown
+ □ [9] Effective Go
+
+ Tips for writing clear, performant, and idiomatic Go code
+
+ □ [10] Go User Manual
+
+ A complete introduction to building software with Go
+
+ □ [11] Standard library
+
+ Reference documentation for Go's standard library
+
+ □ [12] Release Notes
+
+ Learn what's new in each Go release
+
+ • [13] Packages
+ Press Enter to activate/deactivate dropdown
+ • [14] Community arrow_drop_down
+ Press Enter to activate/deactivate dropdown
+ □ [15] Recorded Talks
+
+ Videos from prior events
+
+ □ [16] Meetups open_in_new
+
+ Meet other local Go developers
+
+ □ [17] Conferences open_in_new
+
+ Learn and network with Go developers from around the world
+
+ □ [18] Go blog
+
+ The Go project's official blog.
+
+ □ [19] Go project
+
+ Get help and stay informed from Go
+
+ □ Get connected
+
+ [20][google-gro] [21][github] [22][twitter] [23][reddit] [24][slack]
+ [25][stack-over]
+
+[27] Go.
+
+ • [28]Why Go navigate_next
+ [29]navigate_beforeWhy Go
+ □ [30] Case Studies
+ □ [31] Use Cases
+ □ [32] Security
+ • [33]Learn
+ • [34]Docs navigate_next
+ [35]navigate_beforeDocs
+ □ [36] Effective Go
+ □ [37] Go User Manual
+ □ [38] Standard library
+ □ [39] Release Notes
+ • [40]Packages
+ • [41]Community navigate_next
+ [42]navigate_beforeCommunity
+ □ [43] Recorded Talks
+ □ [44] Meetups open_in_new
+ □ [45] Conferences open_in_new
+ □ [46] Go blog
+ □ [47] Go project
+ □ Get connected
+ [48][google-gro] [49][github] [50][twitter] [51][reddit] [52][slack]
+ [53][stack-over]
+
+ 1. [54] Documentation
+ 2. [55] Effective Go
+
+Effective Go
Introduction
- Go is a new language. Although it borrows ideas from existing
- languages, it has unusual properties that make effective Go programs
- different in character from programs written in its relatives. A
- straightforward translation of a C++ or Java program into Go is
- unlikely to produce a satisfactory result—Java programs are written in
- Java, not Go. On the other hand, thinking about the problem from a Go
- perspective could produce a successful but quite different program. In
- other words, to write Go well, it's important to understand its
- properties and idioms. It's also important to know the established
- conventions for programming in Go, such as naming, formatting, program
- construction, and so on, so that programs you write will be easy for
- other Go programmers to understand.
+Go is a new language. Although it borrows ideas from existing languages, it has
+unusual properties that make effective Go programs different in character from
+programs written in its relatives. A straightforward translation of a C++ or
+Java program into Go is unlikely to produce a satisfactory result—Java programs
+are written in Java, not Go. On the other hand, thinking about the problem from
+a Go perspective could produce a successful but quite different program. In
+other words, to write Go well, it's important to understand its properties and
+idioms. It's also important to know the established conventions for programming
+in Go, such as naming, formatting, program construction, and so on, so that
+programs you write will be easy for other Go programmers to understand.
- This document gives tips for writing clear, idiomatic Go code. It
- augments the [56]language specification, the [57]Tour of Go, and
- [58]How to Write Go Code, all of which you should read first.
+This document gives tips for writing clear, idiomatic Go code. It augments the
+[56]language specification, the [57]Tour of Go, and [58]How to Write Go Code,
+all of which you should read first.
- Note added January, 2022: This document was written for Go's release in
- 2009, and has not been updated significantly since. Although it is a
- good guide to understand how to use the language itself, thanks to the
- stability of the language, it says little about the libraries and
- nothing about significant changes to the Go ecosystem since it was
- written, such as the build system, testing, modules, and polymorphism.
- There are no plans to update it, as so much has happened and a large
- and growing set of documents, blogs, and books do a fine job of
- describing modern Go usage. Effective Go continues to be useful, but
- the reader should understand it is far from a complete guide. See
- [59]issue 28782 for context.
+Note added January, 2022: This document was written for Go's release in 2009,
+and has not been updated significantly since. Although it is a good guide to
+understand how to use the language itself, thanks to the stability of the
+language, it says little about the libraries and nothing about significant
+changes to the Go ecosystem since it was written, such as the build system,
+testing, modules, and polymorphism. There are no plans to update it, as so much
+has happened and a large and growing set of documents, blogs, and books do a
+fine job of describing modern Go usage. Effective Go continues to be useful,
+but the reader should understand it is far from a complete guide. See [59]issue
+28782 for context.
- Examples
+Examples
- The [60]Go package sources are intended to serve not only as the core
- library but also as examples of how to use the language. Moreover, many
- of the packages contain working, self-contained executable examples you
- can run directly from the [61]go.dev web site, such as [62]this one (if
- necessary, click on the word "Example" to open it up). If you have a
- question about how to approach a problem or how something might be
- implemented, the documentation, code and examples in the library can
- provide answers, ideas and background.
+The [60]Go package sources are intended to serve not only as the core library
+but also as examples of how to use the language. Moreover, many of the packages
+contain working, self-contained executable examples you can run directly from
+the [61]go.dev web site, such as [62]this one (if necessary, click on the word
+"Example" to open it up). If you have a question about how to approach a
+problem or how something might be implemented, the documentation, code and
+examples in the library can provide answers, ideas and background.
Formatting
- Formatting issues are the most contentious but the least consequential.
- People can adapt to different formatting styles but it's better if they
- don't have to, and less time is devoted to the topic if everyone
- adheres to the same style. The problem is how to approach this Utopia
- without a long prescriptive style guide.
+Formatting issues are the most contentious but the least consequential. People
+can adapt to different formatting styles but it's better if they don't have to,
+and less time is devoted to the topic if everyone adheres to the same style.
+The problem is how to approach this Utopia without a long prescriptive style
+guide.
- With Go we take an unusual approach and let the machine take care of
- most formatting issues. The gofmt program (also available as go fmt,
- which operates at the package level rather than source file level)
- reads a Go program and emits the source in a standard style of
- indentation and vertical alignment, retaining and if necessary
- reformatting comments. If you want to know how to handle some new
- layout situation, run gofmt; if the answer doesn't seem right,
- rearrange your program (or file a bug about gofmt), don't work around
- it.
+With Go we take an unusual approach and let the machine take care of most
+formatting issues. The gofmt program (also available as go fmt, which operates
+at the package level rather than source file level) reads a Go program and
+emits the source in a standard style of indentation and vertical alignment,
+retaining and if necessary reformatting comments. If you want to know how to
+handle some new layout situation, run gofmt; if the answer doesn't seem right,
+rearrange your program (or file a bug about gofmt), don't work around it.
+
+As an example, there's no need to spend time lining up the comments on the
+fields of a structure. Gofmt will do that for you. Given the declaration
- As an example, there's no need to spend time lining up the comments on
- the fields of a structure. Gofmt will do that for you. Given the
- declaration
type T struct {
name string // name of the object
value int // its value
}
- gofmt will line up the columns:
+gofmt will line up the columns:
+
type T struct {
name string // name of the object
value int // its value
}
- All Go code in the standard packages has been formatted with gofmt.
+All Go code in the standard packages has been formatted with gofmt.
- Some formatting details remain. Very briefly:
+Some formatting details remain. Very briefly:
- Indentation
- We use tabs for indentation and gofmt emits them by default. Use
- spaces only if you must.
+Indentation
+ We use tabs for indentation and gofmt emits them by default. Use spaces
+ only if you must.
+Line length
+ Go has no line length limit. Don't worry about overflowing a punched card.
+ If a line feels too long, wrap it and indent with an extra tab.
+Parentheses
+ Go needs fewer parentheses than C and Java: control structures (if, for,
+ switch) do not have parentheses in their syntax. Also, the operator
+ precedence hierarchy is shorter and clearer, so
- Line length
- Go has no line length limit. Don't worry about overflowing a
- punched card. If a line feels too long, wrap it and indent with
- an extra tab.
+ x<<8 + y<<16
- Parentheses
- Go needs fewer parentheses than C and Java: control structures
- (if, for, switch) do not have parentheses in their syntax. Also,
- the operator precedence hierarchy is shorter and clearer, so
-
-x<<8 + y<<16
-
- means what the spacing implies, unlike in the other languages.
+ means what the spacing implies, unlike in the other languages.
Commentary
- Go provides C-style /* */ block comments and C++-style // line
- comments. Line comments are the norm; block comments appear mostly as
- package comments, but are useful within an expression or to disable
- large swaths of code.
+Go provides C-style /* */ block comments and C++-style // line comments. Line
+comments are the norm; block comments appear mostly as package comments, but
+are useful within an expression or to disable large swaths of code.
- Comments that appear before top-level declarations, with no intervening
- newlines, are considered to document the declaration itself. These “doc
- comments” are the primary documentation for a given Go package or
- command. For more about doc comments, see “[63]Go Doc Comments”.
+Comments that appear before top-level declarations, with no intervening
+newlines, are considered to document the declaration itself. These “doc
+comments” are the primary documentation for a given Go package or command. For
+more about doc comments, see “[63]Go Doc Comments”.
Names
- Names are as important in Go as in any other language. They even have
- semantic effect: the visibility of a name outside a package is
- determined by whether its first character is upper case. It's therefore
- worth spending a little time talking about naming conventions in Go
- programs.
+Names are as important in Go as in any other language. They even have semantic
+effect: the visibility of a name outside a package is determined by whether its
+first character is upper case. It's therefore worth spending a little time
+talking about naming conventions in Go programs.
- Package names
+Package names
+
+When a package is imported, the package name becomes an accessor for the
+contents. After
- When a package is imported, the package name becomes an accessor for
- the contents. After
import "bytes"
- the importing package can talk about bytes.Buffer. It's helpful if
- everyone using the package can use the same name to refer to its
- contents, which implies that the package name should be good: short,
- concise, evocative. By convention, packages are given lower case,
- single-word names; there should be no need for underscores or
- mixedCaps. Err on the side of brevity, since everyone using your
- package will be typing that name. And don't worry about collisions a
- priori. The package name is only the default name for imports; it need
- not be unique across all source code, and in the rare case of a
- collision the importing package can choose a different name to use
- locally. In any case, confusion is rare because the file name in the
- import determines just which package is being used.
+the importing package can talk about bytes.Buffer. It's helpful if everyone
+using the package can use the same name to refer to its contents, which implies
+that the package name should be good: short, concise, evocative. By convention,
+packages are given lower case, single-word names; there should be no need for
+underscores or mixedCaps. Err on the side of brevity, since everyone using your
+package will be typing that name. And don't worry about collisions a priori.
+The package name is only the default name for imports; it need not be unique
+across all source code, and in the rare case of a collision the importing
+package can choose a different name to use locally. In any case, confusion is
+rare because the file name in the import determines just which package is being
+used.
- Another convention is that the package name is the base name of its
- source directory; the package in src/encoding/base64 is imported as
- "encoding/base64" but has name base64, not encoding_base64 and not
- encodingBase64.
+Another convention is that the package name is the base name of its source
+directory; the package in src/encoding/base64 is imported as "encoding/base64"
+but has name base64, not encoding_base64 and not encodingBase64.
- The importer of a package will use the name to refer to its contents,
- so exported names in the package can use that fact to avoid repetition.
- (Don't use the import . notation, which can simplify tests that must
- run outside the package they are testing, but should otherwise be
- avoided.) For instance, the buffered reader type in the bufio package
- is called Reader, not BufReader, because users see it as bufio.Reader,
- which is a clear, concise name. Moreover, because imported entities are
- always addressed with their package name, bufio.Reader does not
- conflict with io.Reader. Similarly, the function to make new instances
- of ring.Ring—which is the definition of a constructor in Go—would
- normally be called NewRing, but since Ring is the only type exported by
- the package, and since the package is called ring, it's called just
- New, which clients of the package see as ring.New. Use the package
- structure to help you choose good names.
+The importer of a package will use the name to refer to its contents, so
+exported names in the package can use that fact to avoid repetition. (Don't use
+the import . notation, which can simplify tests that must run outside the
+package they are testing, but should otherwise be avoided.) For instance, the
+buffered reader type in the bufio package is called Reader, not BufReader,
+because users see it as bufio.Reader, which is a clear, concise name. Moreover,
+because imported entities are always addressed with their package name,
+bufio.Reader does not conflict with io.Reader. Similarly, the function to make
+new instances of ring.Ring—which is the definition of a constructor in Go—would
+normally be called NewRing, but since Ring is the only type exported by the
+package, and since the package is called ring, it's called just New, which
+clients of the package see as ring.New. Use the package structure to help you
+choose good names.
- Another short example is once.Do; once.Do(setup) reads well and would
- not be improved by writing once.DoOrWaitUntilDone(setup). Long names
- don't automatically make things more readable. A helpful doc comment
- can often be more valuable than an extra long name.
+Another short example is once.Do; once.Do(setup) reads well and would not be
+improved by writing once.DoOrWaitUntilDone(setup). Long names don't
+automatically make things more readable. A helpful doc comment can often be
+more valuable than an extra long name.
- Getters
+Getters
+
+Go doesn't provide automatic support for getters and setters. There's nothing
+wrong with providing getters and setters yourself, and it's often appropriate
+to do so, but it's neither idiomatic nor necessary to put Get into the getter's
+name. If you have a field called owner (lower case, unexported), the getter
+method should be called Owner (upper case, exported), not GetOwner. The use of
+upper-case names for export provides the hook to discriminate the field from
+the method. A setter function, if needed, will likely be called SetOwner. Both
+names read well in practice:
- Go doesn't provide automatic support for getters and setters. There's
- nothing wrong with providing getters and setters yourself, and it's
- often appropriate to do so, but it's neither idiomatic nor necessary to
- put Get into the getter's name. If you have a field called owner (lower
- case, unexported), the getter method should be called Owner (upper
- case, exported), not GetOwner. The use of upper-case names for export
- provides the hook to discriminate the field from the method. A setter
- function, if needed, will likely be called SetOwner. Both names read
- well in practice:
owner := obj.Owner()
if owner != user {
obj.SetOwner(user)
}
- Interface names
+Interface names
- By convention, one-method interfaces are named by the method name plus
- an -er suffix or similar modification to construct an agent noun:
- Reader, Writer, Formatter, CloseNotifier etc.
+By convention, one-method interfaces are named by the method name plus an -er
+suffix or similar modification to construct an agent noun: Reader, Writer,
+Formatter, CloseNotifier etc.
- There are a number of such names and it's productive to honor them and
- the function names they capture. Read, Write, Close, Flush, String and
- so on have canonical signatures and meanings. To avoid confusion, don't
- give your method one of those names unless it has the same signature
- and meaning. Conversely, if your type implements a method with the same
- meaning as a method on a well-known type, give it the same name and
- signature; call your string-converter method String not ToString.
+There are a number of such names and it's productive to honor them and the
+function names they capture. Read, Write, Close, Flush, String and so on have
+canonical signatures and meanings. To avoid confusion, don't give your method
+one of those names unless it has the same signature and meaning. Conversely, if
+your type implements a method with the same meaning as a method on a well-known
+type, give it the same name and signature; call your string-converter method
+String not ToString.
- MixedCaps
+MixedCaps
- Finally, the convention in Go is to use MixedCaps or mixedCaps rather
- than underscores to write multiword names.
+Finally, the convention in Go is to use MixedCaps or mixedCaps rather than
+underscores to write multiword names.
Semicolons
- Like C, Go's formal grammar uses semicolons to terminate statements,
- but unlike in C, those semicolons do not appear in the source. Instead
- the lexer uses a simple rule to insert semicolons automatically as it
- scans, so the input text is mostly free of them.
+Like C, Go's formal grammar uses semicolons to terminate statements, but unlike
+in C, those semicolons do not appear in the source. Instead the lexer uses a
+simple rule to insert semicolons automatically as it scans, so the input text
+is mostly free of them.
+
+The rule is this. If the last token before a newline is an identifier (which
+includes words like int and float64), a basic literal such as a number or
+string constant, or one of the tokens
- The rule is this. If the last token before a newline is an identifier
- (which includes words like int and float64), a basic literal such as a
- number or string constant, or one of the tokens
break continue fallthrough return ++ -- ) }
- the lexer always inserts a semicolon after the token. This could be
- summarized as, “if the newline comes after a token that could end a
- statement, insert a semicolon”.
+the lexer always inserts a semicolon after the token. This could be summarized
+as, “if the newline comes after a token that could end a statement, insert a
+semicolon”.
+
+A semicolon can also be omitted immediately before a closing brace, so a
+statement such as
- A semicolon can also be omitted immediately before a closing brace, so
- a statement such as
go func() { for { dst <- <-src } }()
- needs no semicolons. Idiomatic Go programs have semicolons only in
- places such as for loop clauses, to separate the initializer,
- condition, and continuation elements. They are also necessary to
- separate multiple statements on a line, should you write code that way.
+needs no semicolons. Idiomatic Go programs have semicolons only in places such
+as for loop clauses, to separate the initializer, condition, and continuation
+elements. They are also necessary to separate multiple statements on a line,
+should you write code that way.
+
+One consequence of the semicolon insertion rules is that you cannot put the
+opening brace of a control structure (if, for, switch, or select) on the next
+line. If you do, a semicolon will be inserted before the brace, which could
+cause unwanted effects. Write them like this
- One consequence of the semicolon insertion rules is that you cannot put
- the opening brace of a control structure (if, for, switch, or select)
- on the next line. If you do, a semicolon will be inserted before the
- brace, which could cause unwanted effects. Write them like this
if i < f() {
g()
}
- not like this
+not like this
+
if i < f() // wrong!
{ // wrong!
g()
@@ -309,48 +323,51 @@ if i < f() // wrong!
Control structures
- The control structures of Go are related to those of C but differ in
- important ways. There is no do or while loop, only a slightly
- generalized for; switch is more flexible; if and switch accept an
- optional initialization statement like that of for; break and continue
- statements take an optional label to identify what to break or
- continue; and there are new control structures including a type switch
- and a multiway communications multiplexer, select. The syntax is also
- slightly different: there are no parentheses and the bodies must always
- be brace-delimited.
+The control structures of Go are related to those of C but differ in important
+ways. There is no do or while loop, only a slightly generalized for; switch is
+more flexible; if and switch accept an optional initialization statement like
+that of for; break and continue statements take an optional label to identify
+what to break or continue; and there are new control structures including a
+type switch and a multiway communications multiplexer, select. The syntax is
+also slightly different: there are no parentheses and the bodies must always be
+brace-delimited.
- If
+If
+
+In Go a simple if looks like this:
- In Go a simple if looks like this:
if x > 0 {
return y
}
- Mandatory braces encourage writing simple if statements on multiple
- lines. It's good style to do so anyway, especially when the body
- contains a control statement such as a return or break.
+Mandatory braces encourage writing simple if statements on multiple lines. It's
+good style to do so anyway, especially when the body contains a control
+statement such as a return or break.
+
+Since if and switch accept an initialization statement, it's common to see one
+used to set up a local variable.
- Since if and switch accept an initialization statement, it's common to
- see one used to set up a local variable.
if err := file.Chmod(0664); err != nil {
log.Print(err)
return err
}
- In the Go libraries, you'll find that when an if statement doesn't flow
- into the next statement—that is, the body ends in break, continue,
- goto, or return—the unnecessary else is omitted.
+In the Go libraries, you'll find that when an if statement doesn't flow into
+the next statement—that is, the body ends in break, continue, goto, or
+return—the unnecessary else is omitted.
+
f, err := os.Open(name)
if err != nil {
return err
}
codeUsing(f)
- This is an example of a common situation where code must guard against
- a sequence of error conditions. The code reads well if the successful
- flow of control runs down the page, eliminating error cases as they
- arise. Since error cases tend to end in return statements, the
- resulting code needs no else statements.
+This is an example of a common situation where code must guard against a
+sequence of error conditions. The code reads well if the successful flow of
+control runs down the page, eliminating error cases as they arise. Since error
+cases tend to end in return statements, the resulting code needs no else
+statements.
+
f, err := os.Open(name)
if err != nil {
return err
@@ -362,46 +379,46 @@ if err != nil {
}
codeUsing(f, d)
- Redeclaration and reassignment
+Redeclaration and reassignment
+
+An aside: The last example in the previous section demonstrates a detail of how
+the := short declaration form works. The declaration that calls os.Open reads,
- An aside: The last example in the previous section demonstrates a
- detail of how the := short declaration form works. The declaration that
- calls os.Open reads,
f, err := os.Open(name)
- This statement declares two variables, f and err. A few lines later,
- the call to f.Stat reads,
+This statement declares two variables, f and err. A few lines later, the call
+to f.Stat reads,
+
d, err := f.Stat()
- which looks as if it declares d and err. Notice, though, that err
- appears in both statements. This duplication is legal: err is declared
- by the first statement, but only re-assigned in the second. This means
- that the call to f.Stat uses the existing err variable declared above,
- and just gives it a new value.
+which looks as if it declares d and err. Notice, though, that err appears in
+both statements. This duplication is legal: err is declared by the first
+statement, but only re-assigned in the second. This means that the call to
+f.Stat uses the existing err variable declared above, and just gives it a new
+value.
- In a := declaration a variable v may appear even if it has already been
- declared, provided:
- * this declaration is in the same scope as the existing declaration
- of v (if v is already declared in an outer scope, the declaration
- will create a new variable §),
- * the corresponding value in the initialization is assignable to v,
- and
- * there is at least one other variable that is created by the
- declaration.
+In a := declaration a variable v may appear even if it has already been
+declared, provided:
- This unusual property is pure pragmatism, making it easy to use a
- single err value, for example, in a long if-else chain. You'll see it
- used often.
+ • this declaration is in the same scope as the existing declaration of v (if
+ v is already declared in an outer scope, the declaration will create a new
+ variable §),
+ • the corresponding value in the initialization is assignable to v, and
+ • there is at least one other variable that is created by the declaration.
- § It's worth noting here that in Go the scope of function parameters
- and return values is the same as the function body, even though they
- appear lexically outside the braces that enclose the body.
+This unusual property is pure pragmatism, making it easy to use a single err
+value, for example, in a long if-else chain. You'll see it used often.
- For
+§ It's worth noting here that in Go the scope of function parameters and return
+values is the same as the function body, even though they appear lexically
+outside the braces that enclose the body.
+
+For
+
+The Go for loop is similar to—but not the same as—C's. It unifies for and while
+and there is no do-while. There are three forms, only one of which has
+semicolons.
- The Go for loop is similar to—but not the same as—C's. It unifies for
- and while and there is no do-while. There are three forms, only one of
- which has semicolons.
// Like a C for
for init; condition; post { }
@@ -411,67 +428,73 @@ for condition { }
// Like a C for(;;)
for { }
- Short declarations make it easy to declare the index variable right in
- the loop.
+Short declarations make it easy to declare the index variable right in the
+loop.
+
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
- If you're looping over an array, slice, string, or map, or reading from
- a channel, a range clause can manage the loop.
+If you're looping over an array, slice, string, or map, or reading from a
+channel, a range clause can manage the loop.
+
for key, value := range oldMap {
newMap[key] = value
}
- If you only need the first item in the range (the key or index), drop
- the second:
+If you only need the first item in the range (the key or index), drop the
+second:
+
for key := range m {
if key.expired() {
delete(m, key)
}
}
- If you only need the second item in the range (the value), use the
- blank identifier, an underscore, to discard the first:
+If you only need the second item in the range (the value), use the blank
+identifier, an underscore, to discard the first:
+
sum := 0
for _, value := range array {
sum += value
}
- The blank identifier has many uses, as described in [64]a later
- section.
+The blank identifier has many uses, as described in [64]a later section.
+
+For strings, the range does more work for you, breaking out individual Unicode
+code points by parsing the UTF-8. Erroneous encodings consume one byte and
+produce the replacement rune U+FFFD. (The name (with associated builtin type)
+rune is Go terminology for a single Unicode code point. See [65]the language
+specification for details.) The loop
- For strings, the range does more work for you, breaking out individual
- Unicode code points by parsing the UTF-8. Erroneous encodings consume
- one byte and produce the replacement rune U+FFFD. (The name (with
- associated builtin type) rune is Go terminology for a single Unicode
- code point. See [65]the language specification for details.) The loop
for pos, char := range "日本\x80語" { // \x80 is an illegal UTF-8 encoding
fmt.Printf("character %#U starts at byte position %d\n", char, pos)
}
- prints
+prints
+
character U+65E5 '日' starts at byte position 0
character U+672C '本' starts at byte position 3
character U+FFFD '�' starts at byte position 6
character U+8A9E '語' starts at byte position 7
- Finally, Go has no comma operator and ++ and -- are statements not
- expressions. Thus if you want to run multiple variables in a for you
- should use parallel assignment (although that precludes ++ and --).
+Finally, Go has no comma operator and ++ and -- are statements not expressions.
+Thus if you want to run multiple variables in a for you should use parallel
+assignment (although that precludes ++ and --).
+
// Reverse a
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i]
}
- Switch
+Switch
+
+Go's switch is more general than C's. The expressions need not be constants or
+even integers, the cases are evaluated top to bottom until a match is found,
+and if the switch has no expression it switches on true. It's therefore
+possible—and idiomatic—to write an if-else-if-else chain as a switch.
- Go's switch is more general than C's. The expressions need not be
- constants or even integers, the cases are evaluated top to bottom until
- a match is found, and if the switch has no expression it switches on
- true. It's therefore possible—and idiomatic—to write an if-else-if-else
- chain as a switch.
func unhex(c byte) byte {
switch {
case '0' <= c && c <= '9':
@@ -484,8 +507,9 @@ func unhex(c byte) byte {
return 0
}
- There is no automatic fall through, but cases can be presented in
- comma-separated lists.
+There is no automatic fall through, but cases can be presented in
+comma-separated lists.
+
func shouldEscape(c byte) bool {
switch c {
case ' ', '?', '&', '=', '#', '+', '%':
@@ -494,11 +518,12 @@ func shouldEscape(c byte) bool {
return false
}
- Although they are not nearly as common in Go as some other C-like
- languages, break statements can be used to terminate a switch early.
- Sometimes, though, it's necessary to break out of a surrounding loop,
- not the switch, and in Go that can be accomplished by putting a label
- on the loop and "breaking" to that label. This example shows both uses.
+Although they are not nearly as common in Go as some other C-like languages,
+break statements can be used to terminate a switch early. Sometimes, though,
+it's necessary to break out of a surrounding loop, not the switch, and in Go
+that can be accomplished by putting a label on the loop and "breaking" to that
+label. This example shows both uses.
+
Loop:
for n := 0; n < len(src); n += size {
switch {
@@ -522,11 +547,12 @@ Loop:
}
}
- Of course, the continue statement also accepts an optional label but it
- applies only to loops.
+Of course, the continue statement also accepts an optional label but it applies
+only to loops.
+
+To close this section, here's a comparison routine for byte slices that uses
+two switch statements:
- To close this section, here's a comparison routine for byte slices that
- uses two switch statements:
// Compare returns an integer comparing the two byte slices,
// lexicographically.
// The result will be 0 if a == b, -1 if a < b, and +1 if a > b
@@ -548,15 +574,15 @@ func Compare(a, b []byte) int {
return 0
}
- Type switch
+Type switch
+
+A switch can also be used to discover the dynamic type of an interface
+variable. Such a type switch uses the syntax of a type assertion with the
+keyword type inside the parentheses. If the switch declares a variable in the
+expression, the variable will have the corresponding type in each clause. It's
+also idiomatic to reuse the name in such cases, in effect declaring a new
+variable with the same name but a different type in each case.
- A switch can also be used to discover the dynamic type of an interface
- variable. Such a type switch uses the syntax of a type assertion with
- the keyword type inside the parentheses. If the switch declares a
- variable in the expression, the variable will have the corresponding
- type in each clause. It's also idiomatic to reuse the name in such
- cases, in effect declaring a new variable with the same name but a
- different type in each case.
var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
@@ -574,28 +600,29 @@ case *int:
Functions
- Multiple return values
+Multiple return values
- One of Go's unusual features is that functions and methods can return
- multiple values. This form can be used to improve on a couple of clumsy
- idioms in C programs: in-band error returns such as -1 for EOF and
- modifying an argument passed by address.
+One of Go's unusual features is that functions and methods can return multiple
+values. This form can be used to improve on a couple of clumsy idioms in C
+programs: in-band error returns such as -1 for EOF and modifying an argument
+passed by address.
+
+In C, a write error is signaled by a negative count with the error code
+secreted away in a volatile location. In Go, Write can return a count and an
+error: “Yes, you wrote some bytes but not all of them because you filled the
+device”. The signature of the Write method on files from package os is:
- In C, a write error is signaled by a negative count with the error code
- secreted away in a volatile location. In Go, Write can return a count
- and an error: “Yes, you wrote some bytes but not all of them because
- you filled the device”. The signature of the Write method on files from
- package os is:
func (file *File) Write(b []byte) (n int, err error)
- and as the documentation says, it returns the number of bytes written
- and a non-nil error when n != len(b). This is a common style; see the
- section on error handling for more examples.
+and as the documentation says, it returns the number of bytes written and a
+non-nil error when n != len(b). This is a common style; see the section on
+error handling for more examples.
+
+A similar approach obviates the need to pass a pointer to a return value to
+simulate a reference parameter. Here's a simple-minded function to grab a
+number from a position in a byte slice, returning the number and the next
+position.
- A similar approach obviates the need to pass a pointer to a return
- value to simulate a reference parameter. Here's a simple-minded
- function to grab a number from a position in a byte slice, returning
- the number and the next position.
func nextInt(b []byte, i int) (int, int) {
for ; i < len(b) && !isDigit(b[i]); i++ {
}
@@ -606,29 +633,31 @@ func nextInt(b []byte, i int) (int, int) {
return x, i
}
- You could use it to scan the numbers in an input slice b like this:
+You could use it to scan the numbers in an input slice b like this:
+
for i := 0; i < len(b); {
x, i = nextInt(b, i)
fmt.Println(x)
}
- Named result parameters
+Named result parameters
- The return or result "parameters" of a Go function can be given names
- and used as regular variables, just like the incoming parameters. When
- named, they are initialized to the zero values for their types when the
- function begins; if the function executes a return statement with no
- arguments, the current values of the result parameters are used as the
- returned values.
+The return or result "parameters" of a Go function can be given names and used
+as regular variables, just like the incoming parameters. When named, they are
+initialized to the zero values for their types when the function begins; if the
+function executes a return statement with no arguments, the current values of
+the result parameters are used as the returned values.
+
+The names are not mandatory but they can make code shorter and clearer: they're
+documentation. If we name the results of nextInt it becomes obvious which
+returned int is which.
- The names are not mandatory but they can make code shorter and clearer:
- they're documentation. If we name the results of nextInt it becomes
- obvious which returned int is which.
func nextInt(b []byte, pos int) (value, nextPos int) {
- Because named results are initialized and tied to an unadorned return,
- they can simplify as well as clarify. Here's a version of io.ReadFull
- that uses them well:
+Because named results are initialized and tied to an unadorned return, they can
+simplify as well as clarify. Here's a version of io.ReadFull that uses them
+well:
+
func ReadFull(r Reader, buf []byte) (n int, err error) {
for len(buf) > 0 && err == nil {
var nr int
@@ -639,14 +668,14 @@ func ReadFull(r Reader, buf []byte) (n int, err error) {
return
}
- Defer
+Defer
+
+Go's defer statement schedules a function call (the deferred function) to be
+run immediately before the function executing the defer returns. It's an
+unusual but effective way to deal with situations such as resources that must
+be released regardless of which path a function takes to return. The canonical
+examples are unlocking a mutex or closing a file.
- Go's defer statement schedules a function call (the deferred function)
- to be run immediately before the function executing the defer returns.
- It's an unusual but effective way to deal with situations such as
- resources that must be released regardless of which path a function
- takes to return. The canonical examples are unlocking a mutex or
- closing a file.
// Contents returns the file's contents as a string.
func Contents(filename string) (string, error) {
f, err := os.Open(filename)
@@ -670,26 +699,27 @@ func Contents(filename string) (string, error) {
return string(result), nil // f will be closed if we return here.
}
- Deferring a call to a function such as Close has two advantages. First,
- it guarantees that you will never forget to close the file, a mistake
- that's easy to make if you later edit the function to add a new return
- path. Second, it means that the close sits near the open, which is much
- clearer than placing it at the end of the function.
+Deferring a call to a function such as Close has two advantages. First, it
+guarantees that you will never forget to close the file, a mistake that's easy
+to make if you later edit the function to add a new return path. Second, it
+means that the close sits near the open, which is much clearer than placing it
+at the end of the function.
+
+The arguments to the deferred function (which include the receiver if the
+function is a method) are evaluated when the defer executes, not when the call
+executes. Besides avoiding worries about variables changing values as the
+function executes, this means that a single deferred call site can defer
+multiple function executions. Here's a silly example.
- The arguments to the deferred function (which include the receiver if
- the function is a method) are evaluated when the defer executes, not
- when the call executes. Besides avoiding worries about variables
- changing values as the function executes, this means that a single
- deferred call site can defer multiple function executions. Here's a
- silly example.
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
- Deferred functions are executed in LIFO order, so this code will cause
- 4 3 2 1 0 to be printed when the function returns. A more plausible
- example is a simple way to trace function execution through the
- program. We could write a couple of simple tracing routines like this:
+Deferred functions are executed in LIFO order, so this code will cause 4 3 2 1
+0 to be printed when the function returns. A more plausible example is a simple
+way to trace function execution through the program. We could write a couple of
+simple tracing routines like this:
+
func trace(s string) { fmt.Println("entering:", s) }
func untrace(s string) { fmt.Println("leaving:", s) }
@@ -700,9 +730,10 @@ func a() {
// do something....
}
- We can do better by exploiting the fact that arguments to deferred
- functions are evaluated when the defer executes. The tracing routine
- can set up the argument to the untracing routine. This example:
+We can do better by exploiting the fact that arguments to deferred functions
+are evaluated when the defer executes. The tracing routine can set up the
+argument to the untracing routine. This example:
+
func trace(s string) string {
fmt.Println("entering:", s)
return s
@@ -727,7 +758,8 @@ func main() {
b()
}
- prints
+prints
+
entering: b
in b
entering: a
@@ -735,51 +767,54 @@ in a
leaving: a
leaving: b
- For programmers accustomed to block-level resource management from
- other languages, defer may seem peculiar, but its most interesting and
- powerful applications come precisely from the fact that it's not
- block-based but function-based. In the section on panic and recover
- we'll see another example of its possibilities.
+For programmers accustomed to block-level resource management from other
+languages, defer may seem peculiar, but its most interesting and powerful
+applications come precisely from the fact that it's not block-based but
+function-based. In the section on panic and recover we'll see another example
+of its possibilities.
Data
- Allocation with new
+Allocation with new
- Go has two allocation primitives, the built-in functions new and make.
- They do different things and apply to different types, which can be
- confusing, but the rules are simple. Let's talk about new first. It's a
- built-in function that allocates memory, but unlike its namesakes in
- some other languages it does not initialize the memory, it only zeros
- it. That is, new(T) allocates zeroed storage for a new item of type T
- and returns its address, a value of type *T. In Go terminology, it
- returns a pointer to a newly allocated zero value of type T.
+Go has two allocation primitives, the built-in functions new and make. They do
+different things and apply to different types, which can be confusing, but the
+rules are simple. Let's talk about new first. It's a built-in function that
+allocates memory, but unlike its namesakes in some other languages it does not
+initialize the memory, it only zeros it. That is, new(T) allocates zeroed
+storage for a new item of type T and returns its address, a value of type *T.
+In Go terminology, it returns a pointer to a newly allocated zero value of type
+T.
- Since the memory returned by new is zeroed, it's helpful to arrange
- when designing your data structures that the zero value of each type
- can be used without further initialization. This means a user of the
- data structure can create one with new and get right to work. For
- example, the documentation for bytes.Buffer states that "the zero value
- for Buffer is an empty buffer ready to use." Similarly, sync.Mutex does
- not have an explicit constructor or Init method. Instead, the zero
- value for a sync.Mutex is defined to be an unlocked mutex.
+Since the memory returned by new is zeroed, it's helpful to arrange when
+designing your data structures that the zero value of each type can be used
+without further initialization. This means a user of the data structure can
+create one with new and get right to work. For example, the documentation for
+bytes.Buffer states that "the zero value for Buffer is an empty buffer ready to
+use." Similarly, sync.Mutex does not have an explicit constructor or Init
+method. Instead, the zero value for a sync.Mutex is defined to be an unlocked
+mutex.
+
+The zero-value-is-useful property works transitively. Consider this type
+declaration.
- The zero-value-is-useful property works transitively. Consider this
- type declaration.
type SyncedBuffer struct {
lock sync.Mutex
buffer bytes.Buffer
}
- Values of type SyncedBuffer are also ready to use immediately upon
- allocation or just declaration. In the next snippet, both p and v will
- work correctly without further arrangement.
+Values of type SyncedBuffer are also ready to use immediately upon allocation
+or just declaration. In the next snippet, both p and v will work correctly
+without further arrangement.
+
p := new(SyncedBuffer) // type *SyncedBuffer
var v SyncedBuffer // type SyncedBuffer
- Constructors and composite literals
+Constructors and composite literals
+
+Sometimes the zero value isn't good enough and an initializing constructor is
+necessary, as in this example derived from package os.
- Sometimes the zero value isn't good enough and an initializing
- constructor is necessary, as in this example derived from package os.
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
@@ -792,9 +827,10 @@ func NewFile(fd int, name string) *File {
return f
}
- There's a lot of boilerplate in there. We can simplify it using a
- composite literal, which is an expression that creates a new instance
- each time it is evaluated.
+There's a lot of boilerplate in there. We can simplify it using a composite
+literal, which is an expression that creates a new instance each time it is
+evaluated.
+
func NewFile(fd int, name string) *File {
if fd < 0 {
return nil
@@ -803,57 +839,57 @@ func NewFile(fd int, name string) *File {
return &f
}
- Note that, unlike in C, it's perfectly OK to return the address of a
- local variable; the storage associated with the variable survives after
- the function returns. In fact, taking the address of a composite
- literal allocates a fresh instance each time it is evaluated, so we can
- combine these last two lines.
+Note that, unlike in C, it's perfectly OK to return the address of a local
+variable; the storage associated with the variable survives after the function
+returns. In fact, taking the address of a composite literal allocates a fresh
+instance each time it is evaluated, so we can combine these last two lines.
+
return &File{fd, name, nil, 0}
- The fields of a composite literal are laid out in order and must all be
- present. However, by labeling the elements explicitly as field:value
- pairs, the initializers can appear in any order, with the missing ones
- left as their respective zero values. Thus we could say
+The fields of a composite literal are laid out in order and must all be
+present. However, by labeling the elements explicitly as field:value pairs, the
+initializers can appear in any order, with the missing ones left as their
+respective zero values. Thus we could say
+
return &File{fd: fd, name: name}
- As a limiting case, if a composite literal contains no fields at all,
- it creates a zero value for the type. The expressions new(File) and
- &File{} are equivalent.
+As a limiting case, if a composite literal contains no fields at all, it
+creates a zero value for the type. The expressions new(File) and &File{} are
+equivalent.
+
+Composite literals can also be created for arrays, slices, and maps, with the
+field labels being indices or map keys as appropriate. In these examples, the
+initializations work regardless of the values of Enone, Eio, and Einval, as
+long as they are distinct.
- Composite literals can also be created for arrays, slices, and maps,
- with the field labels being indices or map keys as appropriate. In
- these examples, the initializations work regardless of the values of
- Enone, Eio, and Einval, as long as they are distinct.
a := [...]string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
s := []string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
m := map[int]string{Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
- Allocation with make
+Allocation with make
+
+Back to allocation. The built-in function make(T, args) serves a purpose
+different from new(T). It creates slices, maps, and channels only, and it
+returns an initialized (not zeroed) value of type T (not *T). The reason for
+the distinction is that these three types represent, under the covers,
+references to data structures that must be initialized before use. A slice, for
+example, is a three-item descriptor containing a pointer to the data (inside an
+array), the length, and the capacity, and until those items are initialized,
+the slice is nil. For slices, maps, and channels, make initializes the internal
+data structure and prepares the value for use. For instance,
- Back to allocation. The built-in function make(T, args) serves a
- purpose different from new(T). It creates slices, maps, and channels
- only, and it returns an initialized (not zeroed) value of type T (not
- *T). The reason for the distinction is that these three types
- represent, under the covers, references to data structures that must be
- initialized before use. A slice, for example, is a three-item
- descriptor containing a pointer to the data (inside an array), the
- length, and the capacity, and until those items are initialized, the
- slice is nil. For slices, maps, and channels, make initializes the
- internal data structure and prepares the value for use. For instance,
make([]int, 10, 100)
- allocates an array of 100 ints and then creates a slice structure with
- length 10 and a capacity of 100 pointing at the first 10 elements of
- the array. (When making a slice, the capacity can be omitted; see the
- section on slices for more information.) In contrast, new([]int)
- returns a pointer to a newly allocated, zeroed slice structure, that
- is, a pointer to a nil slice value.
+allocates an array of 100 ints and then creates a slice structure with length
+10 and a capacity of 100 pointing at the first 10 elements of the array. (When
+making a slice, the capacity can be omitted; see the section on slices for more
+information.) In contrast, new([]int) returns a pointer to a newly allocated,
+zeroed slice structure, that is, a pointer to a nil slice value.
- These examples illustrate the difference between new and make.
-var p *[]int = new([]int) // allocates slice structure; *p == nil; rarely
-useful
-var v []int = make([]int, 100) // the slice v now refers to a new array of 100
-ints
+These examples illustrate the difference between new and make.
+
+var p *[]int = new([]int) // allocates slice structure; *p == nil; rarely useful
+var v []int = make([]int, 100) // the slice v now refers to a new array of 100 ints
// Unnecessarily complex:
var p *[]int = new([]int)
@@ -862,28 +898,28 @@ var p *[]int = new([]int)
// Idiomatic:
v := make([]int, 100)
- Remember that make applies only to maps, slices and channels and does
- not return a pointer. To obtain an explicit pointer allocate with new
- or take the address of a variable explicitly.
+Remember that make applies only to maps, slices and channels and does not
+return a pointer. To obtain an explicit pointer allocate with new or take the
+address of a variable explicitly.
- Arrays
+Arrays
- Arrays are useful when planning the detailed layout of memory and
- sometimes can help avoid allocation, but primarily they are a building
- block for slices, the subject of the next section. To lay the
- foundation for that topic, here are a few words about arrays.
+Arrays are useful when planning the detailed layout of memory and sometimes can
+help avoid allocation, but primarily they are a building block for slices, the
+subject of the next section. To lay the foundation for that topic, here are a
+few words about arrays.
- There are major differences between the ways arrays work in Go and C.
- In Go,
- * Arrays are values. Assigning one array to another copies all the
- elements.
- * In particular, if you pass an array to a function, it will receive
- a copy of the array, not a pointer to it.
- * The size of an array is part of its type. The types [10]int and
- [20]int are distinct.
+There are major differences between the ways arrays work in Go and C. In Go,
+
+ • Arrays are values. Assigning one array to another copies all the elements.
+ • In particular, if you pass an array to a function, it will receive a copy
+ of the array, not a pointer to it.
+ • The size of an array is part of its type. The types [10]int and [20]int are
+ distinct.
+
+The value property can be useful but also expensive; if you want C-like
+behavior and efficiency, you can pass a pointer to the array.
- The value property can be useful but also expensive; if you want C-like
- behavior and efficiency, you can pass a pointer to the array.
func Sum(a *[3]float64) (sum float64) {
for _, v := range *a {
sum += v
@@ -894,33 +930,34 @@ func Sum(a *[3]float64) (sum float64) {
array := [...]float64{7.0, 8.5, 9.1}
x := Sum(&array) // Note the explicit address-of operator
- But even this style isn't idiomatic Go. Use slices instead.
+But even this style isn't idiomatic Go. Use slices instead.
- Slices
+Slices
- Slices wrap arrays to give a more general, powerful, and convenient
- interface to sequences of data. Except for items with explicit
- dimension such as transformation matrices, most array programming in Go
- is done with slices rather than simple arrays.
+Slices wrap arrays to give a more general, powerful, and convenient interface
+to sequences of data. Except for items with explicit dimension such as
+transformation matrices, most array programming in Go is done with slices
+rather than simple arrays.
+
+Slices hold references to an underlying array, and if you assign one slice to
+another, both refer to the same array. If a function takes a slice argument,
+changes it makes to the elements of the slice will be visible to the caller,
+analogous to passing a pointer to the underlying array. A Read function can
+therefore accept a slice argument rather than a pointer and a count; the length
+within the slice sets an upper limit of how much data to read. Here is the
+signature of the Read method of the File type in package os:
- Slices hold references to an underlying array, and if you assign one
- slice to another, both refer to the same array. If a function takes a
- slice argument, changes it makes to the elements of the slice will be
- visible to the caller, analogous to passing a pointer to the underlying
- array. A Read function can therefore accept a slice argument rather
- than a pointer and a count; the length within the slice sets an upper
- limit of how much data to read. Here is the signature of the Read
- method of the File type in package os:
func (f *File) Read(buf []byte) (n int, err error)
- The method returns the number of bytes read and an error value, if any.
- To read into the first 32 bytes of a larger buffer buf, slice (here
- used as a verb) the buffer.
+The method returns the number of bytes read and an error value, if any. To read
+into the first 32 bytes of a larger buffer buf, slice (here used as a verb) the
+buffer.
+
n, err := f.Read(buf[0:32])
- Such slicing is common and efficient. In fact, leaving efficiency aside
- for the moment, the following snippet would also read the first 32
- bytes of the buffer.
+Such slicing is common and efficient. In fact, leaving efficiency aside for the
+moment, the following snippet would also read the first 32 bytes of the buffer.
+
var n int
var err error
for i := 0; i < 32; i++ {
@@ -932,14 +969,14 @@ func (f *File) Read(buf []byte) (n int, err error)
}
}
- The length of a slice may be changed as long as it still fits within
- the limits of the underlying array; just assign it to a slice of
- itself. The capacity of a slice, accessible by the built-in function
- cap, reports the maximum length the slice may assume. Here is a
- function to append data to a slice. If the data exceeds the capacity,
- the slice is reallocated. The resulting slice is returned. The function
- uses the fact that len and cap are legal when applied to the nil slice,
- and return 0.
+The length of a slice may be changed as long as it still fits within the limits
+of the underlying array; just assign it to a slice of itself. The capacity of a
+slice, accessible by the built-in function cap, reports the maximum length the
+slice may assume. Here is a function to append data to a slice. If the data
+exceeds the capacity, the slice is reallocated. The resulting slice is
+returned. The function uses the fact that len and cap are legal when applied to
+the nil slice, and return 0.
+
func Append(slice, data []byte) []byte {
l := len(slice)
if l + len(data) > cap(slice) { // reallocate
@@ -954,40 +991,42 @@ func Append(slice, data []byte) []byte {
return slice
}
- We must return the slice afterwards because, although Append can modify
- the elements of slice, the slice itself (the run-time data structure
- holding the pointer, length, and capacity) is passed by value.
+We must return the slice afterwards because, although Append can modify the
+elements of slice, the slice itself (the run-time data structure holding the
+pointer, length, and capacity) is passed by value.
- The idea of appending to a slice is so useful it's captured by the
- append built-in function. To understand that function's design, though,
- we need a little more information, so we'll return to it later.
+The idea of appending to a slice is so useful it's captured by the append
+built-in function. To understand that function's design, though, we need a
+little more information, so we'll return to it later.
- Two-dimensional slices
+Two-dimensional slices
+
+Go's arrays and slices are one-dimensional. To create the equivalent of a 2D
+array or slice, it is necessary to define an array-of-arrays or
+slice-of-slices, like this:
- Go's arrays and slices are one-dimensional. To create the equivalent of
- a 2D array or slice, it is necessary to define an array-of-arrays or
- slice-of-slices, like this:
type Transform [3][3]float64 // A 3x3 array, really an array of arrays.
type LinesOfText [][]byte // A slice of byte slices.
- Because slices are variable-length, it is possible to have each inner
- slice be a different length. That can be a common situation, as in our
- LinesOfText example: each line has an independent length.
+Because slices are variable-length, it is possible to have each inner slice be
+a different length. That can be a common situation, as in our LinesOfText
+example: each line has an independent length.
+
text := LinesOfText{
[]byte("Now is the time"),
[]byte("for all good gophers"),
[]byte("to bring some fun to the party."),
}
- Sometimes it's necessary to allocate a 2D slice, a situation that can
- arise when processing scan lines of pixels, for instance. There are two
- ways to achieve this. One is to allocate each slice independently; the
- other is to allocate a single array and point the individual slices
- into it. Which to use depends on your application. If the slices might
- grow or shrink, they should be allocated independently to avoid
- overwriting the next line; if not, it can be more efficient to
- construct the object with a single allocation. For reference, here are
- sketches of the two methods. First, a line at a time:
+Sometimes it's necessary to allocate a 2D slice, a situation that can arise
+when processing scan lines of pixels, for instance. There are two ways to
+achieve this. One is to allocate each slice independently; the other is to
+allocate a single array and point the individual slices into it. Which to use
+depends on your application. If the slices might grow or shrink, they should be
+allocated independently to avoid overwriting the next line; if not, it can be
+more efficient to construct the object with a single allocation. For reference,
+here are sketches of the two methods. First, a line at a time:
+
// Allocate the top-level slice.
picture := make([][]uint8, YSize) // One row per unit of y.
// Loop over the rows, allocating the slice for each row.
@@ -995,34 +1034,33 @@ for i := range picture {
picture[i] = make([]uint8, XSize)
}
- And now as one allocation, sliced into lines:
+And now as one allocation, sliced into lines:
+
// Allocate the top-level slice, the same as before.
picture := make([][]uint8, YSize) // One row per unit of y.
// Allocate one large slice to hold all the pixels.
-pixels := make([]uint8, XSize*YSize) // Has type []uint8 even though picture is
-[][]uint8.
-// Loop over the rows, slicing each row from the front of the remaining pixels s
-lice.
+pixels := make([]uint8, XSize*YSize) // Has type []uint8 even though picture is [][]uint8.
+// Loop over the rows, slicing each row from the front of the remaining pixels slice.
for i := range picture {
picture[i], pixels = pixels[:XSize], pixels[XSize:]
}
- Maps
+Maps
- Maps are a convenient and powerful built-in data structure that
- associate values of one type (the key) with values of another type (the
- element or value). The key can be of any type for which the equality
- operator is defined, such as integers, floating point and complex
- numbers, strings, pointers, interfaces (as long as the dynamic type
- supports equality), structs and arrays. Slices cannot be used as map
- keys, because equality is not defined on them. Like slices, maps hold
- references to an underlying data structure. If you pass a map to a
- function that changes the contents of the map, the changes will be
- visible in the caller.
+Maps are a convenient and powerful built-in data structure that associate
+values of one type (the key) with values of another type (the element or value
+). The key can be of any type for which the equality operator is defined, such
+as integers, floating point and complex numbers, strings, pointers, interfaces
+(as long as the dynamic type supports equality), structs and arrays. Slices
+cannot be used as map keys, because equality is not defined on them. Like
+slices, maps hold references to an underlying data structure. If you pass a map
+to a function that changes the contents of the map, the changes will be visible
+in the caller.
+
+Maps can be constructed using the usual composite literal syntax with
+colon-separated key-value pairs, so it's easy to build them during
+initialization.
- Maps can be constructed using the usual composite literal syntax with
- colon-separated key-value pairs, so it's easy to build them during
- initialization.
var timeZone = map[string]int{
"UTC": 0*60*60,
"EST": -5*60*60,
@@ -1031,17 +1069,17 @@ var timeZone = map[string]int{
"PST": -8*60*60,
}
- Assigning and fetching map values looks syntactically just like doing
- the same for arrays and slices except that the index doesn't need to be
- an integer.
+Assigning and fetching map values looks syntactically just like doing the same
+for arrays and slices except that the index doesn't need to be an integer.
+
offset := timeZone["EST"]
- An attempt to fetch a map value with a key that is not present in the
- map will return the zero value for the type of the entries in the map.
- For instance, if the map contains integers, looking up a non-existent
- key will return 0. A set can be implemented as a map with value type
- bool. Set the map entry to true to put the value in the set, and then
- test it by simple indexing.
+An attempt to fetch a map value with a key that is not present in the map will
+return the zero value for the type of the entries in the map. For instance, if
+the map contains integers, looking up a non-existent key will return 0. A set
+can be implemented as a map with value type bool. Set the map entry to true to
+put the value in the set, and then test it by simple indexing.
+
attended := map[string]bool{
"Ann": true,
"Joe": true,
@@ -1052,17 +1090,19 @@ if attended[person] { // will be false if person is not in the map
fmt.Println(person, "was at the meeting")
}
- Sometimes you need to distinguish a missing entry from a zero value. Is
- there an entry for "UTC" or is that 0 because it's not in the map at
- all? You can discriminate with a form of multiple assignment.
+Sometimes you need to distinguish a missing entry from a zero value. Is there
+an entry for "UTC" or is that 0 because it's not in the map at all? You can
+discriminate with a form of multiple assignment.
+
var seconds int
var ok bool
seconds, ok = timeZone[tz]
- For obvious reasons this is called the “comma ok” idiom. In this
- example, if tz is present, seconds will be set appropriately and ok
- will be true; if not, seconds will be set to zero and ok will be false.
- Here's a function that puts it together with a nice error report:
+For obvious reasons this is called the “comma ok” idiom. In this example, if tz
+is present, seconds will be set appropriately and ok will be true; if not,
+seconds will be set to zero and ok will be false. Here's a function that puts
+it together with a nice error report:
+
func offset(tz string) int {
if seconds, ok := timeZone[tz]; ok {
return seconds
@@ -1071,64 +1111,72 @@ func offset(tz string) int {
return 0
}
- To test for presence in the map without worrying about the actual
- value, you can use the [66]blank identifier (_) in place of the usual
- variable for the value.
+To test for presence in the map without worrying about the actual value, you
+can use the [66]blank identifier (_) in place of the usual variable for the
+value.
+
_, present := timeZone[tz]
- To delete a map entry, use the delete built-in function, whose
- arguments are the map and the key to be deleted. It's safe to do this
- even if the key is already absent from the map.
+To delete a map entry, use the delete built-in function, whose arguments are
+the map and the key to be deleted. It's safe to do this even if the key is
+already absent from the map.
+
delete(timeZone, "PDT") // Now on Standard Time
- Printing
+Printing
- Formatted printing in Go uses a style similar to C's printf family but
- is richer and more general. The functions live in the fmt package and
- have capitalized names: fmt.Printf, fmt.Fprintf, fmt.Sprintf and so on.
- The string functions (Sprintf etc.) return a string rather than filling
- in a provided buffer.
+Formatted printing in Go uses a style similar to C's printf family but is
+richer and more general. The functions live in the fmt package and have
+capitalized names: fmt.Printf, fmt.Fprintf, fmt.Sprintf and so on. The string
+functions (Sprintf etc.) return a string rather than filling in a provided
+buffer.
+
+You don't need to provide a format string. For each of Printf, Fprintf and
+Sprintf there is another pair of functions, for instance Print and Println.
+These functions do not take a format string but instead generate a default
+format for each argument. The Println versions also insert a blank between
+arguments and append a newline to the output while the Print versions add
+blanks only if the operand on neither side is a string. In this example each
+line produces the same output.
- You don't need to provide a format string. For each of Printf, Fprintf
- and Sprintf there is another pair of functions, for instance Print and
- Println. These functions do not take a format string but instead
- generate a default format for each argument. The Println versions also
- insert a blank between arguments and append a newline to the output
- while the Print versions add blanks only if the operand on neither side
- is a string. In this example each line produces the same output.
fmt.Printf("Hello %d\n", 23)
fmt.Fprint(os.Stdout, "Hello ", 23, "\n")
fmt.Println("Hello", 23)
fmt.Println(fmt.Sprint("Hello ", 23))
- The formatted print functions fmt.Fprint and friends take as a first
- argument any object that implements the io.Writer interface; the
- variables os.Stdout and os.Stderr are familiar instances.
+The formatted print functions fmt.Fprint and friends take as a first argument
+any object that implements the io.Writer interface; the variables os.Stdout and
+os.Stderr are familiar instances.
+
+Here things start to diverge from C. First, the numeric formats such as %d do
+not take flags for signedness or size; instead, the printing routines use the
+type of the argument to decide these properties.
- Here things start to diverge from C. First, the numeric formats such as
- %d do not take flags for signedness or size; instead, the printing
- routines use the type of the argument to decide these properties.
var x uint64 = 1<<64 - 1
fmt.Printf("%d %x; %d %x\n", x, x, int64(x), int64(x))
- prints
+prints
+
18446744073709551615 ffffffffffffffff; -1 -1
- If you just want the default conversion, such as decimal for integers,
- you can use the catchall format %v (for “value”); the result is exactly
- what Print and Println would produce. Moreover, that format can print
- any value, even arrays, slices, structs, and maps. Here is a print
- statement for the time zone map defined in the previous section.
+If you just want the default conversion, such as decimal for integers, you can
+use the catchall format %v (for “value”); the result is exactly what Print and
+Println would produce. Moreover, that format can print any value, even arrays,
+slices, structs, and maps. Here is a print statement for the time zone map
+defined in the previous section.
+
fmt.Printf("%v\n", timeZone) // or just fmt.Println(timeZone)
- which gives output:
+which gives output:
+
map[CST:-21600 EST:-18000 MST:-25200 PST:-28800 UTC:0]
- For maps, Printf and friends sort the output lexicographically by key.
+For maps, Printf and friends sort the output lexicographically by key.
+
+When printing a struct, the modified format %+v annotates the fields of the
+structure with their names, and for any value the alternate format %#v prints
+the value in full Go syntax.
- When printing a struct, the modified format %+v annotates the fields of
- the structure with their names, and for any value the alternate format
- %#v prints the value in full Go syntax.
type T struct {
a int
b float64
@@ -1140,92 +1188,100 @@ fmt.Printf("%+v\n", t)
fmt.Printf("%#v\n", t)
fmt.Printf("%#v\n", timeZone)
- prints
+prints
+
&{7 -2.35 abc def}
&{a:7 b:-2.35 c:abc def}
&main.T{a:7, b:-2.35, c:"abc\tdef"}
map[string]int{"CST":-21600, "EST":-18000, "MST":-25200, "PST":-28800, "UTC":0}
- (Note the ampersands.) That quoted string format is also available
- through %q when applied to a value of type string or []byte. The
- alternate format %#q will use backquotes instead if possible. (The %q
- format also applies to integers and runes, producing a single-quoted
- rune constant.) Also, %x works on strings, byte arrays and byte slices
- as well as on integers, generating a long hexadecimal string, and with
- a space in the format (% x) it puts spaces between the bytes.
+(Note the ampersands.) That quoted string format is also available through %q
+when applied to a value of type string or []byte. The alternate format %#q will
+use backquotes instead if possible. (The %q format also applies to integers and
+runes, producing a single-quoted rune constant.) Also, %x works on strings,
+byte arrays and byte slices as well as on integers, generating a long
+hexadecimal string, and with a space in the format (% x) it puts spaces between
+the bytes.
+
+Another handy format is %T, which prints the type of a value.
- Another handy format is %T, which prints the type of a value.
fmt.Printf("%T\n", timeZone)
- prints
+prints
+
map[string]int
- If you want to control the default format for a custom type, all that's
- required is to define a method with the signature String() string on
- the type. For our simple type T, that might look like this.
+If you want to control the default format for a custom type, all that's
+required is to define a method with the signature String() string on the type.
+For our simple type T, that might look like this.
+
func (t *T) String() string {
return fmt.Sprintf("%d/%g/%q", t.a, t.b, t.c)
}
fmt.Printf("%v\n", t)
- to print in the format
+to print in the format
+
7/-2.35/"abc\tdef"
- (If you need to print values of type T as well as pointers to T, the
- receiver for String must be of value type; this example used a pointer
- because that's more efficient and idiomatic for struct types. See the
- section below on [67]pointers vs. value receivers for more
- information.)
+(If you need to print values of type T as well as pointers to T, the receiver
+for String must be of value type; this example used a pointer because that's
+more efficient and idiomatic for struct types. See the section below on [67]
+pointers vs. value receivers for more information.)
+
+Our String method is able to call Sprintf because the print routines are fully
+reentrant and can be wrapped this way. There is one important detail to
+understand about this approach, however: don't construct a String method by
+calling Sprintf in a way that will recur into your String method indefinitely.
+This can happen if the Sprintf call attempts to print the receiver directly as
+a string, which in turn will invoke the method again. It's a common and easy
+mistake to make, as this example shows.
- Our String method is able to call Sprintf because the print routines
- are fully reentrant and can be wrapped this way. There is one important
- detail to understand about this approach, however: don't construct a
- String method by calling Sprintf in a way that will recur into your
- String method indefinitely. This can happen if the Sprintf call
- attempts to print the receiver directly as a string, which in turn will
- invoke the method again. It's a common and easy mistake to make, as
- this example shows.
type MyString string
func (m MyString) String() string {
return fmt.Sprintf("MyString=%s", m) // Error: will recur forever.
}
- It's also easy to fix: convert the argument to the basic string type,
- which does not have the method.
+It's also easy to fix: convert the argument to the basic string type, which
+does not have the method.
+
type MyString string
func (m MyString) String() string {
return fmt.Sprintf("MyString=%s", string(m)) // OK: note conversion.
}
- In the [68]initialization section we'll see another technique that
- avoids this recursion.
+In the [68]initialization section we'll see another technique that avoids this
+recursion.
+
+Another printing technique is to pass a print routine's arguments directly to
+another such routine. The signature of Printf uses the type ...interface{} for
+its final argument to specify that an arbitrary number of parameters (of
+arbitrary type) can appear after the format.
- Another printing technique is to pass a print routine's arguments
- directly to another such routine. The signature of Printf uses the type
- ...interface{} for its final argument to specify that an arbitrary
- number of parameters (of arbitrary type) can appear after the format.
func Printf(format string, v ...interface{}) (n int, err error) {
- Within the function Printf, v acts like a variable of type
- []interface{} but if it is passed to another variadic function, it acts
- like a regular list of arguments. Here is the implementation of the
- function log.Println we used above. It passes its arguments directly to
- fmt.Sprintln for the actual formatting.
+Within the function Printf, v acts like a variable of type []interface{} but if
+it is passed to another variadic function, it acts like a regular list of
+arguments. Here is the implementation of the function log.Println we used
+above. It passes its arguments directly to fmt.Sprintln for the actual
+formatting.
+
// Println prints to the standard logger in the manner of fmt.Println.
func Println(v ...interface{}) {
std.Output(2, fmt.Sprintln(v...)) // Output takes parameters (int, string)
}
- We write ... after v in the nested call to Sprintln to tell the
- compiler to treat v as a list of arguments; otherwise it would just
- pass v as a single slice argument.
+We write ... after v in the nested call to Sprintln to tell the compiler to
+treat v as a list of arguments; otherwise it would just pass v as a single
+slice argument.
- There's even more to printing than we've covered here. See the godoc
- documentation for package fmt for the details.
+There's even more to printing than we've covered here. See the godoc
+documentation for package fmt for the details.
+
+By the way, a ... parameter can be of a specific type, for instance ...int for
+a min function that chooses the least of a list of integers:
- By the way, a ... parameter can be of a specific type, for instance
- ...int for a min function that chooses the least of a list of integers:
func Min(a ...int) int {
min := int(^uint(0) >> 1) // largest int
for _, i := range a {
@@ -1236,60 +1292,60 @@ func Min(a ...int) int {
return min
}
- Append
+Append
+
+Now we have the missing piece we needed to explain the design of the append
+built-in function. The signature of append is different from our custom Append
+function above. Schematically, it's like this:
- Now we have the missing piece we needed to explain the design of the
- append built-in function. The signature of append is different from our
- custom Append function above. Schematically, it's like this:
func append(slice []T, elements ...T) []T
- where T is a placeholder for any given type. You can't actually write a
- function in Go where the type T is determined by the caller. That's why
- append is built in: it needs support from the compiler.
+where T is a placeholder for any given type. You can't actually write a
+function in Go where the type T is determined by the caller. That's why append
+is built in: it needs support from the compiler.
+
+What append does is append the elements to the end of the slice and return the
+result. The result needs to be returned because, as with our hand-written
+Append, the underlying array may change. This simple example
- What append does is append the elements to the end of the slice and
- return the result. The result needs to be returned because, as with our
- hand-written Append, the underlying array may change. This simple
- example
x := []int{1,2,3}
x = append(x, 4, 5, 6)
fmt.Println(x)
- prints [1 2 3 4 5 6]. So append works a little like Printf, collecting
- an arbitrary number of arguments.
+prints [1 2 3 4 5 6]. So append works a little like Printf, collecting an
+arbitrary number of arguments.
+
+But what if we wanted to do what our Append does and append a slice to a slice?
+Easy: use ... at the call site, just as we did in the call to Output above.
+This snippet produces identical output to the one above.
- But what if we wanted to do what our Append does and append a slice to
- a slice? Easy: use ... at the call site, just as we did in the call to
- Output above. This snippet produces identical output to the one above.
x := []int{1,2,3}
y := []int{4,5,6}
x = append(x, y...)
fmt.Println(x)
- Without that ..., it wouldn't compile because the types would be wrong;
- y is not of type int.
+Without that ..., it wouldn't compile because the types would be wrong; y is
+not of type int.
Initialization
- Although it doesn't look superficially very different from
- initialization in C or C++, initialization in Go is more powerful.
- Complex structures can be built during initialization and the ordering
- issues among initialized objects, even among different packages, are
- handled correctly.
+Although it doesn't look superficially very different from initialization in C
+or C++, initialization in Go is more powerful. Complex structures can be built
+during initialization and the ordering issues among initialized objects, even
+among different packages, are handled correctly.
- Constants
+Constants
- Constants in Go are just that—constant. They are created at compile
- time, even when defined as locals in functions, and can only be
- numbers, characters (runes), strings or booleans. Because of the
- compile-time restriction, the expressions that define them must be
- constant expressions, evaluatable by the compiler. For instance, 1<<3
- is a constant expression, while math.Sin(math.Pi/4) is not because the
- function call to math.Sin needs to happen at run time.
+Constants in Go are just that—constant. They are created at compile time, even
+when defined as locals in functions, and can only be numbers, characters
+(runes), strings or booleans. Because of the compile-time restriction, the
+expressions that define them must be constant expressions, evaluatable by the
+compiler. For instance, 1<<3 is a constant expression, while math.Sin(math.Pi/
+4) is not because the function call to math.Sin needs to happen at run time.
- In Go, enumerated constants are created using the iota enumerator.
- Since iota can be part of an expression and expressions can be
- implicitly repeated, it is easy to build intricate sets of values.
+In Go, enumerated constants are created using the iota enumerator. Since iota
+can be part of an expression and expressions can be implicitly repeated, it is
+easy to build intricate sets of values.
type ByteSize float64
@@ -1305,11 +1361,10 @@ const (
YB
)
- The ability to attach a method such as String to any user-defined type
- makes it possible for arbitrary values to format themselves
- automatically for printing. Although you'll see it most often applied
- to structs, this technique is also useful for scalar types such as
- floating-point types like ByteSize.
+The ability to attach a method such as String to any user-defined type makes it
+possible for arbitrary values to format themselves automatically for printing.
+Although you'll see it most often applied to structs, this technique is also
+useful for scalar types such as floating-point types like ByteSize.
func (b ByteSize) String() string {
switch {
@@ -1333,37 +1388,36 @@ func (b ByteSize) String() string {
return fmt.Sprintf("%.2fB", b)
}
- The expression YB prints as 1.00YB, while ByteSize(1e13) prints as
- 9.09TB.
+The expression YB prints as 1.00YB, while ByteSize(1e13) prints as 9.09TB.
- The use here of Sprintf to implement ByteSize's String method is safe
- (avoids recurring indefinitely) not because of a conversion but because
- it calls Sprintf with %f, which is not a string format: Sprintf will
- only call the String method when it wants a string, and %f wants a
- floating-point value.
+The use here of Sprintf to implement ByteSize's String method is safe (avoids
+recurring indefinitely) not because of a conversion but because it calls
+Sprintf with %f, which is not a string format: Sprintf will only call the
+String method when it wants a string, and %f wants a floating-point value.
- Variables
+Variables
+
+Variables can be initialized just like constants but the initializer can be a
+general expression computed at run time.
- Variables can be initialized just like constants but the initializer
- can be a general expression computed at run time.
var (
home = os.Getenv("HOME")
user = os.Getenv("USER")
gopath = os.Getenv("GOPATH")
)
- The init function
+The init function
- Finally, each source file can define its own niladic init function to
- set up whatever state is required. (Actually each file can have
- multiple init functions.) And finally means finally: init is called
- after all the variable declarations in the package have evaluated their
- initializers, and those are evaluated only after all the imported
- packages have been initialized.
+Finally, each source file can define its own niladic init function to set up
+whatever state is required. (Actually each file can have multiple init
+functions.) And finally means finally: init is called after all the variable
+declarations in the package have evaluated their initializers, and those are
+evaluated only after all the imported packages have been initialized.
+
+Besides initializations that cannot be expressed as declarations, a common use
+of init functions is to verify or repair correctness of the program state
+before real execution begins.
- Besides initializations that cannot be expressed as declarations, a
- common use of init functions is to verify or repair correctness of the
- program state before real execution begins.
func init() {
if user == "" {
log.Fatal("$USER not set")
@@ -1380,34 +1434,35 @@ func init() {
Methods
- Pointers vs. Values
+Pointers vs. Values
- As we saw with ByteSize, methods can be defined for any named type
- (except a pointer or an interface); the receiver does not have to be a
- struct.
+As we saw with ByteSize, methods can be defined for any named type (except a
+pointer or an interface); the receiver does not have to be a struct.
+
+In the discussion of slices above, we wrote an Append function. We can define
+it as a method on slices instead. To do this, we first declare a named type to
+which we can bind the method, and then make the receiver for the method a value
+of that type.
- In the discussion of slices above, we wrote an Append function. We can
- define it as a method on slices instead. To do this, we first declare a
- named type to which we can bind the method, and then make the receiver
- for the method a value of that type.
type ByteSlice []byte
func (slice ByteSlice) Append(data []byte) []byte {
// Body exactly the same as the Append function defined above.
}
- This still requires the method to return the updated slice. We can
- eliminate that clumsiness by redefining the method to take a pointer to
- a ByteSlice as its receiver, so the method can overwrite the caller's
- slice.
+This still requires the method to return the updated slice. We can eliminate
+that clumsiness by redefining the method to take a pointer to a ByteSlice as
+its receiver, so the method can overwrite the caller's slice.
+
func (p *ByteSlice) Append(data []byte) {
slice := *p
// Body as above, without the return.
*p = slice
}
- In fact, we can do even better. If we modify our function so it looks
- like a standard Write method, like this,
+In fact, we can do even better. If we modify our function so it looks like a
+standard Write method, like this,
+
func (p *ByteSlice) Write(data []byte) (n int, err error) {
slice := *p
// Again as above.
@@ -1415,46 +1470,44 @@ func (p *ByteSlice) Write(data []byte) (n int, err error) {
return len(data), nil
}
- then the type *ByteSlice satisfies the standard interface io.Writer,
- which is handy. For instance, we can print into one.
+then the type *ByteSlice satisfies the standard interface io.Writer, which is
+handy. For instance, we can print into one.
+
var b ByteSlice
fmt.Fprintf(&b, "This hour has %d days\n", 7)
- We pass the address of a ByteSlice because only *ByteSlice satisfies
- io.Writer. The rule about pointers vs. values for receivers is that
- value methods can be invoked on pointers and values, but pointer
- methods can only be invoked on pointers.
+We pass the address of a ByteSlice because only *ByteSlice satisfies io.Writer.
+The rule about pointers vs. values for receivers is that value methods can be
+invoked on pointers and values, but pointer methods can only be invoked on
+pointers.
- This rule arises because pointer methods can modify the receiver;
- invoking them on a value would cause the method to receive a copy of
- the value, so any modifications would be discarded. The language
- therefore disallows this mistake. There is a handy exception, though.
- When the value is addressable, the language takes care of the common
- case of invoking a pointer method on a value by inserting the address
- operator automatically. In our example, the variable b is addressable,
- so we can call its Write method with just b.Write. The compiler will
- rewrite that to (&b).Write for us.
+This rule arises because pointer methods can modify the receiver; invoking them
+on a value would cause the method to receive a copy of the value, so any
+modifications would be discarded. The language therefore disallows this
+mistake. There is a handy exception, though. When the value is addressable, the
+language takes care of the common case of invoking a pointer method on a value
+by inserting the address operator automatically. In our example, the variable b
+is addressable, so we can call its Write method with just b.Write. The compiler
+will rewrite that to (&b).Write for us.
- By the way, the idea of using Write on a slice of bytes is central to
- the implementation of bytes.Buffer.
+By the way, the idea of using Write on a slice of bytes is central to the
+implementation of bytes.Buffer.
Interfaces and other types
- Interfaces
+Interfaces
- Interfaces in Go provide a way to specify the behavior of an object: if
- something can do this, then it can be used here. We've seen a couple of
- simple examples already; custom printers can be implemented by a String
- method while Fprintf can generate output to anything with a Write
- method. Interfaces with only one or two methods are common in Go code,
- and are usually given a name derived from the method, such as io.Writer
- for something that implements Write.
+Interfaces in Go provide a way to specify the behavior of an object: if
+something can do this, then it can be used here. We've seen a couple of simple
+examples already; custom printers can be implemented by a String method while
+Fprintf can generate output to anything with a Write method. Interfaces with
+only one or two methods are common in Go code, and are usually given a name
+derived from the method, such as io.Writer for something that implements Write.
- A type can implement multiple interfaces. For instance, a collection
- can be sorted by the routines in package sort if it implements
- sort.Interface, which contains Len(), Less(i, j int) bool, and Swap(i,
- j int), and it could also have a custom formatter. In this contrived
- example Sequence satisfies both.
+A type can implement multiple interfaces. For instance, a collection can be
+sorted by the routines in package sort if it implements sort.Interface, which
+contains Len(), Less(i, j int) bool, and Swap(i, j int), and it could also have
+a custom formatter. In this contrived example Sequence satisfies both.
type Sequence []int
@@ -1489,29 +1542,30 @@ func (s Sequence) String() string {
return str + "]"
}
- Conversions
+Conversions
+
+The String method of Sequence is recreating the work that Sprint already does
+for slices. (It also has complexity O(N²), which is poor.) We can share the
+effort (and also speed it up) if we convert the Sequence to a plain []int
+before calling Sprint.
- The String method of Sequence is recreating the work that Sprint
- already does for slices. (It also has complexity O(N²), which is poor.)
- We can share the effort (and also speed it up) if we convert the
- Sequence to a plain []int before calling Sprint.
func (s Sequence) String() string {
s = s.Copy()
sort.Sort(s)
return fmt.Sprint([]int(s))
}
- This method is another example of the conversion technique for calling
- Sprintf safely from a String method. Because the two types (Sequence
- and []int) are the same if we ignore the type name, it's legal to
- convert between them. The conversion doesn't create a new value, it
- just temporarily acts as though the existing value has a new type.
- (There are other legal conversions, such as from integer to floating
- point, that do create a new value.)
+This method is another example of the conversion technique for calling Sprintf
+safely from a String method. Because the two types (Sequence and []int) are the
+same if we ignore the type name, it's legal to convert between them. The
+conversion doesn't create a new value, it just temporarily acts as though the
+existing value has a new type. (There are other legal conversions, such as from
+integer to floating point, that do create a new value.)
+
+It's an idiom in Go programs to convert the type of an expression to access a
+different set of methods. As an example, we could use the existing type
+sort.IntSlice to reduce the entire example to this:
- It's an idiom in Go programs to convert the type of an expression to
- access a different set of methods. As an example, we could use the
- existing type sort.IntSlice to reduce the entire example to this:
type Sequence []int
// Method for printing - sorts the elements before printing
@@ -1521,20 +1575,20 @@ func (s Sequence) String() string {
return fmt.Sprint([]int(s))
}
- Now, instead of having Sequence implement multiple interfaces (sorting
- and printing), we're using the ability of a data item to be converted
- to multiple types (Sequence, sort.IntSlice and []int), each of which
- does some part of the job. That's more unusual in practice but can be
- effective.
+Now, instead of having Sequence implement multiple interfaces (sorting and
+printing), we're using the ability of a data item to be converted to multiple
+types (Sequence, sort.IntSlice and []int), each of which does some part of the
+job. That's more unusual in practice but can be effective.
- Interface conversions and type assertions
+Interface conversions and type assertions
+
+[69]Type switches are a form of conversion: they take an interface and, for
+each case in the switch, in a sense convert it to the type of that case. Here's
+a simplified version of how the code under fmt.Printf turns a value into a
+string using a type switch. If it's already a string, we want the actual string
+value held by the interface, while if it has a String method we want the result
+of calling the method.
- [69]Type switches are a form of conversion: they take an interface and,
- for each case in the switch, in a sense convert it to the type of that
- case. Here's a simplified version of how the code under fmt.Printf
- turns a value into a string using a type switch. If it's already a
- string, we want the actual string value held by the interface, while if
- it has a String method we want the result of calling the method.
type Stringer interface {
String() string
}
@@ -1547,27 +1601,29 @@ case Stringer:
return str.String()
}
- The first case finds a concrete value; the second converts the
- interface into another interface. It's perfectly fine to mix types this
- way.
+The first case finds a concrete value; the second converts the interface into
+another interface. It's perfectly fine to mix types this way.
+
+What if there's only one type we care about? If we know the value holds a
+string and we just want to extract it? A one-case type switch would do, but so
+would a type assertion. A type assertion takes an interface value and extracts
+from it a value of the specified explicit type. The syntax borrows from the
+clause opening a type switch, but with an explicit type rather than the type
+keyword:
- What if there's only one type we care about? If we know the value holds
- a string and we just want to extract it? A one-case type switch would
- do, but so would a type assertion. A type assertion takes an interface
- value and extracts from it a value of the specified explicit type. The
- syntax borrows from the clause opening a type switch, but with an
- explicit type rather than the type keyword:
value.(typeName)
- and the result is a new value with the static type typeName. That type
- must either be the concrete type held by the interface, or a second
- interface type that the value can be converted to. To extract the
- string we know is in the value, we could write:
+and the result is a new value with the static type typeName. That type must
+either be the concrete type held by the interface, or a second interface type
+that the value can be converted to. To extract the string we know is in the
+value, we could write:
+
str := value.(string)
- But if it turns out that the value does not contain a string, the
- program will crash with a run-time error. To guard against that, use
- the "comma, ok" idiom to test, safely, whether the value is a string:
+But if it turns out that the value does not contain a string, the program will
+crash with a run-time error. To guard against that, use the "comma, ok" idiom
+to test, safely, whether the value is a string:
+
str, ok := value.(string)
if ok {
fmt.Printf("string value is: %q\n", str)
@@ -1575,43 +1631,42 @@ if ok {
fmt.Printf("value is not a string\n")
}
- If the type assertion fails, str will still exist and be of type
- string, but it will have the zero value, an empty string.
+If the type assertion fails, str will still exist and be of type string, but it
+will have the zero value, an empty string.
+
+As an illustration of the capability, here's an if-else statement that's
+equivalent to the type switch that opened this section.
- As an illustration of the capability, here's an if-else statement
- that's equivalent to the type switch that opened this section.
if str, ok := value.(string); ok {
return str
} else if str, ok := value.(Stringer); ok {
return str.String()
}
- Generality
+Generality
- If a type exists only to implement an interface and will never have
- exported methods beyond that interface, there is no need to export the
- type itself. Exporting just the interface makes it clear the value has
- no interesting behavior beyond what is described in the interface. It
- also avoids the need to repeat the documentation on every instance of a
- common method.
+If a type exists only to implement an interface and will never have exported
+methods beyond that interface, there is no need to export the type itself.
+Exporting just the interface makes it clear the value has no interesting
+behavior beyond what is described in the interface. It also avoids the need to
+repeat the documentation on every instance of a common method.
- In such cases, the constructor should return an interface value rather
- than the implementing type. As an example, in the hash libraries both
- crc32.NewIEEE and adler32.New return the interface type hash.Hash32.
- Substituting the CRC-32 algorithm for Adler-32 in a Go program requires
- only changing the constructor call; the rest of the code is unaffected
- by the change of algorithm.
+In such cases, the constructor should return an interface value rather than the
+implementing type. As an example, in the hash libraries both crc32.NewIEEE and
+adler32.New return the interface type hash.Hash32. Substituting the CRC-32
+algorithm for Adler-32 in a Go program requires only changing the constructor
+call; the rest of the code is unaffected by the change of algorithm.
- A similar approach allows the streaming cipher algorithms in the
- various crypto packages to be separated from the block ciphers they
- chain together. The Block interface in the crypto/cipher package
- specifies the behavior of a block cipher, which provides encryption of
- a single block of data. Then, by analogy with the bufio package, cipher
- packages that implement this interface can be used to construct
- streaming ciphers, represented by the Stream interface, without knowing
- the details of the block encryption.
+A similar approach allows the streaming cipher algorithms in the various crypto
+packages to be separated from the block ciphers they chain together. The Block
+interface in the crypto/cipher package specifies the behavior of a block
+cipher, which provides encryption of a single block of data. Then, by analogy
+with the bufio package, cipher packages that implement this interface can be
+used to construct streaming ciphers, represented by the Stream interface,
+without knowing the details of the block encryption.
+
+The crypto/cipher interfaces look like this:
- The crypto/cipher interfaces look like this:
type Block interface {
BlockSize() int
Encrypt(dst, src []byte)
@@ -1622,40 +1677,42 @@ type Stream interface {
XORKeyStream(dst, src []byte)
}
- Here's the definition of the counter mode (CTR) stream, which turns a
- block cipher into a streaming cipher; notice that the block cipher's
- details are abstracted away:
+Here's the definition of the counter mode (CTR) stream, which turns a block
+cipher into a streaming cipher; notice that the block cipher's details are
+abstracted away:
+
// NewCTR returns a Stream that encrypts/decrypts using the given Block in
// counter mode. The length of iv must be the same as the Block's block size.
func NewCTR(block Block, iv []byte) Stream
- NewCTR applies not just to one specific encryption algorithm and data
- source but to any implementation of the Block interface and any Stream.
- Because they return interface values, replacing CTR encryption with
- other encryption modes is a localized change. The constructor calls
- must be edited, but because the surrounding code must treat the result
- only as a Stream, it won't notice the difference.
+NewCTR applies not just to one specific encryption algorithm and data source
+but to any implementation of the Block interface and any Stream. Because they
+return interface values, replacing CTR encryption with other encryption modes
+is a localized change. The constructor calls must be edited, but because the
+surrounding code must treat the result only as a Stream, it won't notice the
+difference.
- Interfaces and methods
+Interfaces and methods
+
+Since almost anything can have methods attached, almost anything can satisfy an
+interface. One illustrative example is in the http package, which defines the
+Handler interface. Any object that implements Handler can serve HTTP requests.
- Since almost anything can have methods attached, almost anything can
- satisfy an interface. One illustrative example is in the http package,
- which defines the Handler interface. Any object that implements Handler
- can serve HTTP requests.
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
- ResponseWriter is itself an interface that provides access to the
- methods needed to return the response to the client. Those methods
- include the standard Write method, so an http.ResponseWriter can be
- used wherever an io.Writer can be used. Request is a struct containing
- a parsed representation of the request from the client.
+ResponseWriter is itself an interface that provides access to the methods
+needed to return the response to the client. Those methods include the standard
+Write method, so an http.ResponseWriter can be used wherever an io.Writer can
+be used. Request is a struct containing a parsed representation of the request
+from the client.
+
+For brevity, let's ignore POSTs and assume HTTP requests are always GETs; that
+simplification does not affect the way the handlers are set up. Here's a
+trivial implementation of a handler to count the number of times the page is
+visited.
- For brevity, let's ignore POSTs and assume HTTP requests are always
- GETs; that simplification does not affect the way the handlers are set
- up. Here's a trivial implementation of a handler to count the number of
- times the page is visited.
// Simple counter server.
type Counter struct {
n int
@@ -1666,21 +1723,20 @@ func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "counter = %d\n", ctr.n)
}
- (Keeping with our theme, note how Fprintf can print to an
- http.ResponseWriter.) In a real server, access to ctr.n would need
- protection from concurrent access. See the sync and atomic packages for
- suggestions.
+(Keeping with our theme, note how Fprintf can print to an http.ResponseWriter.)
+In a real server, access to ctr.n would need protection from concurrent access.
+See the sync and atomic packages for suggestions.
+
+For reference, here's how to attach such a server to a node on the URL tree.
- For reference, here's how to attach such a server to a node on the URL
- tree.
import "net/http"
...
ctr := new(Counter)
http.Handle("/counter", ctr)
- But why make Counter a struct? An integer is all that's needed. (The
- receiver needs to be a pointer so the increment is visible to the
- caller.)
+But why make Counter a struct? An integer is all that's needed. (The receiver
+needs to be a pointer so the increment is visible to the caller.)
+
// Simpler counter server.
type Counter int
@@ -1689,8 +1745,9 @@ func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "counter = %d\n", *ctr)
}
- What if your program has some internal state that needs to be notified
- that a page has been visited? Tie a channel to the web page.
+What if your program has some internal state that needs to be notified that a
+page has been visited? Tie a channel to the web page.
+
// A channel that sends a notification on each visit.
// (Probably want the channel to be buffered.)
type Chan chan *http.Request
@@ -1700,18 +1757,19 @@ func (ch Chan) ServeHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Fprint(w, "notification sent")
}
- Finally, let's say we wanted to present on /args the arguments used
- when invoking the server binary. It's easy to write a function to print
- the arguments.
+Finally, let's say we wanted to present on /args the arguments used when
+invoking the server binary. It's easy to write a function to print the
+arguments.
+
func ArgServer() {
fmt.Println(os.Args)
}
- How do we turn that into an HTTP server? We could make ArgServer a
- method of some type whose value we ignore, but there's a cleaner way.
- Since we can define a method for any type except pointers and
- interfaces, we can write a method for a function. The http package
- contains this code:
+How do we turn that into an HTTP server? We could make ArgServer a method of
+some type whose value we ignore, but there's a cleaner way. Since we can define
+a method for any type except pointers and interfaces, we can write a method for
+a function. The http package contains this code:
+
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
@@ -1723,84 +1781,84 @@ func (f HandlerFunc) ServeHTTP(w ResponseWriter, req *Request) {
f(w, req)
}
- HandlerFunc is a type with a method, ServeHTTP, so values of that type
- can serve HTTP requests. Look at the implementation of the method: the
- receiver is a function, f, and the method calls f. That may seem odd
- but it's not that different from, say, the receiver being a channel and
- the method sending on the channel.
+HandlerFunc is a type with a method, ServeHTTP, so values of that type can
+serve HTTP requests. Look at the implementation of the method: the receiver is
+a function, f, and the method calls f. That may seem odd but it's not that
+different from, say, the receiver being a channel and the method sending on the
+channel.
+
+To make ArgServer into an HTTP server, we first modify it to have the right
+signature.
- To make ArgServer into an HTTP server, we first modify it to have the
- right signature.
// Argument server.
func ArgServer(w http.ResponseWriter, req *http.Request) {
fmt.Fprintln(w, os.Args)
}
- ArgServer now has the same signature as HandlerFunc, so it can be
- converted to that type to access its methods, just as we converted
- Sequence to IntSlice to access IntSlice.Sort. The code to set it up is
- concise:
+ArgServer now has the same signature as HandlerFunc, so it can be converted to
+that type to access its methods, just as we converted Sequence to IntSlice to
+access IntSlice.Sort. The code to set it up is concise:
+
http.Handle("/args", http.HandlerFunc(ArgServer))
- When someone visits the page /args, the handler installed at that page
- has value ArgServer and type HandlerFunc. The HTTP server will invoke
- the method ServeHTTP of that type, with ArgServer as the receiver,
- which will in turn call ArgServer (via the invocation f(w, req) inside
- HandlerFunc.ServeHTTP). The arguments will then be displayed.
+When someone visits the page /args, the handler installed at that page has
+value ArgServer and type HandlerFunc. The HTTP server will invoke the method
+ServeHTTP of that type, with ArgServer as the receiver, which will in turn call
+ArgServer (via the invocation f(w, req) inside HandlerFunc.ServeHTTP). The
+arguments will then be displayed.
- In this section we have made an HTTP server from a struct, an integer,
- a channel, and a function, all because interfaces are just sets of
- methods, which can be defined for (almost) any type.
+In this section we have made an HTTP server from a struct, an integer, a
+channel, and a function, all because interfaces are just sets of methods, which
+can be defined for (almost) any type.
The blank identifier
- We've mentioned the blank identifier a couple of times now, in the
- context of [70]for range loops and [71]maps. The blank identifier can
- be assigned or declared with any value of any type, with the value
- discarded harmlessly. It's a bit like writing to the Unix /dev/null
- file: it represents a write-only value to be used as a place-holder
- where a variable is needed but the actual value is irrelevant. It has
- uses beyond those we've seen already.
+We've mentioned the blank identifier a couple of times now, in the context of
+[70]for range loops and [71]maps. The blank identifier can be assigned or
+declared with any value of any type, with the value discarded harmlessly. It's
+a bit like writing to the Unix /dev/null file: it represents a write-only value
+to be used as a place-holder where a variable is needed but the actual value is
+irrelevant. It has uses beyond those we've seen already.
- The blank identifier in multiple assignment
+The blank identifier in multiple assignment
- The use of a blank identifier in a for range loop is a special case of
- a general situation: multiple assignment.
+The use of a blank identifier in a for range loop is a special case of a
+general situation: multiple assignment.
+
+If an assignment requires multiple values on the left side, but one of the
+values will not be used by the program, a blank identifier on the
+left-hand-side of the assignment avoids the need to create a dummy variable and
+makes it clear that the value is to be discarded. For instance, when calling a
+function that returns a value and an error, but only the error is important,
+use the blank identifier to discard the irrelevant value.
- If an assignment requires multiple values on the left side, but one of
- the values will not be used by the program, a blank identifier on the
- left-hand-side of the assignment avoids the need to create a dummy
- variable and makes it clear that the value is to be discarded. For
- instance, when calling a function that returns a value and an error,
- but only the error is important, use the blank identifier to discard
- the irrelevant value.
if _, err := os.Stat(path); os.IsNotExist(err) {
fmt.Printf("%s does not exist\n", path)
}
- Occasionally you'll see code that discards the error value in order to
- ignore the error; this is terrible practice. Always check error
- returns; they're provided for a reason.
+Occasionally you'll see code that discards the error value in order to ignore
+the error; this is terrible practice. Always check error returns; they're
+provided for a reason.
+
// Bad! This code will crash if path does not exist.
fi, _ := os.Stat(path)
if fi.IsDir() {
fmt.Printf("%s is a directory\n", path)
}
- Unused imports and variables
+Unused imports and variables
- It is an error to import a package or to declare a variable without
- using it. Unused imports bloat the program and slow compilation, while
- a variable that is initialized but not used is at least a wasted
- computation and perhaps indicative of a larger bug. When a program is
- under active development, however, unused imports and variables often
- arise and it can be annoying to delete them just to have the
- compilation proceed, only to have them be needed again later. The blank
- identifier provides a workaround.
+It is an error to import a package or to declare a variable without using it.
+Unused imports bloat the program and slow compilation, while a variable that is
+initialized but not used is at least a wasted computation and perhaps
+indicative of a larger bug. When a program is under active development,
+however, unused imports and variables often arise and it can be annoying to
+delete them just to have the compilation proceed, only to have them be needed
+again later. The blank identifier provides a workaround.
- This half-written program has two unused imports (fmt and io) and an
- unused variable (fd), so it will not compile, but it would be nice to
- see if the code so far is correct.
+This half-written program has two unused imports (fmt and io) and an unused
+variable (fd), so it will not compile, but it would be nice to see if the code
+so far is correct.
package main
@@ -1819,10 +1877,10 @@ func main() {
// TODO: use fd.
}
- To silence complaints about the unused imports, use a blank identifier
- to refer to a symbol from the imported package. Similarly, assigning
- the unused variable fd to the blank identifier will silence the unused
- variable error. This version of the program does compile.
+To silence complaints about the unused imports, use a blank identifier to refer
+to a symbol from the imported package. Similarly, assigning the unused variable
+fd to the blank identifier will silence the unused variable error. This version
+of the program does compile.
package main
@@ -1845,87 +1903,86 @@ func main() {
_ = fd
}
- By convention, the global declarations to silence import errors should
- come right after the imports and be commented, both to make them easy
- to find and as a reminder to clean things up later.
+By convention, the global declarations to silence import errors should come
+right after the imports and be commented, both to make them easy to find and as
+a reminder to clean things up later.
- Import for side effect
+Import for side effect
+
+An unused import like fmt or io in the previous example should eventually be
+used or removed: blank assignments identify code as a work in progress. But
+sometimes it is useful to import a package only for its side effects, without
+any explicit use. For example, during its init function, the [72]net/http/pprof
+package registers HTTP handlers that provide debugging information. It has an
+exported API, but most clients need only the handler registration and access
+the data through a web page. To import the package only for its side effects,
+rename the package to the blank identifier:
- An unused import like fmt or io in the previous example should
- eventually be used or removed: blank assignments identify code as a
- work in progress. But sometimes it is useful to import a package only
- for its side effects, without any explicit use. For example, during its
- init function, the [72]net/http/pprof package registers HTTP handlers
- that provide debugging information. It has an exported API, but most
- clients need only the handler registration and access the data through
- a web page. To import the package only for its side effects, rename the
- package to the blank identifier:
import _ "net/http/pprof"
- This form of import makes clear that the package is being imported for
- its side effects, because there is no other possible use of the
- package: in this file, it doesn't have a name. (If it did, and we
- didn't use that name, the compiler would reject the program.)
+This form of import makes clear that the package is being imported for its side
+effects, because there is no other possible use of the package: in this file,
+it doesn't have a name. (If it did, and we didn't use that name, the compiler
+would reject the program.)
- Interface checks
+Interface checks
- As we saw in the discussion of [73]interfaces above, a type need not
- declare explicitly that it implements an interface. Instead, a type
- implements the interface just by implementing the interface's methods.
- In practice, most interface conversions are static and therefore
- checked at compile time. For example, passing an *os.File to a function
- expecting an io.Reader will not compile unless *os.File implements the
- io.Reader interface.
+As we saw in the discussion of [73]interfaces above, a type need not declare
+explicitly that it implements an interface. Instead, a type implements the
+interface just by implementing the interface's methods. In practice, most
+interface conversions are static and therefore checked at compile time. For
+example, passing an *os.File to a function expecting an io.Reader will not
+compile unless *os.File implements the io.Reader interface.
+
+Some interface checks do happen at run-time, though. One instance is in the
+[74]encoding/json package, which defines a [75]Marshaler interface. When the
+JSON encoder receives a value that implements that interface, the encoder
+invokes the value's marshaling method to convert it to JSON instead of doing
+the standard conversion. The encoder checks this property at run time with a
+[76]type assertion like:
- Some interface checks do happen at run-time, though. One instance is in
- the [74]encoding/json package, which defines a [75]Marshaler interface.
- When the JSON encoder receives a value that implements that interface,
- the encoder invokes the value's marshaling method to convert it to JSON
- instead of doing the standard conversion. The encoder checks this
- property at run time with a [76]type assertion like:
m, ok := val.(json.Marshaler)
- If it's necessary only to ask whether a type implements an interface,
- without actually using the interface itself, perhaps as part of an
- error check, use the blank identifier to ignore the type-asserted
- value:
+If it's necessary only to ask whether a type implements an interface, without
+actually using the interface itself, perhaps as part of an error check, use the
+blank identifier to ignore the type-asserted value:
+
if _, ok := val.(json.Marshaler); ok {
fmt.Printf("value %v of type %T implements json.Marshaler\n", val, val)
}
- One place this situation arises is when it is necessary to guarantee
- within the package implementing the type that it actually satisfies the
- interface. If a type—for example, [77]json.RawMessage—needs a custom
- JSON representation, it should implement json.Marshaler, but there are
- no static conversions that would cause the compiler to verify this
- automatically. If the type inadvertently fails to satisfy the
- interface, the JSON encoder will still work, but will not use the
- custom implementation. To guarantee that the implementation is correct,
- a global declaration using the blank identifier can be used in the
- package:
+One place this situation arises is when it is necessary to guarantee within the
+package implementing the type that it actually satisfies the interface. If a
+type—for example, [77]json.RawMessage—needs a custom JSON representation, it
+should implement json.Marshaler, but there are no static conversions that would
+cause the compiler to verify this automatically. If the type inadvertently
+fails to satisfy the interface, the JSON encoder will still work, but will not
+use the custom implementation. To guarantee that the implementation is correct,
+a global declaration using the blank identifier can be used in the package:
+
var _ json.Marshaler = (*RawMessage)(nil)
- In this declaration, the assignment involving a conversion of a
- *RawMessage to a Marshaler requires that *RawMessage implements
- Marshaler, and that property will be checked at compile time. Should
- the json.Marshaler interface change, this package will no longer
- compile and we will be on notice that it needs to be updated.
+In this declaration, the assignment involving a conversion of a *RawMessage to
+a Marshaler requires that *RawMessage implements Marshaler, and that property
+will be checked at compile time. Should the json.Marshaler interface change,
+this package will no longer compile and we will be on notice that it needs to
+be updated.
- The appearance of the blank identifier in this construct indicates that
- the declaration exists only for the type checking, not to create a
- variable. Don't do this for every type that satisfies an interface,
- though. By convention, such declarations are only used when there are
- no static conversions already present in the code, which is a rare
- event.
+The appearance of the blank identifier in this construct indicates that the
+declaration exists only for the type checking, not to create a variable. Don't
+do this for every type that satisfies an interface, though. By convention, such
+declarations are only used when there are no static conversions already present
+in the code, which is a rare event.
Embedding
- Go does not provide the typical, type-driven notion of subclassing, but
- it does have the ability to “borrow” pieces of an implementation by
- embedding types within a struct or interface.
+Go does not provide the typical, type-driven notion of subclassing, but it does
+have the ability to “borrow” pieces of an implementation by embedding types
+within a struct or interface.
+
+Interface embedding is very simple. We've mentioned the io.Reader and io.Writer
+interfaces before; here are their definitions.
- Interface embedding is very simple. We've mentioned the io.Reader and
- io.Writer interfaces before; here are their definitions.
type Reader interface {
Read(p []byte) (n int, err error)
}
@@ -1934,29 +1991,29 @@ type Writer interface {
Write(p []byte) (n int, err error)
}
- The io package also exports several other interfaces that specify
- objects that can implement several such methods. For instance, there is
- io.ReadWriter, an interface containing both Read and Write. We could
- specify io.ReadWriter by listing the two methods explicitly, but it's
- easier and more evocative to embed the two interfaces to form the new
- one, like this:
+The io package also exports several other interfaces that specify objects that
+can implement several such methods. For instance, there is io.ReadWriter, an
+interface containing both Read and Write. We could specify io.ReadWriter by
+listing the two methods explicitly, but it's easier and more evocative to embed
+the two interfaces to form the new one, like this:
+
// ReadWriter is the interface that combines the Reader and Writer interfaces.
type ReadWriter interface {
Reader
Writer
}
- This says just what it looks like: A ReadWriter can do what a Reader
- does and what a Writer does; it is a union of the embedded interfaces.
- Only interfaces can be embedded within interfaces.
+This says just what it looks like: A ReadWriter can do what a Reader does and
+what a Writer does; it is a union of the embedded interfaces. Only interfaces
+can be embedded within interfaces.
+
+The same basic idea applies to structs, but with more far-reaching
+implications. The bufio package has two struct types, bufio.Reader and
+bufio.Writer, each of which of course implements the analogous interfaces from
+package io. And bufio also implements a buffered reader/writer, which it does
+by combining a reader and a writer into one struct using embedding: it lists
+the types within the struct but does not give them field names.
- The same basic idea applies to structs, but with more far-reaching
- implications. The bufio package has two struct types, bufio.Reader and
- bufio.Writer, each of which of course implements the analogous
- interfaces from package io. And bufio also implements a buffered
- reader/writer, which it does by combining a reader and a writer into
- one struct using embedding: it lists the types within the struct but
- does not give them field names.
// ReadWriter stores pointers to a Reader and a Writer.
// It implements io.ReadWriter.
type ReadWriter struct {
@@ -1964,137 +2021,136 @@ type ReadWriter struct {
*Writer // *bufio.Writer
}
- The embedded elements are pointers to structs and of course must be
- initialized to point to valid structs before they can be used. The
- ReadWriter struct could be written as
+The embedded elements are pointers to structs and of course must be initialized
+to point to valid structs before they can be used. The ReadWriter struct could
+be written as
+
type ReadWriter struct {
reader *Reader
writer *Writer
}
- but then to promote the methods of the fields and to satisfy the io
- interfaces, we would also need to provide forwarding methods, like
- this:
+but then to promote the methods of the fields and to satisfy the io interfaces,
+we would also need to provide forwarding methods, like this:
+
func (rw *ReadWriter) Read(p []byte) (n int, err error) {
return rw.reader.Read(p)
}
- By embedding the structs directly, we avoid this bookkeeping. The
- methods of embedded types come along for free, which means that
- bufio.ReadWriter not only has the methods of bufio.Reader and
- bufio.Writer, it also satisfies all three interfaces: io.Reader,
- io.Writer, and io.ReadWriter.
+By embedding the structs directly, we avoid this bookkeeping. The methods of
+embedded types come along for free, which means that bufio.ReadWriter not only
+has the methods of bufio.Reader and bufio.Writer, it also satisfies all three
+interfaces: io.Reader, io.Writer, and io.ReadWriter.
- There's an important way in which embedding differs from subclassing.
- When we embed a type, the methods of that type become methods of the
- outer type, but when they are invoked the receiver of the method is the
- inner type, not the outer one. In our example, when the Read method of
- a bufio.ReadWriter is invoked, it has exactly the same effect as the
- forwarding method written out above; the receiver is the reader field
- of the ReadWriter, not the ReadWriter itself.
+There's an important way in which embedding differs from subclassing. When we
+embed a type, the methods of that type become methods of the outer type, but
+when they are invoked the receiver of the method is the inner type, not the
+outer one. In our example, when the Read method of a bufio.ReadWriter is
+invoked, it has exactly the same effect as the forwarding method written out
+above; the receiver is the reader field of the ReadWriter, not the ReadWriter
+itself.
+
+Embedding can also be a simple convenience. This example shows an embedded
+field alongside a regular, named field.
- Embedding can also be a simple convenience. This example shows an
- embedded field alongside a regular, named field.
type Job struct {
Command string
*log.Logger
}
- The Job type now has the Print, Printf, Println and other methods of
- *log.Logger. We could have given the Logger a field name, of course,
- but it's not necessary to do so. And now, once initialized, we can log
- to the Job:
+The Job type now has the Print, Printf, Println and other methods of
+*log.Logger. We could have given the Logger a field name, of course, but it's
+not necessary to do so. And now, once initialized, we can log to the Job:
+
job.Println("starting now...")
- The Logger is a regular field of the Job struct, so we can initialize
- it in the usual way inside the constructor for Job, like this,
+The Logger is a regular field of the Job struct, so we can initialize it in the
+usual way inside the constructor for Job, like this,
+
func NewJob(command string, logger *log.Logger) *Job {
return &Job{command, logger}
}
- or with a composite literal,
+or with a composite literal,
+
job := &Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}
- If we need to refer to an embedded field directly, the type name of the
- field, ignoring the package qualifier, serves as a field name, as it
- did in the Read method of our ReadWriter struct. Here, if we needed to
- access the *log.Logger of a Job variable job, we would write
- job.Logger, which would be useful if we wanted to refine the methods of
- Logger.
+If we need to refer to an embedded field directly, the type name of the field,
+ignoring the package qualifier, serves as a field name, as it did in the Read
+method of our ReadWriter struct. Here, if we needed to access the *log.Logger
+of a Job variable job, we would write job.Logger, which would be useful if we
+wanted to refine the methods of Logger.
+
func (job *Job) Printf(format string, args ...interface{}) {
job.Logger.Printf("%q: %s", job.Command, fmt.Sprintf(format, args...))
}
- Embedding types introduces the problem of name conflicts but the rules
- to resolve them are simple. First, a field or method X hides any other
- item X in a more deeply nested part of the type. If log.Logger
- contained a field or method called Command, the Command field of Job
- would dominate it.
+Embedding types introduces the problem of name conflicts but the rules to
+resolve them are simple. First, a field or method X hides any other item X in a
+more deeply nested part of the type. If log.Logger contained a field or method
+called Command, the Command field of Job would dominate it.
- Second, if the same name appears at the same nesting level, it is
- usually an error; it would be erroneous to embed log.Logger if the Job
- struct contained another field or method called Logger. However, if the
- duplicate name is never mentioned in the program outside the type
- definition, it is OK. This qualification provides some protection
- against changes made to types embedded from outside; there is no
- problem if a field is added that conflicts with another field in
- another subtype if neither field is ever used.
+Second, if the same name appears at the same nesting level, it is usually an
+error; it would be erroneous to embed log.Logger if the Job struct contained
+another field or method called Logger. However, if the duplicate name is never
+mentioned in the program outside the type definition, it is OK. This
+qualification provides some protection against changes made to types embedded
+from outside; there is no problem if a field is added that conflicts with
+another field in another subtype if neither field is ever used.
Concurrency
- Share by communicating
+Share by communicating
- Concurrent programming is a large topic and there is space only for
- some Go-specific highlights here.
+Concurrent programming is a large topic and there is space only for some
+Go-specific highlights here.
- Concurrent programming in many environments is made difficult by the
- subtleties required to implement correct access to shared variables. Go
- encourages a different approach in which shared values are passed
- around on channels and, in fact, never actively shared by separate
- threads of execution. Only one goroutine has access to the value at any
- given time. Data races cannot occur, by design. To encourage this way
- of thinking we have reduced it to a slogan:
+Concurrent programming in many environments is made difficult by the subtleties
+required to implement correct access to shared variables. Go encourages a
+different approach in which shared values are passed around on channels and, in
+fact, never actively shared by separate threads of execution. Only one
+goroutine has access to the value at any given time. Data races cannot occur,
+by design. To encourage this way of thinking we have reduced it to a slogan:
- Do not communicate by sharing memory; instead, share memory by
- communicating.
+ Do not communicate by sharing memory; instead, share memory by
+ communicating.
- This approach can be taken too far. Reference counts may be best done
- by putting a mutex around an integer variable, for instance. But as a
- high-level approach, using channels to control access makes it easier
- to write clear, correct programs.
+This approach can be taken too far. Reference counts may be best done by
+putting a mutex around an integer variable, for instance. But as a high-level
+approach, using channels to control access makes it easier to write clear,
+correct programs.
- One way to think about this model is to consider a typical
- single-threaded program running on one CPU. It has no need for
- synchronization primitives. Now run another such instance; it too needs
- no synchronization. Now let those two communicate; if the communication
- is the synchronizer, there's still no need for other synchronization.
- Unix pipelines, for example, fit this model perfectly. Although Go's
- approach to concurrency originates in Hoare's Communicating Sequential
- Processes (CSP), it can also be seen as a type-safe generalization of
- Unix pipes.
+One way to think about this model is to consider a typical single-threaded
+program running on one CPU. It has no need for synchronization primitives. Now
+run another such instance; it too needs no synchronization. Now let those two
+communicate; if the communication is the synchronizer, there's still no need
+for other synchronization. Unix pipelines, for example, fit this model
+perfectly. Although Go's approach to concurrency originates in Hoare's
+Communicating Sequential Processes (CSP), it can also be seen as a type-safe
+generalization of Unix pipes.
- Goroutines
+Goroutines
- They're called goroutines because the existing terms—threads,
- coroutines, processes, and so on—convey inaccurate connotations. A
- goroutine has a simple model: it is a function executing concurrently
- with other goroutines in the same address space. It is lightweight,
- costing little more than the allocation of stack space. And the stacks
- start small, so they are cheap, and grow by allocating (and freeing)
- heap storage as required.
+They're called goroutines because the existing terms—threads, coroutines,
+processes, and so on—convey inaccurate connotations. A goroutine has a simple
+model: it is a function executing concurrently with other goroutines in the
+same address space. It is lightweight, costing little more than the allocation
+of stack space. And the stacks start small, so they are cheap, and grow by
+allocating (and freeing) heap storage as required.
- Goroutines are multiplexed onto multiple OS threads so if one should
- block, such as while waiting for I/O, others continue to run. Their
- design hides many of the complexities of thread creation and
- management.
+Goroutines are multiplexed onto multiple OS threads so if one should block,
+such as while waiting for I/O, others continue to run. Their design hides many
+of the complexities of thread creation and management.
+
+Prefix a function or method call with the go keyword to run the call in a new
+goroutine. When the call completes, the goroutine exits, silently. (The effect
+is similar to the Unix shell's & notation for running a command in the
+background.)
- Prefix a function or method call with the go keyword to run the call in
- a new goroutine. When the call completes, the goroutine exits,
- silently. (The effect is similar to the Unix shell's & notation for
- running a command in the background.)
go list.Sort() // run list.Sort concurrently; don't wait for it.
- A function literal can be handy in a goroutine invocation.
+A function literal can be handy in a goroutine invocation.
+
func Announce(message string, delay time.Duration) {
go func() {
time.Sleep(delay)
@@ -2102,31 +2158,31 @@ func Announce(message string, delay time.Duration) {
}() // Note the parentheses - must call the function.
}
- In Go, function literals are closures: the implementation makes sure
- the variables referred to by the function survive as long as they are
- active.
+In Go, function literals are closures: the implementation makes sure the
+variables referred to by the function survive as long as they are active.
- These examples aren't too practical because the functions have no way
- of signaling completion. For that, we need channels.
+These examples aren't too practical because the functions have no way of
+signaling completion. For that, we need channels.
- Channels
+Channels
+
+Like maps, channels are allocated with make, and the resulting value acts as a
+reference to an underlying data structure. If an optional integer parameter is
+provided, it sets the buffer size for the channel. The default is zero, for an
+unbuffered or synchronous channel.
- Like maps, channels are allocated with make, and the resulting value
- acts as a reference to an underlying data structure. If an optional
- integer parameter is provided, it sets the buffer size for the channel.
- The default is zero, for an unbuffered or synchronous channel.
ci := make(chan int) // unbuffered channel of integers
cj := make(chan int, 0) // unbuffered channel of integers
cs := make(chan *os.File, 100) // buffered channel of pointers to Files
- Unbuffered channels combine communication—the exchange of a value—with
- synchronization—guaranteeing that two calculations (goroutines) are in
- a known state.
+Unbuffered channels combine communication—the exchange of a value—with
+synchronization—guaranteeing that two calculations (goroutines) are in a known
+state.
+
+There are lots of nice idioms using channels. Here's one to get us started. In
+the previous section we launched a sort in the background. A channel can allow
+the launching goroutine to wait for the sort to complete.
- There are lots of nice idioms using channels. Here's one to get us
- started. In the previous section we launched a sort in the background.
- A channel can allow the launching goroutine to wait for the sort to
- complete.
c := make(chan int) // Allocate a channel.
// Start the sort in a goroutine; when it completes, signal on the channel.
go func() {
@@ -2136,18 +2192,19 @@ go func() {
doSomethingForAWhile()
<-c // Wait for sort to finish; discard sent value.
- Receivers always block until there is data to receive. If the channel
- is unbuffered, the sender blocks until the receiver has received the
- value. If the channel has a buffer, the sender blocks only until the
- value has been copied to the buffer; if the buffer is full, this means
- waiting until some receiver has retrieved a value.
+Receivers always block until there is data to receive. If the channel is
+unbuffered, the sender blocks until the receiver has received the value. If the
+channel has a buffer, the sender blocks only until the value has been copied to
+the buffer; if the buffer is full, this means waiting until some receiver has
+retrieved a value.
+
+A buffered channel can be used like a semaphore, for instance to limit
+throughput. In this example, incoming requests are passed to handle, which
+sends a value into the channel, processes the request, and then receives a
+value from the channel to ready the “semaphore” for the next consumer. The
+capacity of the channel buffer limits the number of simultaneous calls to
+process.
- A buffered channel can be used like a semaphore, for instance to limit
- throughput. In this example, incoming requests are passed to handle,
- which sends a value into the channel, processes the request, and then
- receives a value from the channel to ready the “semaphore” for the next
- consumer. The capacity of the channel buffer limits the number of
- simultaneous calls to process.
var sem = make(chan int, MaxOutstanding)
func handle(r *Request) {
@@ -2163,16 +2220,17 @@ func Serve(queue chan *Request) {
}
}
- Once MaxOutstanding handlers are executing process, any more will block
- trying to send into the filled channel buffer, until one of the
- existing handlers finishes and receives from the buffer.
+Once MaxOutstanding handlers are executing process, any more will block trying
+to send into the filled channel buffer, until one of the existing handlers
+finishes and receives from the buffer.
+
+This design has a problem, though: Serve creates a new goroutine for every
+incoming request, even though only MaxOutstanding of them can run at any
+moment. As a result, the program can consume unlimited resources if the
+requests come in too fast. We can address that deficiency by changing Serve to
+gate the creation of the goroutines. Here's an obvious solution, but beware it
+has a bug we'll fix subsequently:
- This design has a problem, though: Serve creates a new goroutine for
- every incoming request, even though only MaxOutstanding of them can run
- at any moment. As a result, the program can consume unlimited resources
- if the requests come in too fast. We can address that deficiency by
- changing Serve to gate the creation of the goroutines. Here's an
- obvious solution, but beware it has a bug we'll fix subsequently:
func Serve(queue chan *Request) {
for req := range queue {
sem <- 1
@@ -2183,11 +2241,12 @@ func Serve(queue chan *Request) {
}
}
- The bug is that in a Go for loop, the loop variable is reused for each
- iteration, so the req variable is shared across all goroutines. That's
- not what we want. We need to make sure that req is unique for each
- goroutine. Here's one way to do that, passing the value of req as an
- argument to the closure in the goroutine:
+The bug is that in a Go for loop, the loop variable is reused for each
+iteration, so the req variable is shared across all goroutines. That's not what
+we want. We need to make sure that req is unique for each goroutine. Here's one
+way to do that, passing the value of req as an argument to the closure in the
+goroutine:
+
func Serve(queue chan *Request) {
for req := range queue {
sem <- 1
@@ -2198,9 +2257,10 @@ func Serve(queue chan *Request) {
}
}
- Compare this version with the previous to see the difference in how the
- closure is declared and run. Another solution is just to create a new
- variable with the same name, as in this example:
+Compare this version with the previous to see the difference in how the closure
+is declared and run. Another solution is just to create a new variable with the
+same name, as in this example:
+
func Serve(queue chan *Request) {
for req := range queue {
req := req // Create new instance of req for the goroutine.
@@ -2212,19 +2272,21 @@ func Serve(queue chan *Request) {
}
}
- It may seem odd to write
+It may seem odd to write
+
req := req
- but it's legal and idiomatic in Go to do this. You get a fresh version
- of the variable with the same name, deliberately shadowing the loop
- variable locally but unique to each goroutine.
+but it's legal and idiomatic in Go to do this. You get a fresh version of the
+variable with the same name, deliberately shadowing the loop variable locally
+but unique to each goroutine.
+
+Going back to the general problem of writing the server, another approach that
+manages resources well is to start a fixed number of handle goroutines all
+reading from the request channel. The number of goroutines limits the number of
+simultaneous calls to process. This Serve function also accepts a channel on
+which it will be told to exit; after launching the goroutines it blocks
+receiving from that channel.
- Going back to the general problem of writing the server, another
- approach that manages resources well is to start a fixed number of
- handle goroutines all reading from the request channel. The number of
- goroutines limits the number of simultaneous calls to process. This
- Serve function also accepts a channel on which it will be told to exit;
- after launching the goroutines it blocks receiving from that channel.
func handle(queue chan *Request) {
for r := range queue {
process(r)
@@ -2239,25 +2301,26 @@ func Serve(clientRequests chan *Request, quit chan bool) {
<-quit // Wait to be told to exit.
}
- Channels of channels
+Channels of channels
- One of the most important properties of Go is that a channel is a
- first-class value that can be allocated and passed around like any
- other. A common use of this property is to implement safe, parallel
- demultiplexing.
+One of the most important properties of Go is that a channel is a first-class
+value that can be allocated and passed around like any other. A common use of
+this property is to implement safe, parallel demultiplexing.
+
+In the example in the previous section, handle was an idealized handler for a
+request but we didn't define the type it was handling. If that type includes a
+channel on which to reply, each client can provide its own path for the answer.
+Here's a schematic definition of type Request.
- In the example in the previous section, handle was an idealized handler
- for a request but we didn't define the type it was handling. If that
- type includes a channel on which to reply, each client can provide its
- own path for the answer. Here's a schematic definition of type Request.
type Request struct {
args []int
f func([]int) int
resultChan chan int
}
- The client provides a function and its arguments, as well as a channel
- inside the request object on which to receive the answer.
+The client provides a function and its arguments, as well as a channel inside
+the request object on which to receive the answer.
+
func sum(a []int) (s int) {
for _, v := range a {
s += v
@@ -2271,28 +2334,29 @@ clientRequests <- request
// Wait for response.
fmt.Printf("answer: %d\n", <-request.resultChan)
- On the server side, the handler function is the only thing that
- changes.
+On the server side, the handler function is the only thing that changes.
+
func handle(queue chan *Request) {
for req := range queue {
req.resultChan <- req.f(req.args)
}
}
- There's clearly a lot more to do to make it realistic, but this code is
- a framework for a rate-limited, parallel, non-blocking RPC system, and
- there's not a mutex in sight.
+There's clearly a lot more to do to make it realistic, but this code is a
+framework for a rate-limited, parallel, non-blocking RPC system, and there's
+not a mutex in sight.
- Parallelization
+Parallelization
- Another application of these ideas is to parallelize a calculation
- across multiple CPU cores. If the calculation can be broken into
- separate pieces that can execute independently, it can be parallelized,
- with a channel to signal when each piece completes.
+Another application of these ideas is to parallelize a calculation across
+multiple CPU cores. If the calculation can be broken into separate pieces that
+can execute independently, it can be parallelized, with a channel to signal
+when each piece completes.
+
+Let's say we have an expensive operation to perform on a vector of items, and
+that the value of the operation on each item is independent, as in this
+idealized example.
- Let's say we have an expensive operation to perform on a vector of
- items, and that the value of the operation on each item is independent,
- as in this idealized example.
type Vector []float64
// Apply the operation to v[i], v[i+1] ... up to v[n-1].
@@ -2303,10 +2367,10 @@ func (v Vector) DoSome(i, n int, u Vector, c chan int) {
c <- 1 // signal that this piece is done
}
- We launch the pieces independently in a loop, one per CPU. They can
- complete in any order but it doesn't matter; we just count the
- completion signals by draining the channel after launching all the
- goroutines.
+We launch the pieces independently in a loop, one per CPU. They can complete in
+any order but it doesn't matter; we just count the completion signals by
+draining the channel after launching all the goroutines.
+
const numCPU = 4 // number of CPU cores
func (v Vector) DoAll(u Vector) {
@@ -2321,37 +2385,39 @@ func (v Vector) DoAll(u Vector) {
// All done.
}
- Rather than create a constant value for numCPU, we can ask the runtime
- what value is appropriate. The function [78]runtime.NumCPU returns the
- number of hardware CPU cores in the machine, so we could write
+Rather than create a constant value for numCPU, we can ask the runtime what
+value is appropriate. The function [78]runtime.NumCPU returns the number of
+hardware CPU cores in the machine, so we could write
+
var numCPU = runtime.NumCPU()
- There is also a function [79]runtime.GOMAXPROCS, which reports (or
- sets) the user-specified number of cores that a Go program can have
- running simultaneously. It defaults to the value of runtime.NumCPU but
- can be overridden by setting the similarly named shell environment
- variable or by calling the function with a positive number. Calling it
- with zero just queries the value. Therefore if we want to honor the
- user's resource request, we should write
+There is also a function [79]runtime.GOMAXPROCS, which reports (or sets) the
+user-specified number of cores that a Go program can have running
+simultaneously. It defaults to the value of runtime.NumCPU but can be
+overridden by setting the similarly named shell environment variable or by
+calling the function with a positive number. Calling it with zero just queries
+the value. Therefore if we want to honor the user's resource request, we should
+write
+
var numCPU = runtime.GOMAXPROCS(0)
- Be sure not to confuse the ideas of concurrency—structuring a program
- as independently executing components—and parallelism—executing
- calculations in parallel for efficiency on multiple CPUs. Although the
- concurrency features of Go can make some problems easy to structure as
- parallel computations, Go is a concurrent language, not a parallel one,
- and not all parallelization problems fit Go's model. For a discussion
- of the distinction, see the talk cited in [80]this blog post.
+Be sure not to confuse the ideas of concurrency—structuring a program as
+independently executing components—and parallelism—executing calculations in
+parallel for efficiency on multiple CPUs. Although the concurrency features of
+Go can make some problems easy to structure as parallel computations, Go is a
+concurrent language, not a parallel one, and not all parallelization problems
+fit Go's model. For a discussion of the distinction, see the talk cited in [80]
+this blog post.
- A leaky buffer
+A leaky buffer
+
+The tools of concurrent programming can even make non-concurrent ideas easier
+to express. Here's an example abstracted from an RPC package. The client
+goroutine loops receiving data from some source, perhaps a network. To avoid
+allocating and freeing buffers, it keeps a free list, and uses a buffered
+channel to represent it. If the channel is empty, a new buffer gets allocated.
+Once the message buffer is ready, it's sent to the server on serverChan.
- The tools of concurrent programming can even make non-concurrent ideas
- easier to express. Here's an example abstracted from an RPC package.
- The client goroutine loops receiving data from some source, perhaps a
- network. To avoid allocating and freeing buffers, it keeps a free list,
- and uses a buffered channel to represent it. If the channel is empty, a
- new buffer gets allocated. Once the message buffer is ready, it's sent
- to the server on serverChan.
var freeList = make(chan *Buffer, 100)
var serverChan = make(chan *Buffer)
@@ -2371,8 +2437,9 @@ func client() {
}
}
- The server loop receives each message from the client, processes it,
- and returns the buffer to the free list.
+The server loop receives each message from the client, processes it, and
+returns the buffer to the free list.
+
func server() {
for {
b := <-serverChan // Wait for work.
@@ -2387,37 +2454,36 @@ func server() {
}
}
- The client attempts to retrieve a buffer from freeList; if none is
- available, it allocates a fresh one. The server's send to freeList puts
- b back on the free list unless the list is full, in which case the
- buffer is dropped on the floor to be reclaimed by the garbage
- collector. (The default clauses in the select statements execute when
- no other case is ready, meaning that the selects never block.) This
- implementation builds a leaky bucket free list in just a few lines,
- relying on the buffered channel and the garbage collector for
- bookkeeping.
+The client attempts to retrieve a buffer from freeList; if none is available,
+it allocates a fresh one. The server's send to freeList puts b back on the free
+list unless the list is full, in which case the buffer is dropped on the floor
+to be reclaimed by the garbage collector. (The default clauses in the select
+statements execute when no other case is ready, meaning that the selects never
+block.) This implementation builds a leaky bucket free list in just a few
+lines, relying on the buffered channel and the garbage collector for
+bookkeeping.
Errors
- Library routines must often return some sort of error indication to the
- caller. As mentioned earlier, Go's multivalue return makes it easy to
- return a detailed error description alongside the normal return value.
- It is good style to use this feature to provide detailed error
- information. For example, as we'll see, os.Open doesn't just return a
- nil pointer on failure, it also returns an error value that describes
- what went wrong.
+Library routines must often return some sort of error indication to the caller.
+As mentioned earlier, Go's multivalue return makes it easy to return a detailed
+error description alongside the normal return value. It is good style to use
+this feature to provide detailed error information. For example, as we'll see,
+os.Open doesn't just return a nil pointer on failure, it also returns an error
+value that describes what went wrong.
+
+By convention, errors have type error, a simple built-in interface.
- By convention, errors have type error, a simple built-in interface.
type error interface {
Error() string
}
- A library writer is free to implement this interface with a richer
- model under the covers, making it possible not only to see the error
- but also to provide some context. As mentioned, alongside the usual
- *os.File return value, os.Open also returns an error value. If the file
- is opened successfully, the error will be nil, but when there is a
- problem, it will hold an os.PathError:
+A library writer is free to implement this interface with a richer model under
+the covers, making it possible not only to see the error but also to provide
+some context. As mentioned, alongside the usual *os.File return value, os.Open
+also returns an error value. If the file is opened successfully, the error will
+be nil, but when there is a problem, it will hold an os.PathError:
+
// PathError records an error and the operation and
// file path that caused it.
type PathError struct {
@@ -2430,23 +2496,24 @@ func (e *PathError) Error() string {
return e.Op + " " + e.Path + ": " + e.Err.Error()
}
- PathError's Error generates a string like this:
+PathError's Error generates a string like this:
+
open /etc/passwx: no such file or directory
- Such an error, which includes the problematic file name, the operation,
- and the operating system error it triggered, is useful even if printed
- far from the call that caused it; it is much more informative than the
- plain "no such file or directory".
+Such an error, which includes the problematic file name, the operation, and the
+operating system error it triggered, is useful even if printed far from the
+call that caused it; it is much more informative than the plain "no such file
+or directory".
- When feasible, error strings should identify their origin, such as by
- having a prefix naming the operation or package that generated the
- error. For example, in package image, the string representation for a
- decoding error due to an unknown format is "image: unknown format".
+When feasible, error strings should identify their origin, such as by having a
+prefix naming the operation or package that generated the error. For example,
+in package image, the string representation for a decoding error due to an
+unknown format is "image: unknown format".
+
+Callers that care about the precise error details can use a type switch or a
+type assertion to look for specific errors and extract details. For PathErrors
+this might include examining the internal Err field for recoverable failures.
- Callers that care about the precise error details can use a type switch
- or a type assertion to look for specific errors and extract details.
- For PathErrors this might include examining the internal Err field for
- recoverable failures.
for try := 0; try < 2; try++ {
file, err = os.Create(filename)
if err == nil {
@@ -2459,24 +2526,24 @@ for try := 0; try < 2; try++ {
return
}
- The second if statement here is another [81]type assertion. If it
- fails, ok will be false, and e will be nil. If it succeeds, ok will be
- true, which means the error was of type *os.PathError, and then so is
- e, which we can examine for more information about the error.
+The second if statement here is another [81]type assertion. If it fails, ok
+will be false, and e will be nil. If it succeeds, ok will be true, which means
+the error was of type *os.PathError, and then so is e, which we can examine for
+more information about the error.
- Panic
+Panic
- The usual way to report an error to a caller is to return an error as
- an extra return value. The canonical Read method is a well-known
- instance; it returns a byte count and an error. But what if the error
- is unrecoverable? Sometimes the program simply cannot continue.
+The usual way to report an error to a caller is to return an error as an extra
+return value. The canonical Read method is a well-known instance; it returns a
+byte count and an error. But what if the error is unrecoverable? Sometimes the
+program simply cannot continue.
+
+For this purpose, there is a built-in function panic that in effect creates a
+run-time error that will stop the program (but see the next section). The
+function takes a single argument of arbitrary type—often a string—to be printed
+as the program dies. It's also a way to indicate that something impossible has
+happened, such as exiting an infinite loop.
- For this purpose, there is a built-in function panic that in effect
- creates a run-time error that will stop the program (but see the next
- section). The function takes a single argument of arbitrary type—often
- a string—to be printed as the program dies. It's also a way to indicate
- that something impossible has happened, such as exiting an infinite
- loop.
// A toy implementation of cube root using Newton's method.
func CubeRoot(x float64) float64 {
z := x/3 // Arbitrary initial value
@@ -2491,12 +2558,12 @@ func CubeRoot(x float64) float64 {
panic(fmt.Sprintf("CubeRoot(%g) did not converge", x))
}
- This is only an example but real library functions should avoid panic.
- If the problem can be masked or worked around, it's always better to
- let things continue to run rather than taking down the whole program.
- One possible counterexample is during initialization: if the library
- truly cannot set itself up, it might be reasonable to panic, so to
- speak.
+This is only an example but real library functions should avoid panic. If the
+problem can be masked or worked around, it's always better to let things
+continue to run rather than taking down the whole program. One possible
+counterexample is during initialization: if the library truly cannot set itself
+up, it might be reasonable to panic, so to speak.
+
var user = os.Getenv("USER")
func init() {
@@ -2505,23 +2572,23 @@ func init() {
}
}
- Recover
+Recover
- When panic is called, including implicitly for run-time errors such as
- indexing a slice out of bounds or failing a type assertion, it
- immediately stops execution of the current function and begins
- unwinding the stack of the goroutine, running any deferred functions
- along the way. If that unwinding reaches the top of the goroutine's
- stack, the program dies. However, it is possible to use the built-in
- function recover to regain control of the goroutine and resume normal
- execution.
+When panic is called, including implicitly for run-time errors such as indexing
+a slice out of bounds or failing a type assertion, it immediately stops
+execution of the current function and begins unwinding the stack of the
+goroutine, running any deferred functions along the way. If that unwinding
+reaches the top of the goroutine's stack, the program dies. However, it is
+possible to use the built-in function recover to regain control of the
+goroutine and resume normal execution.
- A call to recover stops the unwinding and returns the argument passed
- to panic. Because the only code that runs while unwinding is inside
- deferred functions, recover is only useful inside deferred functions.
+A call to recover stops the unwinding and returns the argument passed to panic.
+Because the only code that runs while unwinding is inside deferred functions,
+recover is only useful inside deferred functions.
+
+One application of recover is to shut down a failing goroutine inside a server
+without killing the other executing goroutines.
- One application of recover is to shut down a failing goroutine inside a
- server without killing the other executing goroutines.
func server(workChan <-chan *Work) {
for work := range workChan {
go safelyDo(work)
@@ -2537,24 +2604,24 @@ func safelyDo(work *Work) {
do(work)
}
- In this example, if do(work) panics, the result will be logged and the
- goroutine will exit cleanly without disturbing the others. There's no
- need to do anything else in the deferred closure; calling recover
- handles the condition completely.
+In this example, if do(work) panics, the result will be logged and the
+goroutine will exit cleanly without disturbing the others. There's no need to
+do anything else in the deferred closure; calling recover handles the condition
+completely.
- Because recover always returns nil unless called directly from a
- deferred function, deferred code can call library routines that
- themselves use panic and recover without failing. As an example, the
- deferred function in safelyDo might call a logging function before
- calling recover, and that logging code would run unaffected by the
- panicking state.
+Because recover always returns nil unless called directly from a deferred
+function, deferred code can call library routines that themselves use panic and
+recover without failing. As an example, the deferred function in safelyDo might
+call a logging function before calling recover, and that logging code would run
+unaffected by the panicking state.
+
+With our recovery pattern in place, the do function (and anything it calls) can
+get out of any bad situation cleanly by calling panic. We can use that idea to
+simplify error handling in complex software. Let's look at an idealized version
+of a regexp package, which reports parsing errors by calling panic with a local
+error type. Here's the definition of Error, an error method, and the Compile
+function.
- With our recovery pattern in place, the do function (and anything it
- calls) can get out of any bad situation cleanly by calling panic. We
- can use that idea to simplify error handling in complex software. Let's
- look at an idealized version of a regexp package, which reports parsing
- errors by calling panic with a local error type. Here's the definition
- of Error, an error method, and the Compile function.
// Error is the type of a parse error; it satisfies the error interface.
type Error string
func (e Error) Error() string {
@@ -2580,51 +2647,49 @@ func Compile(str string) (regexp *Regexp, err error) {
return regexp.doParse(str), nil
}
- If doParse panics, the recovery block will set the return value to
- nil—deferred functions can modify named return values. It will then
- check, in the assignment to err, that the problem was a parse error by
- asserting that it has the local type Error. If it does not, the type
- assertion will fail, causing a run-time error that continues the stack
- unwinding as though nothing had interrupted it. This check means that
- if something unexpected happens, such as an index out of bounds, the
- code will fail even though we are using panic and recover to handle
- parse errors.
+If doParse panics, the recovery block will set the return value to nil—deferred
+functions can modify named return values. It will then check, in the assignment
+to err, that the problem was a parse error by asserting that it has the local
+type Error. If it does not, the type assertion will fail, causing a run-time
+error that continues the stack unwinding as though nothing had interrupted it.
+This check means that if something unexpected happens, such as an index out of
+bounds, the code will fail even though we are using panic and recover to handle
+parse errors.
+
+With error handling in place, the error method (because it's a method bound to
+a type, it's fine, even natural, for it to have the same name as the builtin
+error type) makes it easy to report parse errors without worrying about
+unwinding the parse stack by hand:
- With error handling in place, the error method (because it's a method
- bound to a type, it's fine, even natural, for it to have the same name
- as the builtin error type) makes it easy to report parse errors without
- worrying about unwinding the parse stack by hand:
if pos == 0 {
re.error("'*' illegal at start of expression")
}
- Useful though this pattern is, it should be used only within a package.
- Parse turns its internal panic calls into error values; it does not
- expose panics to its client. That is a good rule to follow.
+Useful though this pattern is, it should be used only within a package. Parse
+turns its internal panic calls into error values; it does not expose panics to
+its client. That is a good rule to follow.
- By the way, this re-panic idiom changes the panic value if an actual
- error occurs. However, both the original and new failures will be
- presented in the crash report, so the root cause of the problem will
- still be visible. Thus this simple re-panic approach is usually
- sufficient—it's a crash after all—but if you want to display only the
- original value, you can write a little more code to filter unexpected
- problems and re-panic with the original error. That's left as an
- exercise for the reader.
+By the way, this re-panic idiom changes the panic value if an actual error
+occurs. However, both the original and new failures will be presented in the
+crash report, so the root cause of the problem will still be visible. Thus this
+simple re-panic approach is usually sufficient—it's a crash after all—but if
+you want to display only the original value, you can write a little more code
+to filter unexpected problems and re-panic with the original error. That's left
+as an exercise for the reader.
A web server
- Let's finish with a complete Go program, a web server. This one is
- actually a kind of web re-server. Google provides a service at
- chart.apis.google.com that does automatic formatting of data into
- charts and graphs. It's hard to use interactively, though, because you
- need to put the data into the URL as a query. The program here provides
- a nicer interface to one form of data: given a short piece of text, it
- calls on the chart server to produce a QR code, a matrix of boxes that
- encode the text. That image can be grabbed with your cell phone's
- camera and interpreted as, for instance, a URL, saving you typing the
- URL into the phone's tiny keyboard.
+Let's finish with a complete Go program, a web server. This one is actually a
+kind of web re-server. Google provides a service at chart.apis.google.com that
+does automatic formatting of data into charts and graphs. It's hard to use
+interactively, though, because you need to put the data into the URL as a
+query. The program here provides a nicer interface to one form of data: given a
+short piece of text, it calls on the chart server to produce a QR code, a
+matrix of boxes that encode the text. That image can be grabbed with your cell
+phone's camera and interpreted as, for instance, a URL, saving you typing the
+URL into the phone's tiny keyboard.
- Here's the complete program. An explanation follows.
+Here's the complete program. An explanation follows.
package main
@@ -2659,8 +2724,7 @@ const templateStr = `
{{if .}}
-
+
{{.}}
@@ -2674,177 +2738,172 @@ const templateStr = `
`
- The pieces up to main should be easy to follow. The one flag sets a
- default HTTP port for our server. The template variable templ is where
- the fun happens. It builds an HTML template that will be executed by
- the server to display the page; more about that in a moment.
+The pieces up to main should be easy to follow. The one flag sets a default
+HTTP port for our server. The template variable templ is where the fun happens.
+It builds an HTML template that will be executed by the server to display the
+page; more about that in a moment.
- The main function parses the flags and, using the mechanism we talked
- about above, binds the function QR to the root path for the server.
- Then http.ListenAndServe is called to start the server; it blocks while
- the server runs.
+The main function parses the flags and, using the mechanism we talked about
+above, binds the function QR to the root path for the server. Then
+http.ListenAndServe is called to start the server; it blocks while the server
+runs.
- QR just receives the request, which contains form data, and executes
- the template on the data in the form value named s.
+QR just receives the request, which contains form data, and executes the
+template on the data in the form value named s.
- The template package html/template is powerful; this program just
- touches on its capabilities. In essence, it rewrites a piece of HTML
- text on the fly by substituting elements derived from data items passed
- to templ.Execute, in this case the form value. Within the template text
- (templateStr), double-brace-delimited pieces denote template actions.
- The piece from {{if .}} to {{end}} executes only if the value of the
- current data item, called . (dot), is non-empty. That is, when the
- string is empty, this piece of the template is suppressed.
+The template package html/template is powerful; this program just touches on
+its capabilities. In essence, it rewrites a piece of HTML text on the fly by
+substituting elements derived from data items passed to templ.Execute, in this
+case the form value. Within the template text (templateStr),
+double-brace-delimited pieces denote template actions. The piece from {{if .}}
+to {{end}} executes only if the value of the current data item, called . (dot),
+is non-empty. That is, when the string is empty, this piece of the template is
+suppressed.
- The two snippets {{.}} say to show the data presented to the
- template—the query string—on the web page. The HTML template package
- automatically provides appropriate escaping so the text is safe to
- display.
+The two snippets {{.}} say to show the data presented to the template—the query
+string—on the web page. The HTML template package automatically provides
+appropriate escaping so the text is safe to display.
- The rest of the template string is just the HTML to show when the page
- loads. If this is too quick an explanation, see the [82]documentation
- for the template package for a more thorough discussion.
+The rest of the template string is just the HTML to show when the page loads.
+If this is too quick an explanation, see the [82]documentation for the template
+package for a more thorough discussion.
- And there you have it: a useful web server in a few lines of code plus
- some data-driven HTML text. Go is powerful enough to make a lot happen
- in a few lines.
+And there you have it: a useful web server in a few lines of code plus some
+data-driven HTML text. Go is powerful enough to make a lot happen in a few
+lines.
- [83]Why Go [84]Use Cases [85]Case Studies
- [86]Get Started [87]Playground [88]Tour [89]Stack Overflow [90]Help
- [91]Packages [92]Standard Library [93]About Go Packages
- [94]About [95]Download [96]Blog [97]Issue Tracker [98]Release Notes
- [99]Brand Guidelines [100]Code of Conduct
- [101]Connect [102]Twitter [103]GitHub [104]Slack [105]r/golang
- [106]Meetup [107]Golang Weekly
+[83] Why Go [84] Use Cases [85] Case Studies
+[86] Get Started [87] Playground [88] Tour [89] Stack Overflow [90] Help
+[91] Packages [92] Standard Library [93] About Go Packages
+[94] About [95] Download [96] Blog [97] Issue Tracker [98] Release Notes [99]
+Brand Guidelines [100] Code of Conduct
+[101] Connect [102] Twitter [103] GitHub [104] Slack [105] r/golang [106]
+Meetup [107] Golang Weekly
+Opens in new window.
+The Go Gopher
- Opens in new window.
+ • [108]Copyright
+ • [109]Terms of Service
+ • [110] Privacy Policy
+ • [111] Report an Issue
+ • System theme Dark theme Light theme
- The Go Gopher
- * [108]Copyright
- * [109]Terms of Service
- * [110]Privacy Policy
- * [111]Report an Issue
- * (BUTTON) System theme Dark theme Light theme
+[113] Google logo
+go.dev uses cookies from Google to deliver and enhance the quality of its
+services and to analyze traffic. [114]Learn more.
+Okay
- [112]Google logo
+References:
- go.dev uses cookies from Google to deliver and enhance the quality of
- its services and to analyze traffic. [113]Learn more.
-
- (BUTTON) Okay
-
-References
-
- 1. https://www.googletagmanager.com/ns.html?id=GTM-W8MVQXG
- 2. https://go.dev/
- 3. https://go.dev/doc/effective_go#main-content
- 4. https://go.dev/doc/effective_go
- 5. https://go.dev/solutions/case-studies
- 6. https://go.dev/solutions/use-cases
- 7. https://go.dev/security/
- 8. https://go.dev/learn/
- 9. https://go.dev/doc/effective_go
- 10. https://go.dev/doc/effective_go
- 11. https://go.dev/doc
- 12. https://pkg.go.dev/std
- 13. https://go.dev/doc/devel/release
- 14. https://pkg.go.dev/
- 15. https://go.dev/doc/effective_go
- 16. https://go.dev/talks/
- 17. https://www.meetup.com/pro/go
- 18. https://go.dev/wiki/Conferences
- 19. https://go.dev/blog
- 20. https://go.dev/help
- 21. https://groups.google.com/g/golang-nuts
- 22. https://github.com/golang
- 23. https://twitter.com/golang
- 24. https://www.reddit.com/r/golang/
- 25. https://invite.slack.golangbridge.org/
- 26. https://stackoverflow.com/tags/go
- 27. https://go.dev/
- 28. https://go.dev/doc/effective_go
- 29. https://go.dev/doc/effective_go
- 30. https://go.dev/solutions/case-studies
- 31. https://go.dev/solutions/use-cases
- 32. https://go.dev/security/
- 33. https://go.dev/learn/
- 34. https://go.dev/doc/effective_go
- 35. https://go.dev/doc/effective_go
- 36. https://go.dev/doc/effective_go
- 37. https://go.dev/doc
- 38. https://pkg.go.dev/std
- 39. https://go.dev/doc/devel/release
- 40. https://pkg.go.dev/
- 41. https://go.dev/doc/effective_go
- 42. https://go.dev/doc/effective_go
- 43. https://go.dev/talks/
- 44. https://www.meetup.com/pro/go
- 45. https://go.dev/wiki/Conferences
- 46. https://go.dev/blog
- 47. https://go.dev/help
- 48. https://groups.google.com/g/golang-nuts
- 49. https://github.com/golang
- 50. https://twitter.com/golang
- 51. https://www.reddit.com/r/golang/
- 52. https://invite.slack.golangbridge.org/
- 53. https://stackoverflow.com/tags/go
- 54. https://go.dev/doc/
- 55. https://go.dev/doc/effective_go
- 56. https://go.dev/ref/spec
- 57. https://go.dev/tour/
- 58. https://go.dev/doc/code.html
- 59. https://go.dev/issue/28782
- 60. https://go.dev/src/
- 61. https://go.dev/
- 62. https://go.dev/pkg/strings/#example-Map
- 63. https://go.dev/doc/comment
- 64. https://go.dev/doc/effective_go#blank
- 65. https://go.dev/ref/spec#Rune_literals
- 66. https://go.dev/doc/effective_go#blank
- 67. https://go.dev/doc/effective_go#pointers_vs_values
- 68. https://go.dev/doc/effective_go#initialization
- 69. https://go.dev/doc/effective_go#type_switch
- 70. https://go.dev/doc/effective_go#for
- 71. https://go.dev/doc/effective_go#maps
- 72. https://go.dev/pkg/net/http/pprof/
- 73. https://go.dev/doc/effective_go#interfaces_and_types
- 74. https://go.dev/pkg/encoding/json/
- 75. https://go.dev/pkg/encoding/json/#Marshaler
- 76. https://go.dev/doc/effective_go#interface_conversions
- 77. https://go.dev/pkg/encoding/json/#RawMessage
- 78. https://go.dev/pkg/runtime#NumCPU
- 79. https://go.dev/pkg/runtime#GOMAXPROCS
- 80. https://go.dev/blog/concurrency-is-not-parallelism
- 81. https://go.dev/doc/effective_go#interface_conversions
- 82. https://go.dev/pkg/html/template/
- 83. https://go.dev/solutions/
- 84. https://go.dev/solutions/use-cases
- 85. https://go.dev/solutions/case-studies
- 86. https://go.dev/learn/
- 87. https://go.dev/play
- 88. https://go.dev/tour/
- 89. https://stackoverflow.com/questions/tagged/go?tab=Newest
- 90. https://go.dev/help/
- 91. https://pkg.go.dev/
- 92. https://go.dev/pkg/
- 93. https://pkg.go.dev/about
- 94. https://go.dev/project
- 95. https://go.dev/dl/
- 96. https://go.dev/blog/
- 97. https://github.com/golang/go/issues
- 98. https://go.dev/doc/devel/release
- 99. https://go.dev/brand
- 100. https://go.dev/conduct
- 101. https://www.twitter.com/golang
- 102. https://www.twitter.com/golang
- 103. https://github.com/golang
- 104. https://invite.slack.golangbridge.org/
- 105. https://reddit.com/r/golang
- 106. https://www.meetup.com/pro/go
- 107. https://golangweekly.com/
- 108. https://go.dev/copyright
- 109. https://go.dev/tos
- 110. http://www.google.com/intl/en/policies/privacy/
- 111. https://go.dev/s/website-issue
- 112. https://google.com/
- 113. https://policies.google.com/technologies/cookies
+[1] https://go.dev/
+[2] https://go.dev/doc/effective_go#main-content
+[3] https://go.dev/doc/effective_go#
+[4] https://go.dev/solutions/case-studies
+[5] https://go.dev/solutions/use-cases
+[6] https://go.dev/security/
+[7] https://go.dev/learn/
+[8] https://go.dev/doc/effective_go#
+[9] https://go.dev/doc/effective_go
+[10] https://go.dev/doc
+[11] https://pkg.go.dev/std
+[12] https://go.dev/doc/devel/release
+[13] https://pkg.go.dev/
+[14] https://go.dev/doc/effective_go#
+[15] https://go.dev/talks/
+[16] https://www.meetup.com/pro/go
+[17] https://go.dev/wiki/Conferences
+[18] https://go.dev/blog
+[19] https://go.dev/help
+[20] https://groups.google.com/g/golang-nuts
+[21] https://github.com/golang
+[22] https://twitter.com/golang
+[23] https://www.reddit.com/r/golang/
+[24] https://invite.slack.golangbridge.org/
+[25] https://stackoverflow.com/tags/go
+[27] https://go.dev/
+[28] https://go.dev/doc/effective_go#
+[29] https://go.dev/doc/effective_go#
+[30] https://go.dev/solutions/case-studies
+[31] https://go.dev/solutions/use-cases
+[32] https://go.dev/security/
+[33] https://go.dev/learn/
+[34] https://go.dev/doc/effective_go#
+[35] https://go.dev/doc/effective_go#
+[36] https://go.dev/doc/effective_go
+[37] https://go.dev/doc
+[38] https://pkg.go.dev/std
+[39] https://go.dev/doc/devel/release
+[40] https://pkg.go.dev/
+[41] https://go.dev/doc/effective_go#
+[42] https://go.dev/doc/effective_go#
+[43] https://go.dev/talks/
+[44] https://www.meetup.com/pro/go
+[45] https://go.dev/wiki/Conferences
+[46] https://go.dev/blog
+[47] https://go.dev/help
+[48] https://groups.google.com/g/golang-nuts
+[49] https://github.com/golang
+[50] https://twitter.com/golang
+[51] https://www.reddit.com/r/golang/
+[52] https://invite.slack.golangbridge.org/
+[53] https://stackoverflow.com/tags/go
+[54] https://go.dev/doc/
+[55] https://go.dev/doc/effective_go
+[56] https://go.dev/ref/spec
+[57] https://go.dev/tour/
+[58] https://go.dev/doc/code.html
+[59] https://go.dev/issue/28782
+[60] https://go.dev/src/
+[61] https://go.dev/
+[62] https://go.dev/pkg/strings/#example-Map
+[63] https://go.dev/doc/comment
+[64] https://go.dev/doc/effective_go#blank
+[65] https://go.dev/ref/spec#Rune_literals
+[66] https://go.dev/doc/effective_go#blank
+[67] https://go.dev/doc/effective_go#pointers_vs_values
+[68] https://go.dev/doc/effective_go#initialization
+[69] https://go.dev/doc/effective_go#type_switch
+[70] https://go.dev/doc/effective_go#for
+[71] https://go.dev/doc/effective_go#maps
+[72] https://go.dev/pkg/net/http/pprof/
+[73] https://go.dev/doc/effective_go#interfaces_and_types
+[74] https://go.dev/pkg/encoding/json/
+[75] https://go.dev/pkg/encoding/json/#Marshaler
+[76] https://go.dev/doc/effective_go#interface_conversions
+[77] https://go.dev/pkg/encoding/json/#RawMessage
+[78] https://go.dev/pkg/runtime#NumCPU
+[79] https://go.dev/pkg/runtime#GOMAXPROCS
+[80] https://go.dev/blog/concurrency-is-not-parallelism
+[81] https://go.dev/doc/effective_go#interface_conversions
+[82] https://go.dev/pkg/html/template/
+[83] https://go.dev/solutions/
+[84] https://go.dev/solutions/use-cases
+[85] https://go.dev/solutions/case-studies
+[86] https://go.dev/learn/
+[87] https://go.dev/play
+[88] https://go.dev/tour/
+[89] https://stackoverflow.com/questions/tagged/go?tab=Newest
+[90] https://go.dev/help/
+[91] https://pkg.go.dev/
+[92] https://go.dev/pkg/
+[93] https://pkg.go.dev/about
+[94] https://go.dev/project
+[95] https://go.dev/dl/
+[96] https://go.dev/blog/
+[97] https://github.com/golang/go/issues
+[98] https://go.dev/doc/devel/release
+[99] https://go.dev/brand
+[100] https://go.dev/conduct
+[101] https://www.twitter.com/golang
+[102] https://www.twitter.com/golang
+[103] https://github.com/golang
+[104] https://invite.slack.golangbridge.org/
+[105] https://reddit.com/r/golang
+[106] https://www.meetup.com/pro/go
+[107] https://golangweekly.com/
+[108] https://go.dev/copyright
+[109] https://go.dev/tos
+[110] http://www.google.com/intl/en/policies/privacy/
+[111] https://go.dev/s/website-issue
+[113] https://google.com/
+[114] https://policies.google.com/technologies/cookies
diff --git a/static/archive/grugbrain-dev-dzqozx.txt b/static/archive/grugbrain-dev-dzqozx.txt
index 5f0143f..aa6da09 100644
--- a/static/archive/grugbrain-dev-dzqozx.txt
+++ b/static/archive/grugbrain-dev-dzqozx.txt
@@ -1,855 +1,817 @@
- [1]grug
+[1] grug
The Grug Brained Developer
A layman's guide to thinking like the self-aware smol brained
- Introduction
+Introduction
- this collection of thoughts on software development gathered by grug
- brain developer
+this collection of thoughts on software development gathered by grug brain
+developer
- grug brain developer not so smart, but grug brain developer program
- many long year and learn some things although mostly still confused
+grug brain developer not so smart, but grug brain developer program many long
+year and learn some things although mostly still confused
- grug brain developer try collect learns into small, easily digestible
- and funny page, not only for you, the young grug, but also for him
- because as grug brain developer get older he forget important things,
- like what had for breakfast or if put pants on
+grug brain developer try collect learns into small, easily digestible and funny
+page, not only for you, the young grug, but also for him because as grug brain
+developer get older he forget important things, like what had for breakfast or
+if put pants on
- big brained developers are many, and some not expected to like this,
- make sour face
+big brained developers are many, and some not expected to like this, make sour
+face
- THINK they are big brained developers many, many more, and more even
- definitely probably maybe not like this, many sour face (such is
- internet)
+THINK they are big brained developers many, many more, and more even definitely
+probably maybe not like this, many sour face (such is internet)
- (note: grug once think big brained but learn hard way)
+(note: grug once think big brained but learn hard way)
- is fine!
+is fine!
- is free country sort of and end of day not really matter too much, but
- grug hope you fun reading and maybe learn from many, many mistake grug
- make over long program life
+is free country sort of and end of day not really matter too much, but grug
+hope you fun reading and maybe learn from many, many mistake grug make over
+long program life
- [2]The Eternal Enemy: Complexity
+[2]The Eternal Enemy: Complexity
- apex predator of grug is complexity
+apex predator of grug is complexity
- complexity bad
+complexity bad
- say again:
+say again:
- complexity very bad
+complexity very bad
- you say now:
+you say now:
- complexity very, very bad
+complexity very, very bad
- given choice between complexity or one on one against t-rex, grug take
- t-rex: at least grug see t-rex
+given choice between complexity or one on one against t-rex, grug take t-rex:
+at least grug see t-rex
- complexity is spirit demon that enter codebase through well-meaning but
- ultimately very clubbable non grug-brain developers and project
- managers who not fear complexity spirit demon or even know about
- sometime
+complexity is spirit demon that enter codebase through well-meaning but
+ultimately very clubbable non grug-brain developers and project managers who
+not fear complexity spirit demon or even know about sometime
- one day code base understandable and grug can get work done, everything
- good!
+one day code base understandable and grug can get work done, everything good!
- next day impossible: complexity demon spirit has entered code and very
- dangerous situation!
+next day impossible: complexity demon spirit has entered code and very
+dangerous situation!
- grug no able see complexity demon, but grug sense presence in code base
+grug no able see complexity demon, but grug sense presence in code base
- demon complexity spirit mocking him make change here break unrelated
- thing there what!?! mock mock mock ha ha so funny grug love programming
- and not becoming shiney rock speculator like grug senior advise
+demon complexity spirit mocking him make change here break unrelated thing
+there what!?! mock mock mock ha ha so funny grug love programming and not
+becoming shiney rock speculator like grug senior advise
- club not work on demon spirit complexity and bad idea actually hit
- developer who let spirit in with club: sometimes grug himself!
+club not work on demon spirit complexity and bad idea actually hit developer
+who let spirit in with club: sometimes grug himself!
- sadly, often grug himself
+sadly, often grug himself
- so grug say again and say often: complexity very, very bad
+so grug say again and say often: complexity very, very bad
[3]Saying No
- best weapon against complexity spirit demon is magic word: "no"
+best weapon against complexity spirit demon is magic word: "no"
- "no, grug not build that feature"
+"no, grug not build that feature"
- "no, grug not build that abstraction"
+"no, grug not build that abstraction"
- "no, grug not put water on body every day or drink less black think
- juice you stop repeat ask now"
+"no, grug not put water on body every day or drink less black think juice you
+stop repeat ask now"
- note, this good engineering advice but bad career advice: "yes" is
- magic word for more shiney rock and put in charge of large tribe of
- developer
+note, this good engineering advice but bad career advice: "yes" is magic word
+for more shiney rock and put in charge of large tribe of developer
- sad but true: learn "yes" then learn blame other grugs when fail, ideal
- career advice
+sad but true: learn "yes" then learn blame other grugs when fail, ideal career
+advice
- but grug must to grug be true, and "no" is magic grug word. Hard say at
- first, especially if you nice grug and don't like disappoint people
- (many such grugs!) but easier over time even though shiney rock pile
- not as high as might otherwise be
+but grug must to grug be true, and "no" is magic grug word. Hard say at first,
+especially if you nice grug and don't like disappoint people (many such grugs!)
+but easier over time even though shiney rock pile not as high as might
+otherwise be
- is ok: how many shiney rock grug really need anyway?
+is ok: how many shiney rock grug really need anyway?
[4]Saying ok
- sometimes compromise necessary or no shiney rock, mean no dinosaur
- meat, not good, wife firmly remind grug about young grugs at home need
- roof, food, and so forth, no interest in complexity demon spirit rant
- by grug for fiftieth time
+sometimes compromise necessary or no shiney rock, mean no dinosaur meat, not
+good, wife firmly remind grug about young grugs at home need roof, food, and so
+forth, no interest in complexity demon spirit rant by grug for fiftieth time
- in this situation, grug recommend "ok"
+in this situation, grug recommend "ok"
- "ok, grug build that feature"
+"ok, grug build that feature"
- then grug spend time think of [5]80/20 solution to problem and build
- that instead.
- 80/20 solution say "80 want with 20 code" solution maybe not have all
- bell-whistle that project manager want, maybe a little ugly, but work
- and deliver most value, and keep demon complexity spirit at bay for
- most part to extent
+then grug spend time think of [5]80/20 solution to problem and build that
+instead.
+80/20 solution say "80 want with 20 code" solution maybe not have all
+bell-whistle that project manager want, maybe a little ugly, but work and
+deliver most value, and keep demon complexity spirit at bay for most part to
+extent
- sometimes probably best just not tell project manager and do it 80/20
- way. easier forgive than permission, project managers mind like
- butterfly at times overworked and dealing with many grugs. often forget
- what even feature supposed to do or move on or quit or get fired grug
- see many such cases
+sometimes probably best just not tell project manager and do it 80/20 way.
+easier forgive than permission, project managers mind like butterfly at times
+overworked and dealing with many grugs. often forget what even feature supposed
+to do or move on or quit or get fired grug see many such cases
- anyway is in project managers best interest anyway so grug not to feel
- too bad for this approach usually
+anyway is in project managers best interest anyway so grug not to feel too bad
+for this approach usually
[6]Factoring Your Code
- next strategy very harder: break code base up properly (fancy word:
- "factor your code properly") here is hard give general advice because
- each system so different. however, one thing grug come to believe: not
- factor your application too early!
+next strategy very harder: break code base up properly (fancy word: "factor
+your code properly") here is hard give general advice because each system so
+different. however, one thing grug come to believe: not factor your application
+too early!
- early on in project everything very abstract and like water: very
- little solid holds for grug's struggling brain to hang on to. take time
- to develop "shape" of system and learn what even doing. grug try not to
- factor in early part of project and then, at some point, good
- cut-points emerge from code base
+early on in project everything very abstract and like water: very little solid
+holds for grug's struggling brain to hang on to. take time to develop "shape"
+of system and learn what even doing. grug try not to factor in early part of
+project and then, at some point, good cut-points emerge from code base
- good cut point has narrow interface with rest of system: small number
- of functions or abstractions that hide complexity demon internally,
- like trapped in crystal
+good cut point has narrow interface with rest of system: small number of
+functions or abstractions that hide complexity demon internally, like trapped
+in crystal
- grug quite satisfied when complexity demon trapped properly in crystal,
- is best feeling to trap mortal enemy!
+grug quite satisfied when complexity demon trapped properly in crystal, is best
+feeling to trap mortal enemy!
- grug try watch patiently as cut points emerge from code and slowly
- refactor, with code base taking shape over time along with experience.
- no hard/ fast rule for this: grug know cut point when grug see cut
- point, just take time to build skill in seeing, patience
+grug try watch patiently as cut points emerge from code and slowly refactor,
+with code base taking shape over time along with experience. no hard/ fast rule
+for this: grug know cut point when grug see cut point, just take time to build
+skill in seeing, patience
- sometimes grug go too early and get abstractions wrong, so grug bias
- towards waiting
+sometimes grug go too early and get abstractions wrong, so grug bias towards
+waiting
- big brain developers often not like this at all and invent many
- abstractions start of project
+big brain developers often not like this at all and invent many abstractions
+start of project
- grug tempted to reach for club and yell "big brain no maintain code!
- big brain move on next architecture committee leave code for grug deal
- with!"
+grug tempted to reach for club and yell "big brain no maintain code! big brain
+move on next architecture committee leave code for grug deal with!"
- but grug learn control passions, major difference between grug and
- animal
+but grug learn control passions, major difference between grug and animal
- instead grug try to limit damage of big brain developer early in
- project by giving them thing like UML diagram (not hurt code, probably
- throw away anyway) or by demanding working demo tomorrow
+instead grug try to limit damage of big brain developer early in project by
+giving them thing like UML diagram (not hurt code, probably throw away anyway)
+or by demanding working demo tomorrow
- working demo especially good trick: force big brain make something to
- actually work to talk about and code to look at that do thing, will
- help big brain see reality on ground more quickly
+working demo especially good trick: force big brain make something to actually
+work to talk about and code to look at that do thing, will help big brain see
+reality on ground more quickly
- remember! big brain have big brain! need only be harness for good and
- not in service of spirit complexity demon on accident, many times seen
+remember! big brain have big brain! need only be harness for good and not in
+service of spirit complexity demon on accident, many times seen
- (best grug brain able to herd multiple big brain in right direction and
- produce many complexity demon trap crystals, large shiney rock pile
- awaits such grug!)
+(best grug brain able to herd multiple big brain in right direction and produce
+many complexity demon trap crystals, large shiney rock pile awaits such grug!)
- also sometimes call demo approach "prototype", sound fancier to project
- manager
+also sometimes call demo approach "prototype", sound fancier to project manager
- grug say prototype early in software making, especially if many big
- brains
+grug say prototype early in software making, especially if many big brains
- [7]Testing
+[7]Testing
- grug have love/hate relationship with test: test save grug many, many
- uncountable time and grug love and respect test
+grug have love/hate relationship with test: test save grug many, many
+uncountable time and grug love and respect test
- unfortunately also many test shamans exist. some test shaman make test
- idol, demand things like "first test" before grug even write code or
- have any idea what grug doing domain!
+unfortunately also many test shamans exist. some test shaman make test idol,
+demand things like "first test" before grug even write code or have any idea
+what grug doing domain!
- how grug test what grug not even understand domain yet!?
+how grug test what grug not even understand domain yet!?
- "Oh, don't worry: the tests will show you what you need to do."
+"Oh, don't worry: the tests will show you what you need to do."
- grug once again catch grug slowly reaching for club, but grug stay calm
+grug once again catch grug slowly reaching for club, but grug stay calm
- grug instead prefer write most tests after prototype phase, when code
- has begun firm up
+grug instead prefer write most tests after prototype phase, when code has begun
+firm up
- but, note well: grug must here be very disciplined!
+but, note well: grug must here be very disciplined!
- easy grug to move on and not write tests because "work on grugs
- machine"!
+easy grug to move on and not write tests because "work on grugs machine"!
- this very, very bad: no guarantee work on other machine and no
- guarantee work on grug machine in future, many times
+this very, very bad: no guarantee work on other machine and no guarantee work
+on grug machine in future, many times
- test shaman have good point on importance of test, even if test shaman
- often sometimes not complete useful feature in life and talk only about
- test all time, deserve of club but heart in right place
+test shaman have good point on importance of test, even if test shaman often
+sometimes not complete useful feature in life and talk only about test all
+time, deserve of club but heart in right place
- also, test shaman often talk unit test very much, but grug not find so
- useful. grug experience that ideal tests are not unit test or either
- end-to-end test, but in-between test
+also, test shaman often talk unit test very much, but grug not find so useful.
+grug experience that ideal tests are not unit test or either end-to-end test,
+but in-between test
- [8]unit tests fine, ok, but break as implementation change (much
- compared api!) and make refactor hard and, frankly, many bugs anyway
- often due interactions other code. often throw away when code change.
+[8]unit tests fine, ok, but break as implementation change (much compared api!)
+and make refactor hard and, frankly, many bugs anyway often due interactions
+other code. often throw away when code change.
- grug write unit test mostly at start of project, help get things going
- but not get too attached or expect value long time
+grug write unit test mostly at start of project, help get things going but not
+get too attached or expect value long time
- [9]end to end tests good, show whole system work, but! hard to
- understand when break and drive grug crazy very often, sometimes grugs
- just end up ignoring because "oh, that break all time" very bad!
+[9]end to end tests good, show whole system work, but! hard to understand when
+break and drive grug crazy very often, sometimes grugs just end up ignoring
+because "oh, that break all time" very bad!
- in-between tests, grug hear shaman call [10]"integration tests"
- sometime often with sour look on face. but grug say integration test
- sweet spot according to grug: high level enough test correctness of
- system, low level enough, with good debugger, easy to see what break
+in-between tests, grug hear shaman call [10]"integration tests" sometime often
+with sour look on face. but grug say integration test sweet spot according to
+grug: high level enough test correctness of system, low level enough, with good
+debugger, easy to see what break
- grug prefer some unit tests especially at start but not 100% all code
- test and definitely not "first test". "test along the way" work pretty
- well for grug, especially as grug figure things out
+grug prefer some unit tests especially at start but not 100% all code test and
+definitely not "first test". "test along the way" work pretty well for grug,
+especially as grug figure things out
- grug focus much ferocious integration test effort as cut point emerge
- and system stabilize! cut point api hopefully stable compared
- implementation and integration test remain valuable many long time, and
- easy debug
+grug focus much ferocious integration test effort as cut point emerge and
+system stabilize! cut point api hopefully stable compared implementation and
+integration test remain valuable many long time, and easy debug
- also small, well curated end-to-end test suite is created to be kept
- working religiously on pain of clubbing. focus of important end-to-end
- test on most common UI features and few most important edge cases, but
- not too many or become impossible maintain and then ignored
+also small, well curated end-to-end test suite is created to be kept working
+religiously on pain of clubbing. focus of important end-to-end test on most
+common UI features and few most important edge cases, but not too many or
+become impossible maintain and then ignored
- this ideal set of test to grug
+this ideal set of test to grug
- you may not like, but this peak grug testing
+you may not like, but this peak grug testing
- also, grug dislike [11]mocking in test, prefer only when absolute
- necessary to (rare/never) and coarse grain mocking (cut points/systems)
- only at that
+also, grug dislike [11]mocking in test, prefer only when absolute necessary to
+(rare/never) and coarse grain mocking (cut points/systems) only at that
- one exception "first test" dislike by grug: when bug found. grug always
- try first reproduce bug with regression test then fix bug, this case
- only for some reason work better
+one exception "first test" dislike by grug: when bug found. grug always try
+first reproduce bug with regression test then fix bug, this case only for some
+reason work better
- [12]Agile
+[12]Agile
- grug think agile not terrible, not good
+grug think agile not terrible, not good
- end of day, not worst way to organize development, maybe better than
- others grug supposes is fine
+end of day, not worst way to organize development, maybe better than others
+grug supposes is fine
- danger, however, is agile shaman! many, many shiney rock lost to agile
- shaman!
+danger, however, is agile shaman! many, many shiney rock lost to agile shaman!
- whenever agile project fail, agile shaman say "you didn't do agile
- right!" grug note this awfully convenient for agile shaman, ask more
- shiney rock better agile train young grugs on agile, danger!
+whenever agile project fail, agile shaman say "you didn't do agile right!" grug
+note this awfully convenient for agile shaman, ask more shiney rock better
+agile train young grugs on agile, danger!
- grug tempted reach for club when too much agile talk happen but always
- stay calm
+grug tempted reach for club when too much agile talk happen but always stay
+calm
- prototyping, tools and hiring good grugs better key to success
- software: agile process ok and help some but sometimes hurt taken too
- seriously
+prototyping, tools and hiring good grugs better key to success software: agile
+process ok and help some but sometimes hurt taken too seriously
- grug say [13]no silver club fix all software problems no matter what
- agile shaman say (danger!)
+grug say [13]no silver club fix all software problems no matter what agile
+shaman say (danger!)
- [14]Refactoring
+[14]Refactoring
- refactoring fine activity and often good idea, especially later in
- project when code firmed up
+refactoring fine activity and often good idea, especially later in project when
+code firmed up
- however, grug note that many times in career "refactors" go horribly
- off rails and end up causing more harm than good
+however, grug note that many times in career "refactors" go horribly off rails
+and end up causing more harm than good
- grug not sure exactly why some refactors work well, some fail, but grug
- notice that larger refactor, more likely failure appear to be
+grug not sure exactly why some refactors work well, some fail, but grug notice
+that larger refactor, more likely failure appear to be
- so grug try to keep refactors relatively small and not be "too far out
- from shore" during refactor. ideally system work entire time and each
- step of finish before other begin.
+so grug try to keep refactors relatively small and not be "too far out from
+shore" during refactor. ideally system work entire time and each step of finish
+before other begin.
- end-to-end tests are life saver here, but often very hard understand
- why broke... such is refactor life.
+end-to-end tests are life saver here, but often very hard understand why
+broke... such is refactor life.
- also grug notice that introducing too much abstraction often lead to
- refactor failure and system failure. good example was [15]J2EE
- introduce, many big brain sit around thinking too much abstraction,
- nothing good came of it many project hurt
+also grug notice that introducing too much abstraction often lead to refactor
+failure and system failure. good example was [15]J2EE introduce, many big brain
+sit around thinking too much abstraction, nothing good came of it many project
+hurt
- another good example when company grug work for introduce [16]OSGi to
- help manage/trap spriit complexity demon in code base. not only OSGi
- not help, but make complexity demon much more powerful! took multiple
- man year of best developers to rework as well to boot! more complex
- spirit and now features impossible implement! very bad!
+another good example when company grug work for introduce [16]OSGi to help
+manage/trap spriit complexity demon in code base. not only OSGi not help, but
+make complexity demon much more powerful! took multiple man year of best
+developers to rework as well to boot! more complex spirit and now features
+impossible implement! very bad!
- [17]Chesterton's Fence
+[17]Chesterton's Fence
- wise grug shaman [18]chesterton once say
+wise grug shaman [18]chesterton once say
- here exists in such a case a certain institution or law; let us say,
- for the sake of simplicity, a fence or gate erected across a road.
- The more modern type of reformer goes gaily up to it and says, “I
- don’t see the use of this; let us clear it away.” To which the more
- intelligent type of reformer will do well to answer: “If you don’t
- see the use of it, I certainly won’t let you clear it away. Go away
- and think. Then, when you can come back and tell me that you do see
- the use of it, I may allow you to destroy it.”
+ here exists in such a case a certain institution or law; let us say, for
+ the sake of simplicity, a fence or gate erected across a road. The more
+ modern type of reformer goes gaily up to it and says, “I don’t see the use
+ of this; let us clear it away.” To which the more intelligent type of
+ reformer will do well to answer: “If you don’t see the use of it, I
+ certainly won’t let you clear it away. Go away and think. Then, when you
+ can come back and tell me that you do see the use of it, I may allow you to
+ destroy it.”
- many older grug learn this lesson well not start tearing code out willy
- nilly, no matter how ugly look
+many older grug learn this lesson well not start tearing code out willy nilly,
+no matter how ugly look
- grug understand all programmer platonists at some level wish music of
- spheres perfection in code. but danger is here, world is ugly and
- gronky many times and so also must code be
+grug understand all programmer platonists at some level wish music of spheres
+perfection in code. but danger is here, world is ugly and gronky many times and
+so also must code be
- humility not often come big brained or think big brained easily or grug
- even, but grug often find "oh, grug no like look of this, grug fix"
- lead many hours pain grug and no better or system worse even
+humility not often come big brained or think big brained easily or grug even,
+but grug often find "oh, grug no like look of this, grug fix" lead many hours
+pain grug and no better or system worse even
- grug early on in career often charge into code base waving club wildly
- and smash up everything, learn not good
+grug early on in career often charge into code base waving club wildly and
+smash up everything, learn not good
- grug not say no improve system ever, quite foolish, but recommend take
- time understand system first especially bigger system is and is respect
- code working today even if not perfect
+grug not say no improve system ever, quite foolish, but recommend take time
+understand system first especially bigger system is and is respect code working
+today even if not perfect
- here tests often good hint for why fence not to be smashed!
+here tests often good hint for why fence not to be smashed!
- [19]Microservices
+[19]Microservices
- grug wonder why big brain take hardest problem, factoring system
- correctly, and introduce network call too
+grug wonder why big brain take hardest problem, factoring system correctly, and
+introduce network call too
- seem very confusing to grug
+seem very confusing to grug
- [20]Tools
+[20]Tools
- grug love tool. tool and control passion what separate grug from
- dinosaurs! tool allow grug brain to create code that not possible
- otherwise by doing thinking for grug, always good relief! grug always
- spend time in new place learning tools around him to maximize
- productivity: learn tools for two weeks make development often twice
- faster and often have dig around ask other developers help, no docs
+grug love tool. tool and control passion what separate grug from dinosaurs!
+tool allow grug brain to create code that not possible otherwise by doing
+thinking for grug, always good relief! grug always spend time in new place
+learning tools around him to maximize productivity: learn tools for two weeks
+make development often twice faster and often have dig around ask other
+developers help, no docs
- code completion in IDE allow grug not have remembered all API, very
- important!
+code completion in IDE allow grug not have remembered all API, very important!
- java programming nearly impossible without it for grug!
+java programming nearly impossible without it for grug!
- really make grug think some time
+really make grug think some time
- good debugger worth weight in shiney rocks, in fact also more: when
- faced with bug grug would often trade all shiney rock and perhaps few
- children for good debugger and anyway debugger no weigh anything far as
- grug can tell
+good debugger worth weight in shiney rocks, in fact also more: when faced with
+bug grug would often trade all shiney rock and perhaps few children for good
+debugger and anyway debugger no weigh anything far as grug can tell
- grug always recommend new programmer learn available debugger very
- deeply, features like conditional break points, expression evaluation,
- stack navigation, etc teach new grug more about computer than
- university class often!
+grug always recommend new programmer learn available debugger very deeply,
+features like conditional break points, expression evaluation, stack
+navigation, etc teach new grug more about computer than university class often!
- grug say never be not improving tooling
+grug say never be not improving tooling
- [21]Type Systems
+[21]Type Systems
- grug very like type systems make programming easier. for grug, type
- systems most value when grug hit dot on keyboard and list of things
- grug can do pop up magic. this 90% of value of type system or more to
- grug
+grug very like type systems make programming easier. for grug, type systems
+most value when grug hit dot on keyboard and list of things grug can do pop up
+magic. this 90% of value of type system or more to grug
- big brain type system shaman often say type correctness main point type
- system, but grug note some big brain type system shaman not often ship
- code. grug suppose code never shipped is correct, in some sense, but
- not really what grug mean when say correct
+big brain type system shaman often say type correctness main point type system,
+but grug note some big brain type system shaman not often ship code. grug
+suppose code never shipped is correct, in some sense, but not really what grug
+mean when say correct
- grug say tool magic pop up of what can do and complete of code major
- most benefit of type system, correctness also good but not so nearly so
- much
+grug say tool magic pop up of what can do and complete of code major most
+benefit of type system, correctness also good but not so nearly so much
- also, often sometimes caution beware big brains here!
+also, often sometimes caution beware big brains here!
- some type big brain think in type systems and talk in lemmas, potential
- danger!
+some type big brain think in type systems and talk in lemmas, potential danger!
- danger abstraction too high, big brain type system code become astral
- projection of platonic generic turing model of computation into code
- base. grug confused and agree some level very elegant but also very
- hard do anything like record number of club inventory for Grug Inc.
- task at hand
+danger abstraction too high, big brain type system code become astral
+projection of platonic generic turing model of computation into code base. grug
+confused and agree some level very elegant but also very hard do anything like
+record number of club inventory for Grug Inc. task at hand
- generics especially dangerous here, grug try limit generics to
- container classes for most part where most value add
+generics especially dangerous here, grug try limit generics to container
+classes for most part where most value add
- temptation generics very large is trick! spirit demon complex love this
- one trick! beware!
+temptation generics very large is trick! spirit demon complex love this one
+trick! beware!
- always most value type system come: hit dot see what grug can do, never
- forget!
+always most value type system come: hit dot see what grug can do, never forget!
- [22]Expression Complexity
+[22]Expression Complexity
- grug once like to minimize lines of code much as possible. write code
- like this:
- if(contact && !contact.isActive() && (contact.inGroup(FAMILY) || contact.inGro
-up(FRIENDS))) {
+grug once like to minimize lines of code much as possible. write code like
+this:
+
+ if(contact && !contact.isActive() && (contact.inGroup(FAMILY) || contact.inGroup(FRIENDS))) {
// ...
}
- over time grug learn this hard debug, learn prefer write like so:
+over time grug learn this hard debug, learn prefer write like so:
+
if(contact) {
var contactIsInactive = !contact.isActive();
- var contactIsFamilyOrFriends = contact.inGroup(FAMILY) || contact.inGroup(FR
-IENDS);
+ var contactIsFamilyOrFriends = contact.inGroup(FAMILY) || contact.inGroup(FRIENDS);
if(contactIsInactive && contactIsFamilyOrFriends) {
// ...
}
}
- grug hear screams from young grugs at horror of many line of code and
- pointless variable and grug prepare defend self with club
+grug hear screams from young grugs at horror of many line of code and pointless
+variable and grug prepare defend self with club
- club fight start with other developers attack and grug yell: "easier
- debug! see result of each expression more clearly and good name! easier
- understand conditional expression! EASIER DEBUG!"
+club fight start with other developers attack and grug yell: "easier debug! see
+result of each expression more clearly and good name! easier understand
+conditional expression! EASIER DEBUG!"
- definitely easier debug and once club fight end calm down and young
- grug think a bit, they realize grug right
+definitely easier debug and once club fight end calm down and young grug think
+a bit, they realize grug right
- grug still catch grug writing code like first example and often regret,
- so grug not judge young grug
+grug still catch grug writing code like first example and often regret, so grug
+not judge young grug
- [23]DRY
+[23]DRY
- [24]DRY mean Don't Repeat Self, powerful maxim over mind of most
- developers
+[24]DRY mean Don't Repeat Self, powerful maxim over mind of most developers
- grug respect DRY and good advice, however grug recommend balance in all
- things, as gruggest big brain aristotle recommend
+grug respect DRY and good advice, however grug recommend balance in all things,
+as gruggest big brain aristotle recommend
- grug note humourous graph by Lea Verou correspond with grug passion not
- repeat:
- code concerns over time
+grug note humourous graph by Lea Verou correspond with grug passion not repeat:
- over time past ten years program grug not as concerned repeat code. so
- long as repeat code simple enough and obvious enough, and grug begin
- feel repeat/copy paste code with small variation is better than many
- callback/closures passed arguments or elaborate object model: too hard
- complex for too little benefit at times
+code concerns over time
- hard balance here, repeat code always still make grug stare and say
- "mmm" often, but experience show repeat code sometimes often better
- than complex DRY solution
+over time past ten years program grug not as concerned repeat code. so long as
+repeat code simple enough and obvious enough, and grug begin feel repeat/copy
+paste code with small variation is better than many callback/closures passed
+arguments or elaborate object model: too hard complex for too little benefit at
+times
- note well! grug encourage over literal developer not take does work
- line too serious, is joke
+hard balance here, repeat code always still make grug stare and say "mmm"
+often, but experience show repeat code sometimes often better than complex DRY
+solution
- [25]Separation of Concerns (SoC)
+note well! grug encourage over literal developer not take does work line too
+serious, is joke
- [26]Separation of Concern (SoC) another powerful idea over many
- developer mind, idea to separate different aspects of system into
- distinct sections code
+[25]Separation of Concerns (SoC)
- canonical example from web development: separation of style (css file),
- markup (html file) and logic (javascript file)
+[26]Separation of Concern (SoC) another powerful idea over many developer mind,
+idea to separate different aspects of system into distinct sections code
- here grug much more sour faced than DRY and in fact write big brained
- essay on alternative design principle [27]locality of behavior (LoB)
- against SoC
+canonical example from web development: separation of style (css file), markup
+(html file) and logic (javascript file)
- grug much prefer put code on the thing that do the thing. now when grug
- look at the thing grug know the thing what the thing do, alwasy good
- relief!
+here grug much more sour faced than DRY and in fact write big brained essay on
+alternative design principle [27]locality of behavior (LoB) against SoC
- when separate of concern grug must often all over tarnation many file
- look understand what how button do, much confuse and time waste: bad!
+grug much prefer put code on the thing that do the thing. now when grug look at
+the thing grug know the thing what the thing do, alwasy good relief!
- [28]Closures
+when separate of concern grug must often all over tarnation many file look
+understand what how button do, much confuse and time waste: bad!
- grug like closures for right job and that job usually abstracting
- operation over collection of objects
+[28]Closures
- grug warn closures like salt, type systems and generics: small amount
- go long way, but easy spoil things too much use give heart attack
+grug like closures for right job and that job usually abstracting operation
+over collection of objects
- javascript developers call very special complexity demon spirit in
- javascript "callback hell" because too much closure used by javascript
- libraries very sad but also javascript developer get what deserved let
- grug be frank
+grug warn closures like salt, type systems and generics: small amount go long
+way, but easy spoil things too much use give heart attack
- [29]Logging
+javascript developers call very special complexity demon spirit in javascript
+"callback hell" because too much closure used by javascript libraries very sad
+but also javascript developer get what deserved let grug be frank
- grug huge fan of logging and encourage lots of it, especially in cloud
- deployed. some non-grugs say logging expensive and not important. grug
- used think this way no more
+[29]Logging
- funny story: grug learn idol [30]rob pike working on logging at google
- and decide: "if rob pike working on logging, what grug do there?!?" so
- not pursue. turn out logging very important to google so of course best
- programmer work on it, grug!
+grug huge fan of logging and encourage lots of it, especially in cloud
+deployed. some non-grugs say logging expensive and not important. grug used
+think this way no more
- don't be such grug brain, grug, much less shiney rock now!
+funny story: grug learn idol [30]rob pike working on logging at google and
+decide: "if rob pike working on logging, what grug do there?!?" so not pursue.
+turn out logging very important to google so of course best programmer work on
+it, grug!
- oh well, grug end up at good company anyway and rob pike dress habit
- [31]increasingly erratic, so all work out in end, but point stand:
- logging very important!
+don't be such grug brain, grug, much less shiney rock now!
- grug tips on logging are:
- * log all major logical branches within code (if/for)
- * if "request" span multiple machine in cloud infrastructure, include
- request ID in all so logs can be grouped
- * if possible make log level dynamically controlled, so grug can turn
- on/off when need debug issue (many!)
- * if possible make log level per user, so can debug specific user
- issue
+oh well, grug end up at good company anyway and rob pike dress habit [31]
+increasingly erratic, so all work out in end, but point stand: logging very
+important!
- last two points are especially handy club when fighting bugs in
- production systems very often
+grug tips on logging are:
- unfortunately log libraries often very complex (java, [32]why you do?)
- but worth investing time in getting logging infrastructure "just right"
- pay off big later in grug experience
+ • log all major logical branches within code (if/for)
+ • if "request" span multiple machine in cloud infrastructure, include request
+ ID in all so logs can be grouped
+ • if possible make log level dynamically controlled, so grug can turn on/off
+ when need debug issue (many!)
+ • if possible make log level per user, so can debug specific user issue
- logging need taught more in schools, grug think
+last two points are especially handy club when fighting bugs in production
+systems very often
- [33]Concurrency
+unfortunately log libraries often very complex (java, [32]why you do?) but
+worth investing time in getting logging infrastructure "just right" pay off big
+later in grug experience
- grug, like all sane developer, fear concurrency
+logging need taught more in schools, grug think
- as much as possible, grug try to rely on simple concurrency models like
- stateless web request handlers and simple remote job worker queues
- where jobs no interdepend and simple api
+[33]Concurrency
- [34]optimistic concurrency seem work well for web stuff
+grug, like all sane developer, fear concurrency
- occasionally grug reach for [35]thread local variable, usually when
- writing framework code
+as much as possible, grug try to rely on simple concurrency models like
+stateless web request handlers and simple remote job worker queues where jobs
+no interdepend and simple api
- some language have good concurrent data structure, like java
- [36]ConcurrentHashMap but still need careful grug work to get right
+[34]optimistic concurrency seem work well for web stuff
- grug has never used [37]erlang, hear good things, but language look
- wierd to grug sorry
+occasionally grug reach for [35]thread local variable, usually when writing
+framework code
- [38]Optimizing
+some language have good concurrent data structure, like java [36]
+ConcurrentHashMap but still need careful grug work to get right
- ultra biggest of brain developer once say:
+grug has never used [37]erlang, hear good things, but language look wierd to
+grug sorry
- premature optimization is the root of all evil
+[38]Optimizing
- this everyone mostly know and grug in humble violent agreement with
- ultra biggest of big brain
+ultra biggest of brain developer once say:
- grug recommend always to have concrete, real world perf profile showing
- specific perf issue before begin optimizing.
+ premature optimization is the root of all evil
- never know what actual issue might be, grug often surprise! very often!
+this everyone mostly know and grug in humble violent agreement with ultra
+biggest of big brain
- beware only cpu focus: easy to see cpu and much big o notation thinking
- having been done in school, but often not root of all slowness,
- surprise to many including grug
+grug recommend always to have concrete, real world perf profile showing
+specific perf issue before begin optimizing.
- hitting network equivalent of many, many millions cpu cycle and always
- to be minimized if possible, note well big brain microservice
- developer!
+never know what actual issue might be, grug often surprise! very often!
- inexperienced big brain developer see nested loop and often say
- "O(n^2)? Not on my watch!"
+beware only cpu focus: easy to see cpu and much big o notation thinking having
+been done in school, but often not root of all slowness, surprise to many
+including grug
- complexity demon spirit smile
+hitting network equivalent of many, many millions cpu cycle and always to be
+minimized if possible, note well big brain microservice developer!
- [39]APIs
+inexperienced big brain developer see nested loop and often say "O(n^2)? Not on
+my watch!"
- grug love good apis. good apis not make grug think too much
+complexity demon spirit smile
- unfortunately, many apis very bad, make grug think quite a bit. this
- happen many reasons, here two:
- * API creators think in terms of implementation or domain of API,
- rather than in terms of use of API
- * API creators think too abstract and big brained
+[39]APIs
- usually grug not care too deeply about detail of api: want write file
- or sort list or whatever, just want to call write() or sort() or
- whatever
+grug love good apis. good apis not make grug think too much
- but big brain api developers say:
+unfortunately, many apis very bad, make grug think quite a bit. this happen
+many reasons, here two:
- "not so fast, grug! is that file open for write? did you define a
- Comparator for that sort?"
+ • API creators think in terms of implementation or domain of API, rather than
+ in terms of use of API
+ • API creators think too abstract and big brained
- grug find self restraining hand reaching for club again
+usually grug not care too deeply about detail of api: want write file or sort
+list or whatever, just want to call write() or sort() or whatever
- not care about that stuff right now, just want sort and write file mr
- big brain!
+but big brain api developers say:
- grug recognize that big brain api designer have point and that sometime
- these things matter, but often do not. big brain api developers better
- if design for simple cases with simple api, make complex cases possible
- with more complex api
+"not so fast, grug! is that file open for write? did you define a Comparator
+for that sort?"
- grug call this "layering" apis: two or three different apis at
- different level complexity for various grug needs
+grug find self restraining hand reaching for club again
- also, if object oriented, put api on thing instead of elsewhere. java
- worst at this!
+not care about that stuff right now, just want sort and write file mr big
+brain!
- grug want filter list in java
+grug recognize that big brain api designer have point and that sometime these
+things matter, but often do not. big brain api developers better if design for
+simple cases with simple api, make complex cases possible with more complex api
- "Did you convert it to a stream?"
+grug call this "layering" apis: two or three different apis at different level
+complexity for various grug needs
- fine, grug convert to stream
+also, if object oriented, put api on thing instead of elsewhere. java worst at
+this!
- "OK, now you can filter."
+grug want filter list in java
- OK, but now need return list! have stream!
+"Did you convert it to a stream?"
- "Well, did you collect your stream into a list?"
+fine, grug convert to stream
- what?
+"OK, now you can filter."
- "Define a Collector super T, A, R> to collect your stream into a
- list"
+OK, but now need return list! have stream!
- grug now swear on ancestor grave he club every single person in room,
- but count two instead and remain calm
+"Well, did you collect your stream into a list?"
- put common thing like filter() on list and make return list, listen
- well big brain java api developer!
+what?
- nobody care about "stream" or even hear of "stream" before, is not
- networking api, all java grugs use list mr big brain!
+"Define a Collector super T, A, R> to collect your stream into a list"
- [40]Parsing
+grug now swear on ancestor grave he club every single person in room, but count
+two instead and remain calm
- grug love make programming language at drop of hat and say
- [41]recursive descent most fun and beautiful way create parser
+put common thing like filter() on list and make return list, listen well big
+brain java api developer!
- unfortunately many big brain school teach only parser generator tool.
- here grug usual love of tool is not: parser generator tool generate
- code of awful snakes nest: impossible understand, bottom up, what? hide
- recursive nature of grammar from grug and debug impossible, very bad
- according grug!
+nobody care about "stream" or even hear of "stream" before, is not networking
+api, all java grugs use list mr big brain!
- grug think this because while complexity demon bad for code base and
- understand, complexity demon very good for generation of much academic
- papers, sad but true
+[40]Parsing
- production parser almost always recursive descent, despite ignore by
- schools! grug furious when learn how simple parse is! parsing not big
- brain only magic: so can you!
+grug love make programming language at drop of hat and say [41]recursive
+descent most fun and beautiful way create parser
- grug very elated find big brain developer Bob Nystrom redeem the big
- brain tribe and write excellent book on recursive descent: [42]Crafting
- Interpreters
+unfortunately many big brain school teach only parser generator tool. here grug
+usual love of tool is not: parser generator tool generate code of awful snakes
+nest: impossible understand, bottom up, what? hide recursive nature of grammar
+from grug and debug impossible, very bad according grug!
- book available online free, but grug highly recommend all interested
- grugs purchase book on general principle, provide much big brain advice
- and grug love book very much except visitor pattern (trap!)
+grug think this because while complexity demon bad for code base and
+understand, complexity demon very good for generation of much academic papers,
+sad but true
- [43]The Visitor Pattern
+production parser almost always recursive descent, despite ignore by schools!
+grug furious when learn how simple parse is! parsing not big brain only magic:
+so can you!
- [44]bad
+grug very elated find big brain developer Bob Nystrom redeem the big brain
+tribe and write excellent book on recursive descent: [42]Crafting Interpreters
- [45]Front End Development
+book available online free, but grug highly recommend all interested grugs
+purchase book on general principle, provide much big brain advice and grug love
+book very much except visitor pattern (trap!)
- some non-grugs, when faced with web development say:
+[43]The Visitor Pattern
- "I know, I'll split my front end and back end codebase up and use a hot
- new SPA library talking to a GraphQL JSON API back end over HTTP (which
- is funny because I'm not transferring hypertext)"
+[44]bad
- now you have two complexity demon spirit lairs
+[45]Front End Development
- and, what is worse, front end complexity demon spirit even more
- powerful and have deep spiritual hold on entire front end industry as
- far as grug can tell
+some non-grugs, when faced with web development say:
- back end developers try keep things simple and can work ok, but front
- end developers make very complex very quickly and introduce lots of
- code, demon complex spirit
+"I know, I'll split my front end and back end codebase up and use a hot new SPA
+library talking to a GraphQL JSON API back end over HTTP (which is funny
+because I'm not transferring hypertext)"
- even when website just need put form into database or simple brochure
- site!
+now you have two complexity demon spirit lairs
- everyone do this now!
+and, what is worse, front end complexity demon spirit even more powerful and
+have deep spiritual hold on entire front end industry as far as grug can tell
- grug not sure why except maybe facebook and google say so, but that not
- seem very good reason to grug
+back end developers try keep things simple and can work ok, but front end
+developers make very complex very quickly and introduce lots of code, demon
+complex spirit
- grug not like big complex front end libraries everyone use
+even when website just need put form into database or simple brochure site!
- grug make [46]htmx and [47]hyperscript to avoid
+everyone do this now!
- keep complexity low, simple HTML, avoid lots javascript, the natural
- ether of spirit complexity demon
+grug not sure why except maybe facebook and google say so, but that not seem
+very good reason to grug
- maybe they work for you, but no job post, sorry
+grug not like big complex front end libraries everyone use
- react better for job and also some type application, but also you
- become alcolyte of complexity demon whether you like or no, sorry such
- is front end life
+grug make [46]htmx and [47]hyperscript to avoid
- [48]Fads
+keep complexity low, simple HTML, avoid lots javascript, the natural ether of
+spirit complexity demon
- grug note lots of fads in development, especially front end development
- today
+maybe they work for you, but no job post, sorry
- back end better more boring because all bad ideas have tried at this
- point maybe (still retry some!)
+react better for job and also some type application, but also you become
+alcolyte of complexity demon whether you like or no, sorry such is front end
+life
- still trying all bad ideas in front end development so still much
- change and hard to know
+[48]Fads
- grug recommend taking all revolutionary new approach with grain salt:
- big brains have working for long time on computers now, most ideas have
- tried at least once
+grug note lots of fads in development, especially front end development today
- grug not saying can't learn new tricks or no good new ideas, but also
- much of time wasted on recycled bad ideas, lots of spirit complexity
- demon power come from putting new idea willy nilly into code base
+back end better more boring because all bad ideas have tried at this point
+maybe (still retry some!)
- [49]Fear Of Looking Dumb
+still trying all bad ideas in front end development so still much change and
+hard to know
- note! very good if senior grug willing to say publicly: "hmmm, this too
- complex for grug"!
+grug recommend taking all revolutionary new approach with grain salt: big
+brains have working for long time on computers now, most ideas have tried at
+least once
- many developers Fear Of Looking Dumb (FOLD), grug also at one time
- FOLD, but grug learn get over: very important senior grug say "this too
- complicated and confuse to me"
+grug not saying can't learn new tricks or no good new ideas, but also much of
+time wasted on recycled bad ideas, lots of spirit complexity demon power come
+from putting new idea willy nilly into code base
- this make it ok for junior grugs to admit too complex and not
- understand as well, often such case! FOLD major source of complexity
- demon power over developer, especially young grugs!
-
- take FOLD power away, very good of senior grug!
-
- note: important to make thinking face and look big brained when saying
- though. be prepare for big brain or, worse and much more common, thinks
- is big brain to make snide remark of grug
-
- be strong! no FOLD!
-
- club sometimes useful here, but more often sense of humor and
- especially last failed project by big brain very useful, so collect and
- be calm
-
- [50]Impostor Syndrome
-
- grug note many such impostor feels in development
-
- always grug one of two states: grug is ruler of all survey, wield code
- club like thor OR grug have no idea what doing
-
- grug is mostly latter state most times, hide it pretty well though
-
- now, grug make softwares of much work and [51]moderate open source
- success , and yet grug himself often feel not any idea what doing! very
- often! grug still fear make mistake break everyone code and disappoint
- other grugs, imposter!
-
- is maybe nature of programming for most grug to feel impostor and be ok
- with is best: nobody imposter if everybody imposter
-
- any young grug read this far probably do fine in program career even if
- frustrations and worry is always to be there, sorry
-
- [52]Reads
-
- grug like these:
- * [53]Worse is Better
- * [54]Worse is Better is Worse
- * [55]Is Worse Really Better?
- * [56]A Philosophy of Software Design
-
- [57]Conclusion
-
- you say: complexity very, very bad
-
-References
-
- 1. https://www.redbubble.com/i/sticker/Programmer-Grug-by-colossalbreaker/42915272.EJUG5
- 2. https://grugbrain.dev/#grug-on-complexity
- 3. https://grugbrain.dev/#grug-on-saying-no
- 4. https://grugbrain.dev/#grug-on-saying-ok
- 5. https://en.wikipedia.org/wiki/Pareto_principle
- 6. https://grugbrain.dev/#grug-on-factring-your-code
- 7. https://grugbrain.dev/#grug-on-testing
- 8. https://en.wikipedia.org/wiki/Unit_testing
- 9. https://smartbear.com/solutions/end-to-end-testing/
- 10. https://en.wikipedia.org/wiki/Integration_testing
- 11. https://en.wikipedia.org/wiki/Mock_object
- 12. https://grugbrain.dev/#grug-on-agile
- 13. https://en.wikipedia.org/wiki/No_Silver_Bullet
- 14. https://grugbrain.dev/#grug-on-refactoring
- 15. https://www.webopedia.com/definitions/j2ee/
- 16. https://www.techtarget.com/searchnetworking/definition/OSGi
- 17. https://grugbrain.dev/#grug-on-chestertons-fence
- 18. https://en.wikipedia.org/wiki/G._K._Chesterton
- 19. https://grugbrain.dev/#grug-on-microservices
- 20. https://grugbrain.dev/#grug-on-tools
- 21. https://grugbrain.dev/#grug-on-type-systems
- 22. https://grugbrain.dev/#grug-on-expression-complexity
- 23. https://grugbrain.dev/#grug-on-dry
- 24. https://en.wikipedia.org/wiki/Don't_repeat_yourself
- 25. https://grugbrain.dev/#grug-on-soc
- 26. https://en.wikipedia.org/wiki/Separation_of_concerns
- 27. https://htmx.org/essays/locality-of-behaviour/
- 28. https://grugbrain.dev/#grug-on-closures
- 29. https://grugbrain.dev/#grug-on-logging
- 30. https://en.wikipedia.org/wiki/Rob_Pike
- 31. https://www.youtube.com/watch?v=KINIAgRpkDA
- 32. https://stackify.com/logging-java/
- 33. https://grugbrain.dev/#grug-on-concurrency
- 34. https://en.wikipedia.org/wiki/Optimistic_concurrency_control
- 35. https://en.wikipedia.org/wiki/Thread-local_storage
- 36. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
- 37. https://en.wikipedia.org/wiki/Erlang_(programming_language)
- 38. https://grugbrain.dev/#grug-on-optimizing
- 39. https://grugbrain.dev/#grug-on-apis
- 40. https://grugbrain.dev/#grug-on-parsing
- 41. https://en.wikipedia.org/wiki/Recursive_descent_parser
- 42. https://craftinginterpreters.com/
- 43. https://grugbrain.dev/#grug-on-visitor-pattern
- 44. https://en.wikipedia.org/wiki/Visitor_pattern
- 45. https://grugbrain.dev/#grug-on-front-end-development
- 46. https://htmx.org/
- 47. https://hyperscript.org/
- 48. https://grugbrain.dev/#grug-on-fads
- 49. https://grugbrain.dev/#grug-on-fold
- 50. https://grugbrain.dev/#grug-on-imposter-syndrom
- 51. https://star-history.com/#bigskysoftware/htmx&bigskysoftware/_hyperscript&Date
- 52. https://grugbrain.dev/#grug-reads
- 53. https://www.dreamsongs.com/WorseIsBetter.html
- 54. https://www.dreamsongs.com/Files/worse-is-worse.pdf
- 55. https://www.dreamsongs.com/Files/IsWorseReallyBetter.pdf
- 56. https://www.goodreads.com/en/book/show/39996759-a-philosophy-of-software-design
- 57. https://grugbrain.dev/#lol-lmao
+[49]Fear Of Looking Dumb
+
+note! very good if senior grug willing to say publicly: "hmmm, this too complex
+for grug"!
+
+many developers Fear Of Looking Dumb (FOLD), grug also at one time FOLD, but
+grug learn get over: very important senior grug say "this too complicated and
+confuse to me"
+
+this make it ok for junior grugs to admit too complex and not understand as
+well, often such case! FOLD major source of complexity demon power over
+developer, especially young grugs!
+
+take FOLD power away, very good of senior grug!
+
+note: important to make thinking face and look big brained when saying though.
+be prepare for big brain or, worse and much more common, thinks is big brain to
+make snide remark of grug
+
+be strong! no FOLD!
+
+club sometimes useful here, but more often sense of humor and especially last
+failed project by big brain very useful, so collect and be calm
+
+[50]Impostor Syndrome
+
+grug note many such impostor feels in development
+
+always grug one of two states: grug is ruler of all survey, wield code club
+like thor OR grug have no idea what doing
+
+grug is mostly latter state most times, hide it pretty well though
+
+now, grug make softwares of much work and [51]moderate open source success ,
+and yet grug himself often feel not any idea what doing! very often! grug still
+fear make mistake break everyone code and disappoint other grugs, imposter!
+
+is maybe nature of programming for most grug to feel impostor and be ok with is
+best: nobody imposter if everybody imposter
+
+any young grug read this far probably do fine in program career even if
+frustrations and worry is always to be there, sorry
+
+[52]Reads
+
+grug like these:
+
+ • [53]Worse is Better
+ • [54]Worse is Better is Worse
+ • [55]Is Worse Really Better?
+ • [56]A Philosophy of Software Design
+
+[57]Conclusion
+
+you say: complexity very, very bad
+
+
+References:
+
+[1] https://www.redbubble.com/i/sticker/Programmer-Grug-by-colossalbreaker/42915272.EJUG5
+[2] https://grugbrain.dev/#grug-on-complexity
+[3] https://grugbrain.dev/#grug-on-saying-no
+[4] https://grugbrain.dev/#grug-on-saying-ok
+[5] https://en.wikipedia.org/wiki/Pareto_principle
+[6] https://grugbrain.dev/#grug-on-factring-your-code
+[7] https://grugbrain.dev/#grug-on-testing
+[8] https://en.wikipedia.org/wiki/Unit_testing
+[9] https://smartbear.com/solutions/end-to-end-testing/
+[10] https://en.wikipedia.org/wiki/Integration_testing
+[11] https://en.wikipedia.org/wiki/Mock_object
+[12] https://grugbrain.dev/#grug-on-agile
+[13] https://en.wikipedia.org/wiki/No_Silver_Bullet
+[14] https://grugbrain.dev/#grug-on-refactoring
+[15] https://www.webopedia.com/definitions/j2ee/
+[16] https://www.techtarget.com/searchnetworking/definition/OSGi
+[17] https://grugbrain.dev/#grug-on-chestertons-fence
+[18] https://en.wikipedia.org/wiki/G._K._Chesterton
+[19] https://grugbrain.dev/#grug-on-microservices
+[20] https://grugbrain.dev/#grug-on-tools
+[21] https://grugbrain.dev/#grug-on-type-systems
+[22] https://grugbrain.dev/#grug-on-expression-complexity
+[23] https://grugbrain.dev/#grug-on-dry
+[24] https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
+[25] https://grugbrain.dev/#grug-on-soc
+[26] https://en.wikipedia.org/wiki/Separation_of_concerns
+[27] https://htmx.org/essays/locality-of-behaviour/
+[28] https://grugbrain.dev/#grug-on-closures
+[29] https://grugbrain.dev/#grug-on-logging
+[30] https://en.wikipedia.org/wiki/Rob_Pike
+[31] https://www.youtube.com/watch?v=KINIAgRpkDA
+[32] https://stackify.com/logging-java/
+[33] https://grugbrain.dev/#grug-on-concurrency
+[34] https://en.wikipedia.org/wiki/Optimistic_concurrency_control
+[35] https://en.wikipedia.org/wiki/Thread-local_storage
+[36] https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
+[37] https://en.wikipedia.org/wiki/Erlang_(programming_language)
+[38] https://grugbrain.dev/#grug-on-optimizing
+[39] https://grugbrain.dev/#grug-on-apis
+[40] https://grugbrain.dev/#grug-on-parsing
+[41] https://en.wikipedia.org/wiki/Recursive_descent_parser
+[42] https://craftinginterpreters.com/
+[43] https://grugbrain.dev/#grug-on-visitor-pattern
+[44] https://en.wikipedia.org/wiki/Visitor_pattern
+[45] https://grugbrain.dev/#grug-on-front-end-development
+[46] https://htmx.org/
+[47] https://hyperscript.org/
+[48] https://grugbrain.dev/#grug-on-fads
+[49] https://grugbrain.dev/#grug-on-fold
+[50] https://grugbrain.dev/#grug-on-imposter-syndrom
+[51] https://star-history.com/#bigskysoftware/htmx&bigskysoftware/_hyperscript&Date
+[52] https://grugbrain.dev/#grug-reads
+[53] https://www.dreamsongs.com/WorseIsBetter.html
+[54] https://www.dreamsongs.com/Files/worse-is-worse.pdf
+[55] https://www.dreamsongs.com/Files/IsWorseReallyBetter.pdf
+[56] https://www.goodreads.com/en/book/show/39996759-a-philosophy-of-software-design
+[57] https://grugbrain.dev/#lol-lmao
diff --git a/static/archive/inkdroid-org-belior.txt b/static/archive/inkdroid-org-belior.txt
index ace324a..fa5083d 100644
--- a/static/archive/inkdroid-org-belior.txt
+++ b/static/archive/inkdroid-org-belior.txt
@@ -1,165 +1,153 @@
- #[1]inkdroid
-
- (BUTTON)
- * [2]Home
- * [3]About
- * [4]Tags
- * [5]Bookmarks
- * [6]Photos
- * [7]Podcasts
- * [8]Music
- * [9]Software
- * [10]Mastodon
- * [11]Talks
- * [12]Web Archives
- * [13]Feed
- * [14]🎁
+ • [2]Home
+ • [3]About
+ • [4]Tags
+ • [5]Bookmarks
+ • [6]Photos
+ • [7]Podcasts
+ • [8]Music
+ • [9]Software
+ • [10]Mastodon
+ • [11]Talks
+ • [12]Web Archives
+ • [13]Feed
+ • [14]🎁
Why I don't use Copilot
- June 4, 2023
- [15]programming [16]artificial-intelligence
- __________________________________________________________________
+June 4, 2023
+[15]programming [16]artificial-intelligence
- TL;DR Don’t install Copilot. It rots your brain and destroys the
- environment.
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- [rubber-duck.jpg] [17]A rubber duck in use by a developer to aid code
- review
+TL;DR Don’t install Copilot. It rots your brain and destroys the environment.
- [18]GitHub Copilot is a technology that is designed to help you write
- code, kind of like your partner in [19]pair programming. But, you know,
- it’s not an actual person. It’s “A.I.”–whatever that means.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[rubber-duc] [17]A rubber duck in use by a developer to aid code review
- In principle this sounds like it might actually be a good thing right?
- I know several people, who I respect, that use it as part of their
- daily work. I’ve heard [20]smart people say AI coding assistants like
- Copilot will democratize programming, by making it possible for more
- people to write code, and automate the drudgery out of their lives. I’m
- not convinced.
+[18]GitHub Copilot is a technology that is designed to help you write code,
+kind of like your partner in [19]pair programming. But, you know, it’s not an
+actual person. It’s “A.I.”–whatever that means.
- Here’s why I don’t use Copilot (or ChatGPT) to write code:
- 1. Copilot’s suggestions are based on a corpus of open source code in
- GitHub, but the suggestions do not mention where the code came
- from, and what the license is. GitHub is stealing and selling
- intellectual property.
- 2. Copilot lets you write code faster. I don’t think more code is a
- good thing. The more code there is, the more code there is to
- maintain. Minimalism in features is usually a good thing too. Less
- really is more.
- 3. As more and more programmers use Copilot it creates conservativism
- in languages and frameworks that prevents people from creating and
- learning new ways of doing things. Collectively, we get even more
- stuck in our ways and biases. Some of the biases encoded into LLMs
- are things that we are actively trying to [21]change.
- 4. Developers become dependent on Copilot for intellectual work.
- Actually, maybe addicted is a better word here. The same could be
- (and was) said about the effect of search engines on software
- development work (e.g. Googling error messages). But the difference
- is that search results need to be interpreted, and the resulting
- web pages have important context that you often need to understand.
- This is work that Copilot optimizes away and truncates our
- knowledge in the process.
- 5. Copilot costs money. It doesn’t cost tons of money (for a
- professional person in the USA) but it could be significant for
- some. Who does it privilege? Also, it could change (see point 4).
- Remember who owns this thing.
- 6. How much [22]energy does it take to run Copilot as millions of
- developers outsource their intellectual work to its LLM
- infrastructure? Is this massive centralization and enclosure really
- progress in computing? Or is it a [23]step backwards as we try to
- [24]reduce our energy use as a species?
- 7. What does Copilot see of the code in your editor? Does it use your
- code as context for the prompt? What does it store, and remember,
- and give to others? Somebody has probably looked into this, but if
- they have it is always up for revision. Just out of principle I
- don’t want my editor sending my code somewhere else without me
- intentionally doing it.
- 8. Working with others who use Copilot makes my job harder, since they
- sometimes don’t really understand the details of why the code is
- written a particular way. Over time Copilot code can mix idioms,
- styles and approaches, in ways that the developer doesn’t really
- understand or even recognize. This makes maintenance harder.
+In principle this sounds like it might actually be a good thing right? I know
+several people, who I respect, that use it as part of their daily work. I’ve
+heard [20]smart people say AI coding assistants like Copilot will democratize
+programming, by making it possible for more people to write code, and automate
+the drudgery out of their lives. I’m not convinced.
- As far as I can tell the only redeeming qualities of Copilot are:
- 1. Copilot encourages you to articulate and describe a problem as
- written prose before starting to write code. You don’t need Copilot
- for this. Maybe keep a work journal or write a [25]design document?
- Maybe use your issue tracker? Use [26]text to communicate with
- other people.
- 2. Copilot is more interactive than a [27]rubber duck. But, it turns
- out Actual People are even more interactive and surprising. Reach
- out to other professionals and make some friends. Go to workshops
- and conferences.
- 3. I could be convinced that Copilot has a useful place in the
- [28]review of code rather than the first draft of code. It wouldn’t
- be a replacement for review by people, but I believe it could
- potentially help people do the review. I don’t think this exists
- yet?
- 4. Copilot makes me think critically about machine learning
- technology, my profession and its place in the world.
+Here’s why I don’t use Copilot (or ChatGPT) to write code:
- Maybe my thinking on this will change. But I doubt it. I’m on the older
- side for a software developer, and (hopefully) will retire some day.
- Maybe people like me are on the way out, and writing code with Copilot
- and ChatGPT is the future. Maybe programming has always been about
- increasing layers of abstraction and this is just the next logical
- layer. I really hope not.
+ 1. Copilot’s suggestions are based on a corpus of open source code in GitHub,
+ but the suggestions do not mention where the code came from, and what the
+ license is. GitHub is stealing and selling intellectual property.
+ 2. Copilot lets you write code faster. I don’t think more code is a good
+ thing. The more code there is, the more code there is to maintain.
+ Minimalism in features is usually a good thing too. Less really is more.
+ 3. As more and more programmers use Copilot it creates conservativism in
+ languages and frameworks that prevents people from creating and learning
+ new ways of doing things. Collectively, we get even more stuck in our ways
+ and biases. Some of the biases encoded into LLMs are things that we are
+ actively trying to [21]change.
+ 4. Developers become dependent on Copilot for intellectual work. Actually,
+ maybe addicted is a better word here. The same could be (and was) said
+ about the effect of search engines on software development work
+ (e.g. Googling error messages). But the difference is that search results
+ need to be interpreted, and the resulting web pages have important context
+ that you often need to understand. This is work that Copilot optimizes away
+ and truncates our knowledge in the process.
+ 5. Copilot costs money. It doesn’t cost tons of money (for a professional
+ person in the USA) but it could be significant for some. Who does it
+ privilege? Also, it could change (see point 4). Remember who owns this
+ thing.
+ 6. How much [22]energy does it take to run Copilot as millions of developers
+ outsource their intellectual work to its LLM infrastructure? Is this
+ massive centralization and enclosure really progress in computing? Or is it
+ a [23]step backwards as we try to [24]reduce our energy use as a species?
+ 7. What does Copilot see of the code in your editor? Does it use your code as
+ context for the prompt? What does it store, and remember, and give to
+ others? Somebody has probably looked into this, but if they have it is
+ always up for revision. Just out of principle I don’t want my editor
+ sending my code somewhere else without me intentionally doing it.
+ 8. Working with others who use Copilot makes my job harder, since they
+ sometimes don’t really understand the details of why the code is written a
+ particular way. Over time Copilot code can mix idioms, styles and
+ approaches, in ways that the developer doesn’t really understand or even
+ recognize. This makes maintenance harder.
- I enjoy programming because it’s about reasoning, thinking, models,
- concepts, expression, communication, ethics, reading, learning, making,
- and process. It’s an art and a practice that is best done with other
- people.
+As far as I can tell the only redeeming qualities of Copilot are:
- Increasingly I think it’s imperative for programming to be done more
- slowly, more deliberatively, and as part of more conversations with
- more people. The furious automation of everything is eating the world.
+ 1. Copilot encourages you to articulate and describe a problem as written
+ prose before starting to write code. You don’t need Copilot for this. Maybe
+ keep a work journal or write a [25]design document? Maybe use your issue
+ tracker? Use [26]text to communicate with other people.
+ 2. Copilot is more interactive than a [27]rubber duck. But, it turns out
+ Actual People are even more interactive and surprising. Reach out to other
+ professionals and make some friends. Go to workshops and conferences.
+ 3. I could be convinced that Copilot has a useful place in the [28]review of
+ code rather than the first draft of code. It wouldn’t be a replacement for
+ review by people, but I believe it could potentially help people do the
+ review. I don’t think this exists yet?
+ 4. Copilot makes me think critically about machine learning technology, my
+ profession and its place in the world.
- Programs need to run more efficiently. Programs need to be well
- understood, by a more diverse and varied set of people. Programs need
- to be robust and resilient. Programs need to be easier to change.
+Maybe my thinking on this will change. But I doubt it. I’m on the older side
+for a software developer, and (hopefully) will retire some day. Maybe people
+like me are on the way out, and writing code with Copilot and ChatGPT is the
+future. Maybe programming has always been about increasing layers of
+abstraction and this is just the next logical layer. I really hope not.
- Can Copilot help with these [29]goals? I think the answer is no,
- because it doesn’t actually understand anything, and more importantly,
- it doesn’t promote understanding.
- __________________________________________________________________
+I enjoy programming because it’s about reasoning, thinking, models, concepts,
+expression, communication, ethics, reading, learning, making, and process. It’s
+an art and a practice that is best done with other people.
- Update (2023-06-09): For another take on Copilot that uses this post as
- a jumping off point see Vivek Haldar’s [30]Re: Why I don’t use Copilot.
+Increasingly I think it’s imperative for programming to be done more slowly,
+more deliberatively, and as part of more conversations with more people. The
+furious automation of everything is eating the world.
- Unless otherwise noted all the content here is licensed [31]CC-BY
+Programs need to run more efficiently. Programs need to be well understood, by
+a more diverse and varied set of people. Programs need to be robust and
+resilient. Programs need to be easier to change.
-References
+Can Copilot help with these [29]goals? I think the answer is no, because it
+doesn’t actually understand anything, and more importantly, it doesn’t promote
+understanding.
- 1. https://inkdroid.org/feed.xml
- 2. https://inkdroid.org/
- 3. https://inkdroid.org/about/
- 4. https://inkdroid.org/tags/
- 5. http://pinboard.in/u:edsu
- 6. https://www.flickr.com/photos/inkdroid
- 7. https://inkdroid.org/podcasts/feed.opml
- 8. https://bandcamp.com/edsu
- 9. https://github.com/edsu
- 10. https://social.coop/@edsu
- 11. https://inkdroid.org/talks/
- 12. https://inkdroid.org/web-archives/archives/
- 13. https://inkdroid.org/feed.xml
- 14. https://bookshop.org/wishlists/d7c0224f5440df8d2c174ad2cc38b3fca1aa813f
- 15. https://inkdroid.org/tag/programming
- 16. https://inkdroid.org/tag/artificial-intelligence
- 17. https://commons.wikimedia.org/wiki/File:Rubber_duck_assisting_with_debugging.jpg
- 18. https://en.wikipedia.org/wiki/GitHub_Copilot
- 19. https://en.wikipedia.org/wiki/Pair_programming
- 20. https://changelog.com/podcast/534
- 21. https://www.wired.com/story/tech-confronts-use-labels-master-slave/
- 22. https://dl.acm.org/doi/pdf/10.1145/3442188.3445922
- 23. https://www.washingtonpost.com/technology/2023/06/05/chatgpt-hidden-cost-gpu-compute/
- 24. https://www.jasonhickel.org/less-is-more
- 25. https://en.wikipedia.org/wiki/Software_design_description
- 26. https://graydon2.dreamwidth.org/193447.html
- 27. https://en.wikipedia.org/wiki/Rubber_duck_debugging
- 28. https://en.wikipedia.org/wiki/Code_review
- 29. https://permacomputing.net/
- 30. https://vivekhaldar.com/articles/re--why-i-don-t-use-copilot/
- 31. https://creativecommons.org/licenses/by/4.0/
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+Update (2023-06-09): For another take on Copilot that uses this post as a
+jumping off point see Vivek Haldar’s [30]Re: Why I don’t use Copilot.
+
+Unless otherwise noted all the content here is licensed [31]CC-BY
+
+
+References:
+
+[2] https://inkdroid.org/
+[3] https://inkdroid.org/about/
+[4] https://inkdroid.org/tags/
+[5] http://pinboard.in/u:edsu
+[6] https://www.flickr.com/photos/inkdroid
+[7] https://inkdroid.org/podcasts/feed.opml
+[8] https://bandcamp.com/edsu
+[9] https://github.com/edsu
+[10] https://social.coop/@edsu
+[11] https://inkdroid.org/talks/
+[12] https://inkdroid.org/web-archives/archives/
+[13] https://inkdroid.org/feed.xml
+[14] https://bookshop.org/wishlists/d7c0224f5440df8d2c174ad2cc38b3fca1aa813f
+[15] https://inkdroid.org/tag/programming
+[16] https://inkdroid.org/tag/artificial-intelligence
+[17] https://commons.wikimedia.org/wiki/File:Rubber_duck_assisting_with_debugging.jpg
+[18] https://en.wikipedia.org/wiki/GitHub_Copilot
+[19] https://en.wikipedia.org/wiki/Pair_programming
+[20] https://changelog.com/podcast/534
+[21] https://www.wired.com/story/tech-confronts-use-labels-master-slave/
+[22] https://dl.acm.org/doi/pdf/10.1145/3442188.3445922
+[23] https://www.washingtonpost.com/technology/2023/06/05/chatgpt-hidden-cost-gpu-compute/
+[24] https://www.jasonhickel.org/less-is-more
+[25] https://en.wikipedia.org/wiki/Software_design_description
+[26] https://graydon2.dreamwidth.org/193447.html
+[27] https://en.wikipedia.org/wiki/Rubber_duck_debugging
+[28] https://en.wikipedia.org/wiki/Code_review
+[29] https://permacomputing.net/
+[30] https://vivekhaldar.com/articles/re--why-i-don-t-use-copilot/
+[31] https://creativecommons.org/licenses/by/4.0/
diff --git a/static/archive/inviqa-com-kztbkj.txt b/static/archive/inviqa-com-kztbkj.txt
index 8c1aa36..8e796d9 100644
--- a/static/archive/inviqa-com-kztbkj.txt
+++ b/static/archive/inviqa-com-kztbkj.txt
@@ -1,113 +1,109 @@
- #[1]alternate
+[1] Skip to main content
+Search [2][ ]
+[3][Search]
+[4] Home
+Main navigation Menu
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-NBN52P
+ • [6]Who we are
+ □ [7]About Inviqa
+ □ [8]About Havas
+ □ [9]Our Sustainability Journey
+ • [10]What we do
+ □ [11]Digital Strategy Consulting
+ □ [12]Digital Roadmap Development
+ □ [13]Digital Product Design
+ □ [14]User Research
+ □ [15]Usability Testing
+ □ [16]Technical Architecture Consulting & Development
+ □ [17]Digital Platform Implementation
+ □ [18]Experience Optimisation
+ □ [19]All services
+ • [20]Case studies
+ □ [21]B2B case studies
+ □ [22]Fashion & Luxury case studies
+ □ [23]Not-For-Profit case studies
+ □ [24]Retail & DTC case studies
+ □ [25]Sport, Leisure & Entertainment case studies
+ □ [26]Travel & Hotels case studies
+ □ [27]All case studies
+ • [28]Partners
+ □ [29]Akeneo
+ □ [30]BigCommerce
+ □ [31]Drupal
+ □ [32]Magento / Adobe Commerce
+ □ [33]Spryker
+ □ [34]All partners
+ • [35]Careers
+ □ [36]Life at Inviqa
+ □ [37]Current Vacancies
+ • [38]Insights
+ □ [39]DTC Ecommerce Report 2023
+ □ [40]PIM Readiness Framework
+ □ [41]Retail Optimisation Whitepaper
+ □ [42]Blog
+ □ [43]All insights
+ • [44]Contact
+ □ [45]Get in Touch
- [3]Skip to main content
-
- Search ______________________________
- Search
- [4]Home
-
- Main navigation (BUTTON) Menu
- * [5]Who we are
- + [6]About Inviqa
- + [7]About Havas
- + [8]Our Sustainability Journey
- * [9]What we do
- + [10]Digital Strategy Consulting
- + [11]Digital Roadmap Development
- + [12]Digital Product Design
- + [13]User Research
- + [14]Usability Testing
- + [15]Technical Architecture Consulting & Development
- + [16]Digital Platform Implementation
- + [17]Experience Optimisation
- + [18]All services
- * [19]Case studies
- + [20]B2B case studies
- + [21]Fashion & Luxury case studies
- + [22]Not-For-Profit case studies
- + [23]Retail & DTC case studies
- + [24]Sport, Leisure & Entertainment case studies
- + [25]Travel & Hotels case studies
- + [26]All case studies
- * [27]Partners
- + [28]Akeneo
- + [29]BigCommerce
- + [30]Drupal
- + [31]Magento / Adobe Commerce
- + [32]Spryker
- + [33]All partners
- * [34]Careers
- + [35]Life at Inviqa
- + [36]Current Vacancies
- * [37]Insights
- + [38]DTC Ecommerce Report 2023
- + [39]PIM Readiness Framework
- + [40]Retail Optimisation Whitepaper
- + [41]Blog
- + [42]All insights
- * [43]Contact
- + [44]Get in Touch
-
- * [45]EN
- * [46]DE
+ • [46] EN
+ • [47] DE
Storing graphs in the database: SQL meets social network
- By Lorenzo Alberton
- 7 September 2009 [47]Technology engineering
+By Lorenzo Alberton
+7 September 2009 [48]Technology engineering
- Graphs are ubiquitous. Social or P2P networks, thesauri, route planning
- systems, recommendation systems, collaborative filtering, even the
- World Wide Web itself is ultimately a graph!
+Graphs are ubiquitous. Social or P2P networks, thesauri, route planning
+systems, recommendation systems, collaborative filtering, even the World Wide
+Web itself is ultimately a graph!
- Given their importance, it's surely worth spending some time in
- studying some algorithms and models to represent and work with them
- effectively. In this short article, we're going to see how we can store
- a graph in a DBMS. Given how much attention my talk about storing a
- tree data structure in the db received, it's probably going to be
- interesting to many. Unfortunately, the Tree models/techniques do not
- apply to generic graphs, so let's discover how we can deal with them.
+Given their importance, it's surely worth spending some time in studying some
+algorithms and models to represent and work with them effectively. In this
+short article, we're going to see how we can store a graph in a DBMS. Given how
+much attention my talk about storing a tree data structure in the db received,
+it's probably going to be interesting to many. Unfortunately, the Tree models/
+techniques do not apply to generic graphs, so let's discover how we can deal
+with them.
What's a graph
- A graph is a set of nodes (vertices) interconnected by links (edges).
- When the edges have no orientation, the graph is called an undirected
- graph. In contrast, a graph where the edges have a specific orientation
- from a node to another is called directed:
- " "
+A graph is a set of nodes (vertices) interconnected by links (edges). When the
+edges have no orientation, the graph is called an undirected graph. In
+contrast, a graph where the edges have a specific orientation from a node to
+another is called directed:
- A graph is called complete when there's an edge between any two
- nodes, dense when the number of edges is close to the maximal number of
- edges, and sparse when it has only a few edges:
- " "
+" "
+
+A graph is called complete when there's an edge between any two nodes, dense
+ when the number of edges is close to the maximal number of edges, and sparse
+ when it has only a few edges:
+
+" "
Representing a graph
- Two main data structures for the representation of graphs are used in
- practice. The first is called an adjacency list, and is implemented as
- an array with one linked list for each source node, containing the
- destination nodes of the edges that leave each node. The second is a
- two-dimensional boolean adjacency matrix, in which the rows and columns
- are the source and destination vertices, and entries in the array
- indicate whether an edge exists between the vertices. Adjacency lists
- are preferred for sparse graphs; otherwise, an adjacency matrix is a
- good choice. [1]
- " " " "
+Two main data structures for the representation of graphs are used in practice.
+The first is called an adjacency list, and is implemented as an array with one
+linked list for each source node, containing the destination nodes of the edges
+that leave each node. The second is a two-dimensional boolean adjacency matrix,
+in which the rows and columns are the source and destination vertices, and
+entries in the array indicate whether an edge exists between the vertices.
+Adjacency lists are preferred for sparse graphs; otherwise, an adjacency matrix
+is a good choice. [1]
- When dealing with databases, most of the times the adjacency matrix is
- not a viable option, for two reasons: there is a hard limit in the
- number of columns that a table can have, and adding or removing a node
- requires a DDL statement.
+" "" "
- Joe Celko dedicates a short chapter to graphs in his '[48]SQL for
- Smarties' book, but the topic is treated in a quite hasty way, which is
- surprising given his usual high standards.
+When dealing with databases, most of the times the adjacency matrix is not a
+viable option, for two reasons: there is a hard limit in the number of columns
+that a table can have, and adding or removing a node requires a DDL statement.
+
+Joe Celko dedicates a short chapter to graphs in his '[49]SQL for Smarties'
+book, but the topic is treated in a quite hasty way, which is surprising given
+his usual high standards.
+
+One of the basic rules of a successful representation is to separate the nodes
+and the edges, to avoid [50]DKNF problems. Thus, we create two tables:
- One of the basic rules of a successful representation is to separate
- the nodes and the edges, to avoid [49]DKNF problems. Thus, we create
- two tables:
CREATE TABLE nodes (
id INTEGER PRIMARY KEY,
name VARCHAR(10) NOT NULL,
@@ -124,20 +120,19 @@ CREATE TABLE edges (
CREATE INDEX a_idx ON edges (a);
CREATE INDEX b_idx ON edges (b);
- The first table (nodes) contains the actual node payload, with all the
- interesting information we need to store about a node (in the
- example, feat1 and feat2 represent two node features, like the age of
- the person, or the location, etc.).
+The first table (nodes) contains the actual node payload, with all the
+interesting information we need to store about a node (in the example, feat1
+ and feat2 represent two node features, like the age of the person, or the
+location, etc.).
- If we want to represent an undirected graph, we need to add a CHECK
- constraint on the uniqueness of the pair.
+If we want to represent an undirected graph, we need to add a CHECK constraint
+on the uniqueness of the pair.
- Since the SQL standard does not allow a subquery in the CHECK
- constraint, we first create a function and then we use it in the CHECK
- constraint (this example is for PostgreSQL, but can be easily ported to
- other DBMS):
-CREATE FUNCTION check_unique_pair(IN id1 INTEGER, IN id2 INTEGER) RETURNS INTEGE
-R AS $body$
+Since the SQL standard does not allow a subquery in the CHECK constraint, we
+first create a function and then we use it in the CHECK constraint (this
+example is for PostgreSQL, but can be easily ported to other DBMS):
+
+CREATE FUNCTION check_unique_pair(IN id1 INTEGER, IN id2 INTEGER) RETURNS INTEGER AS $body$
DECLARE retval INTEGER DEFAULT 0;
BEGIN
SELECT COUNT(*) INTO retval FROM (
@@ -150,31 +145,32 @@ END
$body$
LANGUAGE 'plpgsql';
-ALTER TABLE edges ADD CONSTRAINT unique_pair CHECK (check_unique_pair(a, b) < 1)
-;
+ALTER TABLE edges ADD CONSTRAINT unique_pair CHECK (check_unique_pair(a, b) < 1);
- NB: a UDF in a CHECK constraint might be a bit slow [4]. An alternative
- is to have a materialized view [5] or force an order in the node pair
- (i.e. "CHECK (a < b)", and then using a stored procedure to insert the
- nodes in the correct order).
+NB: a UDF in a CHECK constraint might be a bit slow [4]. An alternative is to
+have a materialized view [5] or force an order in the node pair (i.e. "CHECK (a
+< b)", and then using a stored procedure to insert the nodes in the correct
+order).
+
+If we also want to prevent self-loops (i.e. a node linking to itself), we can
+add another CHECK constraint:
- If we also want to prevent self-loops (i.e. a node linking to itself),
- we can add another CHECK constraint:
ALTER TABLE edges ADD CONSTRAINT no_self_loop CHECK (a <> b)
- " " " "
+" "" "
Traversing the graph
- Now that we know how to store the graph, we might want to know which
- nodes are connected. Listing the directly connected nodes is very
- simple:
+Now that we know how to store the graph, we might want to know which nodes are
+connected. Listing the directly connected nodes is very simple:
+
SELECT *
FROM nodes n
LEFT JOIN edges e ON n.id = e.b
WHERE e.a = 1; -- retrieve nodes connected to node 1
- or, in the case of undirected edges:
+or, in the case of undirected edges:
+
SELECT * FROM nodes WHERE id IN (
SELECT a FROM edges WHERE b = 1
UNION
@@ -189,53 +185,51 @@ SELECT * FROM nodes where id IN (
WHERE 1 IN (a, b)
);
- Traversing the full graph usually requires more than a query: we can
- either loop through the connected nodes, one level a time, or we can
- create a temporary table holding all the possible paths between two
- nodes.
+Traversing the full graph usually requires more than a query: we can either
+loop through the connected nodes, one level a time, or we can create a
+temporary table holding all the possible paths between two nodes.
- We could use Oracle’s CONNECT BY syntax or SQL standard’s Common Table
- Expressions (CTEs) to recurse through the nodes, but since the graph
- can contain loops, we’d get errors (unless we’re very careful, as we’ll
- see in a moment).
+We could use Oracle’s CONNECT BY syntax or SQL standard’s Common Table
+Expressions (CTEs) to recurse through the nodes, but since the graph can
+contain loops, we’d get errors (unless we’re very careful, as we’ll see in a
+moment).
- Kendall Willets [2] proposes a way of traversing (BFS) the graph using
- a temporary table. It is quite robust, since it doesn’t fail on graphs
- with cycles (and when dealing with trees, he shows there are better
- algorithms available). His solution is just one of the many available,
- but quite good.
+Kendall Willets [2] proposes a way of traversing (BFS) the graph using a
+temporary table. It is quite robust, since it doesn’t fail on graphs with
+cycles (and when dealing with trees, he shows there are better algorithms
+available). His solution is just one of the many available, but quite good.
- The problem with temporary tables holding all the possible paths is it
- has to be maintained. Depending on how frequently the data is accessed
- and updated it might still be worth it, but it’s quite expensive. If
- you do resort to such a solution, these references may be of use [13]
- [14].
+The problem with temporary tables holding all the possible paths is it has to
+be maintained. Depending on how frequently the data is accessed and updated it
+might still be worth it, but it’s quite expensive. If you do resort to such a
+solution, these references may be of use [13] [14].
- Before going further in our analysis, we need to introduce a new
- concept: the transitive closure of a graph.
+Before going further in our analysis, we need to introduce a new concept: the
+transitive closure of a graph.
Transitive closure
- The transitive closure of a graph G = (V,E) is a graph G* = (V,E*) such
- that E* contains an edge (u,v) if and only if G contains a path from u
- to v.
+The transitive closure of a graph G = (V,E) is a graph G* = (V,E*) such that E*
+contains an edge (u,v) if and only if G contains a path from u to v.
- In other words, the transitive closure of a graph is a graph which
- contains an edge (u,v) whenever there is a directed path from u to v.
- " "
+In other words, the transitive closure of a graph is a graph which contains an
+edge (u,v) whenever there is a directed path from u to v.
- Graph: transitive closure
+" "
- As already mentioned, SQL has historically been unable [3] to express
- recursive functions needed to maintain the transitive closure of a
- graph without an auxiliary table. There are many solutions to solve
- this problem with a temporary table (some even elegant [2]), but I
- still haven't found one to do it dynamically.
+Graph: transitive closure
- Here's my clumsy attempt at a possible solution using CTEs
+As already mentioned, SQL has historically been unable [3] to express recursive
+functions needed to maintain the transitive closure of a graph without an
+auxiliary table. There are many solutions to solve this problem with a
+temporary table (some even elegant [2]), but I still haven't found one to do it
+dynamically.
+
+Here's my clumsy attempt at a possible solution using CTEs
+
+First, this is how we can write the WITH RECURSIVE statement for a Directed
+(Cyclic) Graph:
- First, this is how we can write the WITH RECURSIVE statement for a
- Directed (Cyclic) Graph:
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
( SELECT a, b, 1 AS distance,
a || '.' || b || '.' AS path_string
@@ -253,15 +247,16 @@ WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
SELECT * FROM transitive_closure
ORDER BY a, b, distance;
- Notice the WHERE condition, which stops the recursion in the presence
- of loops. This is very important to avoid errors.
+Notice the WHERE condition, which stops the recursion in the presence of loops.
+This is very important to avoid errors.
- Sample output:
- " "
+Sample output:
+
+" "
+
+This is a slightly modified version of the same query to deal with Undirected
+graphs (NB: this is probably going to be rather slow if done in real time):
- This is a slightly modified version of the same query to deal with
- Undirected graphs (NB: this is probably going to be rather slow if done
- in real time):
-- DROP VIEW edges2;
CREATE VIEW edges2 (a, b) AS (
SELECT a, b FROM edges
@@ -287,24 +282,24 @@ ORDER BY a, b, distance;
Linkedin: Degrees of separation
- One of the fundamental characteristics of networks (or graphs in
- general) is connectivity. We might want to know how to go from A to B,
- or how two people are connected, and we also want to know how many
- "hops" separate two nodes, to have an idea about the distance.
+One of the fundamental characteristics of networks (or graphs in general) is
+connectivity. We might want to know how to go from A to B, or how two people
+are connected, and we also want to know how many "hops" separate two nodes, to
+have an idea about the distance.
- For instance, social networks like LinkedIN show our connections or
- search results sorted by degree of separation, and trip planning sites
- show how many flights you have to take to reach your destination,
- usually listing direct connections first.
+For instance, social networks like LinkedIN show our connections or search
+results sorted by degree of separation, and trip planning sites show how many
+flights you have to take to reach your destination, usually listing direct
+connections first.
- There are some database extensions or hybrid solutions like SPARQL on
- Virtuoso [11] that add a TRANSITIVE clause [12] to make this kind of
- queries both easy and efficient, but we want to see how to reach the
- same goal with standard SQL.
+There are some database extensions or hybrid solutions like SPARQL on Virtuoso
+[11] that add a TRANSITIVE clause [12] to make this kind of queries both easy
+and efficient, but we want to see how to reach the same goal with standard SQL.
+
+As you might guess, this becomes really easy once you have the transitive
+closure of the graph, we only have to add a WHERE clause specifying what our
+source and destination nodes are:
- As you might guess, this becomes really easy once you have the
- transitive closure of the graph, we only have to add a WHERE clause
- specifying what our source and destination nodes are:
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
( SELECT a, b, 1 AS distance,
a || '.' || b || '.' AS path_string
@@ -323,20 +318,20 @@ WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
WHERE b=6 -- destination
ORDER BY a, b, distance;
- " "
+" "
- If we're showing the trip planning results, then we have a list of all
- possible travel solutions; instead of sorting by distance, we might
- sort by price or other parameters with little changes.
+If we're showing the trip planning results, then we have a list of all possible
+travel solutions; instead of sorting by distance, we might sort by price or
+other parameters with little changes.
- If we're showing how two people are connected (LinkedIN), then we can
- limit the result set to the first row, since we're probably interested
- in showing the shortest distance only and not all the other
- alternatives.
+If we're showing how two people are connected (LinkedIN), then we can limit the
+result set to the first row, since we're probably interested in showing the
+shortest distance only and not all the other alternatives.
+
+Instead of adding a LIMIT clause, it's probably more efficient to add "AND
+tc.distance = 0" to the WHERE clause of the recursive part of the CTE, or a
+GROUP BY clause as follows:
- Instead of adding a LIMIT clause, it's probably more efficient to add
- "AND tc.distance = 0" to the WHERE clause of the recursive part of the
- CTE, or a GROUP BY clause as follows:
WITH RECURSIVE transitive_closure(a, b, distance, path_string)
AS
( SELECT a, b, 1 AS distance,
@@ -356,11 +351,12 @@ SELECT a, b, min(distance) AS dist FROM transitive_closure
GROUP BY a, b
ORDER BY a, dist, b;
- " "
+" "
+
+If you are interested in the immediate connections of a certain node, then
+specify the starting node and a distance equals to one (by limiting the
+recursion at the first level)
- If you are interested in the immediate connections of a certain node,
- then specify the starting node and a distance equals to one (by
- limiting the recursion at the first level)
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
( SELECT a, b, 1 AS distance, a || '.' || b || '.' AS path_string
FROM edges2
@@ -377,16 +373,16 @@ WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
)
SELECT b FROM transitive_closure;
- Of course to get the immediate connections there's no need for a
- recursive query (just use the one presented at the previous paragraph),
- but I thought I'd show it anyway as a first step towards more complex
- queries.
+Of course to get the immediate connections there's no need for a recursive
+query (just use the one presented at the previous paragraph), but I thought I'd
+show it anyway as a first step towards more complex queries.
- LinkedIN has a nice feature to show "How this user is connected to you"
- for non directly connected nodes.
+LinkedIN has a nice feature to show "How this user is connected to you" for non
+directly connected nodes.
+
+If the distance between the two nodes is equal to 2, you can show the shared
+connections:
- If the distance between the two nodes is equal to 2, you can show the
- shared connections:
SELECT b FROM (
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
@@ -426,15 +422,15 @@ SELECT b FROM transitive_closure
GROUP BY b
HAVING COUNT(b) > 1;
- In the above query, we select the immediate connections of the two
- nodes separately, and then select the shared ones.
+In the above query, we select the immediate connections of the two nodes
+separately, and then select the shared ones.
- For nodes having a distance equals to 3, the approach is slightly
- different.
+For nodes having a distance equals to 3, the approach is slightly different.
+
+First, you check that the two nodes are indeed at a minimum distance of 3 nodes
+(you're probably not interested in showing the relationship between two nodes
+when the distance is bigger):
- First, you check that the two nodes are indeed at a minimum distance of
- 3 nodes (you're probably not interested in showing the relationship
- between two nodes when the distance is bigger):
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
( SELECT a, b, 1 AS distance,
a || '.' || b || '.' AS path_string
@@ -455,21 +451,22 @@ WHERE b=4 -- set the target node
GROUP BY a, b
HAVING min(distance) = 3; --set the minimum distance
- Then you select the paths between those nodes.
+Then you select the paths between those nodes.
- But there's a different approach which is more generic and efficient,
- and can be used for all the nodes whose distance is bigger than 2.
+But there's a different approach which is more generic and efficient, and can
+be used for all the nodes whose distance is bigger than 2.
- The idea is to select the immediate neighbours of the starting node
- that are also in the path to the other node.
+The idea is to select the immediate neighbours of the starting node that are
+also in the path to the other node.
- Depending on the distance, you can have either the shared nodes
- (distance = 2), or the connections that could lead to the other node
- (distance > 2). In the latter case, you could for instance show how A
- is connected to B:
- " "
+Depending on the distance, you can have either the shared nodes (distance = 2),
+or the connections that could lead to the other node (distance > 2). In the
+latter case, you could for instance show how A is connected to B:
+
+" "
+
+Linkedin
- Linkedin
WITH RECURSIVE transitive_closure(a, b, distance, path_string) AS
( SELECT a, b, 1 AS distance,
a || '.' || b || '.' AS path_string,
@@ -491,47 +488,44 @@ SELECT * FROM transitive_closure
--WHERE b=3 -- set the target node
ORDER BY a,b,distance
- " "
+" "
Facebook: You might also know
- A similar but slightly different requirement is to find those nodes
- that are most strongly related, but not directly connected yet. In
- other words, it's interesting to find out which and how many connected
- nodes are shared between any two nodes, i.e. how many 'friends' are
- shared between two individuals. Or better yet, to find those nodes
- sharing a certain (minimum) number of nodes with the current one.
+A similar but slightly different requirement is to find those nodes that are
+most strongly related, but not directly connected yet. In other words, it's
+interesting to find out which and how many connected nodes are shared between
+any two nodes, i.e. how many 'friends' are shared between two individuals. Or
+better yet, to find those nodes sharing a certain (minimum) number of nodes
+with the current one.
- This could be useful to suggest a new possible friend, or in the case
- of recommendation systems, to suggest a new item/genre that matches the
- user's interests.
+This could be useful to suggest a new possible friend, or in the case of
+recommendation systems, to suggest a new item/genre that matches the user's
+interests.
- There are many ways of doing this. In theory, this is bordering on the
- domain of collaborative filtering [6][7][8], so using Pearson's
- correlation [9] or a similar distance measure with an appropriate
- algorithm [10] is going to generate the best results. Collaborative
- filtering is an incredibly interesting topic on its own, but outside
- the scope of this article.
+There are many ways of doing this. In theory, this is bordering on the domain
+of collaborative filtering [6][7][8], so using Pearson's correlation [9] or a
+similar distance measure with an appropriate algorithm [10] is going to
+generate the best results. Collaborative filtering is an incredibly interesting
+topic on its own, but outside the scope of this article.
- A rough and inexpensive alternative is to find the nodes having
- distance equals to 2, and filter those that either have a common
- characteristic with the source node (went to the same school / worked
- at the same company, belong to the same interest group / are items of
- the same genre) or have several mutual 'friends'.
- " "
+A rough and inexpensive alternative is to find the nodes having distance equals
+to 2, and filter those that either have a common characteristic with the source
+node (went to the same school / worked at the same company, belong to the same
+interest group / are items of the same genre) or have several mutual 'friends'.
- Facebook
+" "
+
+Facebook
+
+This, again, is easily done once you have the transitive closure of the graph:
- This, again, is easily done once you have the transitive closure of the
- graph:
SELECT a AS you,
b AS mightknow,
shared_connection,
CASE
- WHEN (n1.feat1 = n2.feat1 AND n1.feat1 = n3.feat1) THEN 'feat1 in commo
-n'
- WHEN (n1.feat2 = n2.feat2 AND n1.feat2 = n3.feat2) THEN 'feat2 in commo
-n'
+ WHEN (n1.feat1 = n2.feat1 AND n1.feat1 = n3.feat1) THEN 'feat1 in common'
+ WHEN (n1.feat2 = n2.feat2 AND n1.feat2 = n3.feat2) THEN 'feat2 in common'
ELSE 'nothing in common'
END AS reason
FROM (
@@ -564,184 +558,179 @@ LEFT JOIN nodes AS n3 ON youmightknow.shared_connection = n3.id
WHERE (n1.feat1 = n2.feat1 AND n1.feat1 = n3.feat1)
OR (n1.feat2 = n2.feat2 AND n1.feat2 = n3.feat2);
- " "
+" "
- Once you have selected these nodes, you can filter those recurring more
- often, or give more importance to those having a certain feature in
- common, or pick one randomly (so you don't end up suggesting the same
- node over and over).
+Once you have selected these nodes, you can filter those recurring more often,
+or give more importance to those having a certain feature in common, or pick
+one randomly (so you don't end up suggesting the same node over and over).
Conclusion
- In this article I had some fun with the new and powerful CTEs, and
- showed some practical examples where they can be useful. I also showed
- some approaches at solving the challenges faced by any social network
- or recommendation system.
+In this article I had some fun with the new and powerful CTEs, and showed some
+practical examples where they can be useful. I also showed some approaches at
+solving the challenges faced by any social network or recommendation system.
- You are advised that depending on the size of the graph and the
- performance requirements of your application, the above queries might
- be too slow to run in realtime. Caching is your friend.
+You are advised that depending on the size of the graph and the performance
+requirements of your application, the above queries might be too slow to run in
+realtime. Caching is your friend.
- Update: Many of the queries in this article have been revised, so
- please refer
- to [50]http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age
- for changes.
+Update: Many of the queries in this article have been revised, so please refer
+to [51]http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age for
+changes.
References
- [1] [51]http://willets.org/sqlgraphs.html
+[1] [52]http://willets.org/sqlgraphs.html
- [2] [52]http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
+[2] [53]http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
- [3] [53]http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/25
- /scalar-udfs-wrapped-in-check-constraints-are-very-slow-and-may-fail-fo
- r-multirow-updates.aspx
+[3] [54]http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/25/
+scalar-udfs-wrapped-in-check-constraints-are-very-slow-and-may-fail-for-multirow-updates.aspx
- [4] [54]http://www.dbazine.com/oracle/or-articles/tropashko8
+[4] [55]http://www.dbazine.com/oracle/or-articles/tropashko8
- [5] [55]http://en.wikipedia.org/wiki/Collaborative_filtering
+[5] [56]http://en.wikipedia.org/wiki/Collaborative_filtering
- [6] [56]http://en.wikipedia.org/wiki/Slope_One
+[6] [57]http://en.wikipedia.org/wiki/Slope_One
- [7] blog.charliezhu.com/2008/07/21/implementing-slope-one-in-t-sql/
+[7] blog.charliezhu.com/2008/07/21/implementing-slope-one-in-t-sql/
- [8] bakara.eng.tau.ac.il/~semcomm/slides7/grouplensAlgs-Kahn.pps
+[8] bakara.eng.tau.ac.il/~semcomm/slides7/grouplensAlgs-Kahn.pps
- [9] [57]http://www.slideshare.net/denisparra/evaluation-of-collaborativ
- e-filtering-algorithms-for-recommending-articles-on-citeulike
+[9] [58]http://www.slideshare.net/denisparra/
+evaluation-of-collaborative-filtering-algorithms-for-recommending-articles-on-citeulike
- [10] [58]http://virtuoso.openlinksw.com/
+[10] [59]http://virtuoso.openlinksw.com/
- [11] [59]http://www.openlinksw.com/weblog/oerling/?id=1433
+[11] [60]http://www.openlinksw.com/weblog/oerling/?id=1433
- [12] [60]http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
+[12] [61]http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
- [13] [61]http://en.wikipedia.org/wiki/Transitive_reduction
+[13] [62]http://en.wikipedia.org/wiki/Transitive_reduction
You might also like...
- A woman reviews code on her laptop
+[63]
+A woman reviews code on her laptop
+
Headless commerce: everything you need to know
- What the heck is headless? Discover the what, why, and when of headless
- architectures with our guide to headless commerce.
+What the heck is headless? Discover the what, why, and when of headless
+architectures with our guide to headless commerce.
+
+[64]
+Drupal consulting and web development at Inviqa
- Drupal consulting and web development at Inviqa
The Drupal 9 upgrade Config Split issue and how to fix it
- In this article we look back at an issue we’ve encountered with Drupal
- Config Split when upgrading Drupal 8 to 9 – and we share how to fix it,
- so you don’t have to run into the same issue when upgrading to Drupal
- 9.
+In this article we look back at an issue we’ve encountered with Drupal Config
+Split when upgrading Drupal 8 to 9 – and we share how to fix it, so you don’t
+have to run into the same issue when upgrading to Drupal 9.
- Inviqa, winner of Webby Awards The Webby Awards winner
- Inviqa named one of Top 100 Agencies in Econsultancy Top 100 Digital
- Agencies
- Inviqa UXUK Awards winner UXUK Awards winner
- DADI Award winner of 'Best UX / Usability category' DADI Award winner
+Inviqa, winner of Webby Awards The Webby Awards winner
+Inviqa named one of Top 100 Agencies in Econsultancy Top 100 Digital Agencies
+Inviqa UXUK Awards winner UXUK Awards winner
+DADI Award winner of 'Best UX / Usability category' DADI Award winner
+Footer Main Navigation
- Footer Main Navigation
- * [62]Home
- * [63]Who we are
- * [64]What we do
- * [65]Case studies
- * [66]Careers
- * [67]Insights
- * [68]Contact
- * [69]Accessibility statement
+ • [65]Home
+ • [66]Who we are
+ • [67]What we do
+ • [68]Case studies
+ • [69]Careers
+ • [70]Insights
+ • [71]Contact
+ • [72]Accessibility statement
About us
- Together with your teams, we shape the digital products, teams,
- processes, and software systems you need to meet diverse customer needs
- and accelerate your business growth.
+Together with your teams, we shape the digital products, teams, processes, and
+software systems you need to meet diverse customer needs and accelerate your
+business growth.
- © 2007-2024, Inviqa UK Ltd. Registered No. 06278367. Registered Office:
- Havas House, Hermitage Court, Hermitage Lane, Maidstone, ME16 9NT, UK.
+© 2007-2024, Inviqa UK Ltd. Registered No. 06278367. Registered Office: Havas
+House, Hermitage Court, Hermitage Lane, Maidstone, ME16 9NT, UK.
- Footer Legal Links
- * [70]Covid-19
- * [71]Privacy policy
- * [72]Sitemap
+Footer Legal Links
-References
+ • [73]Covid-19
+ • [74]Privacy policy
+ • [75]Sitemap
- Visible links:
- 1. https://inviqa.com/blog/storing-graphs-database-sql-meets-social-network
- 2. https://www.googletagmanager.com/ns.html?id=GTM-NBN52P
- 3. https://inviqa.com/blog/storing-graphs-database-sql-meets-social-network#main-content
- 4. https://inviqa.com/
- 5. https://inviqa.com/who-we-are
- 6. https://inviqa.com/who-we-are
- 7. https://www.havas.com/
- 8. https://inviqa.com/digital-sustainability-journey
- 9. https://inviqa.com/what-we-do
- 10. https://inviqa.com/what-we-do/digital-strategy-consulting-and-development
- 11. https://inviqa.com/what-we-do/digital-roadmap-development
- 12. https://inviqa.com/what-we-do/digital-product-design
- 13. https://inviqa.com/what-we-do/user-research
- 14. https://inviqa.com/what-we-do/usability-testing
- 15. https://inviqa.com/what-we-do/technical-architecture-consulting-and-development
- 16. https://inviqa.com/what-we-do/digital-platform-consulting-and-implementation
- 17. https://inviqa.com/what-we-do/experience-optimisation
- 18. https://inviqa.com/what-we-do
- 19. https://inviqa.com/case-studies
- 20. https://inviqa.com/case-studies?category=b2b
- 21. https://inviqa.com/case-studies#fashion
- 22. https://inviqa.com/case-studies#charity
- 23. https://inviqa.com/case-studies?category=retail
- 24. https://inviqa.com/case-studies#leisure
- 25. https://inviqa.com/case-studies?category=travel
- 26. https://inviqa.com/case-studies
- 27. https://inviqa.com/partners
- 28. https://inviqa.com/akeneo-pim-consulting-and-implementation
- 29. https://inviqa.com/blog/bigcommerce-7-best-sites
- 30. https://inviqa.com/drupal-consulting-and-web-development
- 31. https://inviqa.com/magento-consulting-and-web-development
- 32. https://inviqa.com/blog/spryker-commerce-platform-introduction
- 33. https://inviqa.com/partners
- 34. https://careers.inviqa.com/
- 35. https://careers.inviqa.com/
- 36. https://careers.inviqa.com/jobs
- 37. https://inviqa.com/insights
- 38. https://inviqa.com/insights/dtc-ecommerce-report-2023
- 39. https://inviqa.com/insights/PIM-readiness-framework
- 40. https://inviqa.com/insights/retail-optimisation-guide-2023
- 41. https://inviqa.com/blog
- 42. https://inviqa.com/insights
- 43. https://inviqa.com/contact
- 44. https://inviqa.com/contact
- 45. https://inviqa.com/
- 46. https://inviqa.de/
- 47. https://inviqa.com/blog#Technology engineering
- 48. https://www.amazon.com/Joe-Celkos-SQL-Smarties-Programming/dp/0123693799/157-5667933-6571053?ie=UTF8&redirect=true&tag=postcarfrommy-20
- 49. https://en.wikipedia.org/wiki/Domain-key_normal_form
- 50. http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age
- 51. http://willets.org/sqlgraphs.html
- 52. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
- 53. http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/25/scalar-udfs-wrapped-in-check-constraints-are-very-slow-and-may-fail-for-multirow-updates.aspx
- 54. http://www.dbazine.com/oracle/or-articles/tropashko8/
- 55. https://en.wikipedia.org/wiki/Collaborative_filtering
- 56. https://en.wikipedia.org/wiki/Slope_One
- 57. http://www.slideshare.net/denisparra/evaluation-of-collaborative-filtering-algorithms-for-recommending-articles-on-citeulike
- 58. http://virtuoso.openlinksw.com/
- 59. http://www.openlinksw.com/weblog/oerling/?id=1433
- 60. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
- 61. https://en.wikipedia.org/wiki/Transitive_reduction
- 62. https://inviqa.com/we-craft-game-changing-digital-experiences
- 63. https://inviqa.com/who-we-are
- 64. https://inviqa.com/what-we-do
- 65. https://inviqa.com/case-studies
- 66. https://careers.inviqa.com/
- 67. https://inviqa.com/insights
- 68. https://inviqa.com/contact
- 69. https://inviqa.com/accessibility-statement
- 70. https://inviqa.com/covid-19-measures
- 71. https://inviqa.com/privacy-policy-UK
- 72. https://inviqa.com/sitemap
- Hidden links:
- 74. https://inviqa.com/blog/headless-commerce-everything-you-need-know
- 75. https://inviqa.com/blog/drupal-9-upgrade-config-split-issue-and-how-fix-it
+References:
+
+[1] https://inviqa.com/blog/storing-graphs-database-sql-meets-social-network#main-content
+[4] https://inviqa.com/
+[6] https://inviqa.com/who-we-are
+[7] https://inviqa.com/who-we-are
+[8] https://www.havas.com/
+[9] https://inviqa.com/digital-sustainability-journey
+[10] https://inviqa.com/what-we-do
+[11] https://inviqa.com/what-we-do/digital-strategy-consulting-and-development
+[12] https://inviqa.com/what-we-do/digital-roadmap-development
+[13] https://inviqa.com/what-we-do/digital-product-design
+[14] https://inviqa.com/what-we-do/user-research
+[15] https://inviqa.com/what-we-do/usability-testing
+[16] https://inviqa.com/what-we-do/technical-architecture-consulting-and-development
+[17] https://inviqa.com/what-we-do/digital-platform-consulting-and-implementation
+[18] https://inviqa.com/what-we-do/experience-optimisation
+[19] https://inviqa.com/what-we-do
+[20] https://inviqa.com/case-studies
+[21] https://inviqa.com/case-studies?category=b2b
+[22] https://inviqa.com/case-studies#fashion
+[23] https://inviqa.com/case-studies#charity
+[24] https://inviqa.com/case-studies?category=retail
+[25] https://inviqa.com/case-studies#leisure
+[26] https://inviqa.com/case-studies?category=travel
+[27] https://inviqa.com/case-studies
+[28] https://inviqa.com/partners
+[29] https://inviqa.com/akeneo-pim-consulting-and-implementation
+[30] https://inviqa.com/blog/bigcommerce-7-best-sites
+[31] https://inviqa.com/drupal-consulting-and-web-development
+[32] https://inviqa.com/magento-consulting-and-web-development
+[33] https://inviqa.com/blog/spryker-commerce-platform-introduction
+[34] https://inviqa.com/partners
+[35] https://careers.inviqa.com/
+[36] https://careers.inviqa.com/
+[37] https://careers.inviqa.com/jobs
+[38] https://inviqa.com/insights
+[39] https://inviqa.com/insights/dtc-ecommerce-report-2023
+[40] https://inviqa.com/insights/PIM-readiness-framework
+[41] https://inviqa.com/insights/retail-optimisation-guide-2023
+[42] https://inviqa.com/blog
+[43] https://inviqa.com/insights
+[44] https://inviqa.com/contact
+[45] https://inviqa.com/contact
+[46] https://inviqa.com/
+[47] https://inviqa.de/
+[48] https://inviqa.com/blog#Technology%20engineering
+[49] https://www.amazon.com/Joe-Celkos-SQL-Smarties-Programming/dp/0123693799/157-5667933-6571053?ie=UTF8&redirect=true&tag=postcarfrommy-20
+[50] https://en.wikipedia.org/wiki/Domain-key_normal_form
+[51] http://www.slideshare.net/quipo/rdbms-in-the-social-networks-age
+[52] http://willets.org/sqlgraphs.html
+[53] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
+[54] http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/25/scalar-udfs-wrapped-in-check-constraints-are-very-slow-and-may-fail-for-multirow-updates.aspx
+[55] http://www.dbazine.com/oracle/or-articles/tropashko8/
+[56] https://en.wikipedia.org/wiki/Collaborative_filtering
+[57] https://en.wikipedia.org/wiki/Slope_One
+[58] http://www.slideshare.net/denisparra/evaluation-of-collaborative-filtering-algorithms-for-recommending-articles-on-citeulike
+[59] http://virtuoso.openlinksw.com/
+[60] http://www.openlinksw.com/weblog/oerling/?id=1433
+[61] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.53
+[62] https://en.wikipedia.org/wiki/Transitive_reduction
+[63] https://inviqa.com/blog/headless-commerce-everything-you-need-know
+[64] https://inviqa.com/blog/drupal-9-upgrade-config-split-issue-and-how-fix-it
+[65] https://inviqa.com/we-craft-game-changing-digital-experiences
+[66] https://inviqa.com/who-we-are
+[67] https://inviqa.com/what-we-do
+[68] https://inviqa.com/case-studies
+[69] https://careers.inviqa.com/
+[70] https://inviqa.com/insights
+[71] https://inviqa.com/contact
+[72] https://inviqa.com/accessibility-statement
+[73] https://inviqa.com/covid-19-measures
+[74] https://inviqa.com/privacy-policy-UK
+[75] https://inviqa.com/sitemap
diff --git a/static/archive/jeffhuang-com-njdbjn.txt b/static/archive/jeffhuang-com-njdbjn.txt
index 7d750af..2dfeff2 100644
--- a/static/archive/jeffhuang-com-njdbjn.txt
+++ b/static/archive/jeffhuang-com-njdbjn.txt
@@ -1,291 +1,273 @@
- A Manifesto for Preserving Content on the Web
+A Manifesto for Preserving Content on the Web
This Page is Designed to Last
- By [1]Jeff Huang, published 2019-12-19, updated 2021-08-24
+By [1]Jeff Huang, published 2019-12-19, updated 2021-08-24
- The end of the year is an opportunity to clean up and reset for the
- upcoming new semester. I found myself clearing out old bookmarks—yes,
- bookmarks: that formerly beloved browser feature that seems to have
- lost the battle to 'address bar autocomplete'. But this nostalgic act
- of tidying led me to despair.
+The end of the year is an opportunity to clean up and reset for the upcoming
+new semester. I found myself clearing out old bookmarks—yes, bookmarks: that
+formerly beloved browser feature that seems to have lost the battle to 'address
+bar autocomplete'. But this nostalgic act of tidying led me to despair.
- Bookmark after bookmark led to dead link after dead link. What's
- vanished: unique pieces of writing on kuro5hin about tech culture; a
- collection of mathematical puzzles and their associated discussion by
- academics that my father introduced me to; Woodman's Reverse
- Engineering tutorials from my high school years, where I first tasted
- the feeling of control over software; even my most recent bookmark, a
- series of posts on Google+ exposing usb-c chargers' non-compliance with
- the specification, all disappeared.
+Bookmark after bookmark led to dead link after dead link. What's vanished:
+unique pieces of writing on kuro5hin about tech culture; a collection of
+mathematical puzzles and their associated discussion by academics that my
+father introduced me to; Woodman's Reverse Engineering tutorials from my high
+school years, where I first tasted the feeling of control over software; even
+my most recent bookmark, a series of posts on Google+ exposing usb-c chargers'
+non-compliance with the specification, all disappeared.
- This is more than just link rot, it's the increasing complexity of
- keeping alive indie content on the web, leading to a reliance on
- platforms and time-sorted publication formats (blogs, feeds, tweets).
+This is more than just link rot, it's the increasing complexity of keeping
+alive indie content on the web, leading to a reliance on platforms and
+time-sorted publication formats (blogs, feeds, tweets).
- Of course, I have also contributed to the problem. A paper I published
- 7 years ago has an abstract that includes a demo link, which has been
- taken over by a spammy page with a pumpkin picture on it. Part of that
- lapse was laziness to avoid having to renew and keep a functioning web
- application up year after year.
+Of course, I have also contributed to the problem. A paper I published 7 years
+ago has an abstract that includes a demo link, which has been taken over by a
+spammy page with a pumpkin picture on it. Part of that lapse was laziness to
+avoid having to renew and keep a functioning web application up year after
+year.
- I've recommended my students to push websites to Heroku, and publish
- portfolios on Wix. Yet every platform with irreplaceable content dies
- off some day. Geocities, LiveJournal, what.cd, now Yahoo Groups. One
- day, Medium, Twitter, and even hosting services like GitHub Pages will
- be plundered then discarded when they can no longer grow or cannot find
- a working business model.
+I've recommended my students to push websites to Heroku, and publish portfolios
+on Wix. Yet every platform with irreplaceable content dies off some day.
+Geocities, LiveJournal, what.cd, now Yahoo Groups. One day, Medium, Twitter,
+and even hosting services like GitHub Pages will be plundered then discarded
+when they can no longer grow or cannot find a working business model.
- The problem is multi-faceted. First, content takes effort to maintain.
- The content may need updating to remain relevant, and will eventually
- have to be rehosted. A lot of content, what used to be the vast
- majority of content, was put up by individuals. But individuals (maybe
- you?) lose interest, so one day maybe you just don't want to deal with
- migrating a website to a new hosting provider.
+The problem is multi-faceted. First, content takes effort to maintain. The
+content may need updating to remain relevant, and will eventually have to be
+rehosted. A lot of content, what used to be the vast majority of content, was
+put up by individuals. But individuals (maybe you?) lose interest, so one day
+maybe you just don't want to deal with migrating a website to a new hosting
+provider.
- Second, a growing set of libraries and frameworks are making the web
- more sophisticated but also more complex. First came jquery, then
- bootstrap, npm, angular, grunt, webpack, and more. If you are a web
- developer who is keeping up with the latest, then that's not a problem.
+Second, a growing set of libraries and frameworks are making the web more
+sophisticated but also more complex. First came jquery, then bootstrap, npm,
+angular, grunt, webpack, and more. If you are a web developer who is keeping up
+with the latest, then that's not a problem.
- But if not, maybe you are an embedded systems programmer or startup CTO
- or enterprise Java developer or chemistry PhD student, sure you could
- probably figure out how to set up some web server and toolchain, but
- will you keep this up year after year, decade after decade? Probably
- not, and when the next year when you encounter a package dependency
- problem or figure out how to regenerate your html files, you might just
- throw your hands up and zip up the files to deal with "later". Even
- simple technology stacks like static site generators (e.g., Jekyll)
- require a workflow and will stop working at some point. You fall into
- npm dependency hell, and forget the command to package a release. And
- having a website with multiple html pages is complex; how would you
- know how each page links to each other? index.html.old, Copy of
- about.html, index.html (1), nav.html?
+But if not, maybe you are an embedded systems programmer or startup CTO or
+enterprise Java developer or chemistry PhD student, sure you could probably
+figure out how to set up some web server and toolchain, but will you keep this
+up year after year, decade after decade? Probably not, and when the next year
+when you encounter a package dependency problem or figure out how to regenerate
+your html files, you might just throw your hands up and zip up the files to
+deal with "later". Even simple technology stacks like static site generators
+(e.g., Jekyll) require a workflow and will stop working at some point. You fall
+into npm dependency hell, and forget the command to package a release. And
+having a website with multiple html pages is complex; how would you know how
+each page links to each other? index.html.old, Copy of about.html, index.html
+(1), nav.html?
- Third, and this has been touted by others already (and even
- [2]rebutted), the disappearance of the public web in favor of mobile
- and web apps, walled gardens (Facebook pages), just-in-time WebSockets
- loading, and AMP decreases the proportion of the web on the world wide
- web, which now seems more like a continental web than a "world wide
- web".
+Third, and this has been touted by others already (and even [2]rebutted), the
+disappearance of the public web in favor of mobile and web apps, walled gardens
+(Facebook pages), just-in-time WebSockets loading, and AMP decreases the
+proportion of the web on the world wide web, which now seems more like a
+continental web than a "world wide web".
- So for these problems, what can we do about it? It's not such a simple
- problem that can be solved in this one article. The Wayback Machine and
- archive.org helps keep some content around for longer. And sometimes an
- altruistic individual rehosts the content elsewhere.
+So for these problems, what can we do about it? It's not such a simple problem
+that can be solved in this one article. The Wayback Machine and archive.org
+helps keep some content around for longer. And sometimes an altruistic
+individual rehosts the content elsewhere.
- But the solution needs to be multi-pronged. How do we make web content
- that can last and be maintained for at least 10 years? As someone
- studying human-computer interaction, I naturally think of the
- stakeholders we aren't supporting. Right now putting up web content is
- optimized for either the professional web developer (who use the latest
- frameworks and workflows) or the non-tech savvy user (who use a
- platform).
+But the solution needs to be multi-pronged. How do we make web content that can
+last and be maintained for at least 10 years? As someone studying
+human-computer interaction, I naturally think of the stakeholders we aren't
+supporting. Right now putting up web content is optimized for either the
+professional web developer (who use the latest frameworks and workflows) or the
+non-tech savvy user (who use a platform).
- But I think we should consider both 1) the casual web content
- "maintainer", someone who doesn't constantly stay up to date with the
- latest web technologies, which means the website needs to have low
- maintenance needs; 2) and the crawlers who preserve the content and
- [3]personal archivers, the "archiver", which means the website should
- be easy to save and interpret.
+But I think we should consider both 1) the casual web content "maintainer",
+someone who doesn't constantly stay up to date with the latest web
+technologies, which means the website needs to have low maintenance needs; 2)
+and the crawlers who preserve the content and [3]personal archivers, the
+"archiver", which means the website should be easy to save and interpret.
- So my proposal is seven unconventional guidelines in how we handle
- websites designed to be informative, to make them easy to maintain and
- preserve. The guiding intention is that the maintainer will try to keep
- the website up for at least 10 years, maybe even 20 or 30 years. These
- are not controversial views necessarily, but are aspirations that are
- not mainstream—a manifesto for a long-lasting website.
- 1. Return to vanilla HTML/CSS – I think we've reached the point where
- html/css is more powerful, and nicer to use than ever before.
- Instead of starting with a giant template filled with .js includes,
- it's now okay to just write plain HTML from scratch again. CSS
- Flexbox and Grid, canvas, Selectors, box-shadow, the video element,
- filter, etc. eliminate a lot of the need for JavaScript libraries.
- We can avoid jquery and bootstrap when they're not needed. The more
- libraries incorporated into the website, the more fragile it
- becomes. Skip the polyfills and CSS prefixes, and stick with the
- CSS attributes that work across all browsers. And frequently
- validate your HTML; it could save you a headache in the future when
- you encounter a bug.
- 2. Don't minimize that HTML – minimizing (compressing) your HTML and
- associated CSS/JS seems like it saves precious bandwidth and all
- the big companies are doing it. But why not? Well, you don't save
- much because your web pages should be gzipped before being sent
- over the network, so preemptively shrinking your content probably
- doesn't do much to save bandwidth if anything at all. But even if
- it did save a few bytes (it's just text in the end), you now need
- to have a build process and to add this to your workflow, so
- updating a website just became more complex. If there's a bug or
- future incompatibility in the html, the minimized form is harder to
- debug. And it's unfriendly to your users; so many people got their
- start with HTML by smashing that View Source button, and minimizing
- your HTML prevents this ideal of learning by seeing what they did.
- Minimizing HTML does not preserve its educational quality, and what
- gets archived is only the resulting codejunk.
- 3. Prefer one page over several – several pages are hard to maintain.
- You can lose track of which pages link to what, and it also leads
- to some system of page templates to reduce redundancy. How many
- pages can one person really maintain? Having one file, probably
- just an index.html, is simple and unforgettable. Make use of that
- infinite vertical scroll. You never have to dig around your files
- or grep to see where some content lies. And how should your version
- control that file? Should you use git? Shove them in an 'old/'
- folder? Well I like the simple approach of naming old files with
- the date they are retired, like index.20191213.html. Using the ISO
- format of the date makes it so that it sorts easily, and there's no
- confusion between American and European date formats. If I have
- multiple versions in one day, I would use a style similar to that
- which is customary in log files, of index.20191213.1.html. A nice
- side effect is then you can access an older version of the file if
- you remember the date, without logging into the web host.
- 4. End all forms of hotlinking – this cautionary word seems to have
- disappeared from internet vocabulary, but it's one of the reasons
- I've seen a perfectly good website fall apart for no reason. Stop
- directly including images from other websites, stop "borrowing"
- stylesheets by just linking to them, and especially stop linking to
- JavaScript files, even the ones hosted by the original developers.
- Hotlinking is [4]usually considered rude since your visitors use
- someone else's bandwidth, it makes the user experience slower, you
- let another website track your users, and worse of all if the
- location you're linking to changes their folder structure or just
- goes offline, then the failure cascades to your website as well.
- Google Analytics is unnecessary; store your own server logs and set
- up [5]GoAccess or cut them up however you like, giving you more
- detailed statistics. Don't give away your logs to Google for free.
- 5. Stick with native fonts – we're focusing on content first, so
- decorative and unusual typefaces are completely unnecessary. Stick
- with either the 13 web-safe fonts or a [6]system font stack that
- matches the default font to the operating system of your visitor.
- Using the system font stack might look a bit different between
- operating systems, but your layout shouldn't be so brittle that an
- extra word wrap will ruin it. Then you don't have to worry about
- the flashing font problem either. Your focus should be about
- delivering the content to the user effectively and making the
- choice of font be invisible, rather than getting noticed to stroke
- your design ego.
- 6. Obsessively compress your images – faster for your users, less
- space to archive, and easier to maintain when you don't have to
- back up a humongous folder. Your images can have the same high
- quality, but be smaller. [7]Minify your SVGs, losslessly compress
- your PNGs, generate JPEGs to exactly fit the width of the image.
- It's worth spending some time figuring out the most optimal way to
- compress and [8]reduce the size of your images without losing
- quality. And once [9]WebP gains support on Safari, switch over to
- that format. Ruthlessly minimize the total size of your website and
- keep it as small as possible. Every MB can cost someone real money,
- and in fact, my mobile carrier (Google Fi) charges a cent per MB,
- so a 25 MB website which is fairly common nowadays, costs a quarter
- itself, about as much as a newspaper when I was a child.
- 7. Eliminate the broken URL risk – there are [10]monitoring services
- that will tell you when your URL is down, preventing you from
- realizing one day that your homepage hasn't been loading for a
- month and the search engines have deindexed it. Because 10 years is
- longer than most hard drives or operating systems are meant to
- last. But to eliminate the risk of a URL breaking completely, set
- up a second monitoring service. Because if the first one stops for
- any reason (they move to a pay model, they shut down, you forget to
- renew something, etc.) you will still get one notification when
- your URL is down, then realize the other monitoring service is down
- because you didn't get the second notification. Remember that we're
- trying to keep something up for over 10 years (ideally way longer,
- even 30 years), and a lot of services will shut down during this
- period, so two monitoring services is safer.
+So my proposal is seven unconventional guidelines in how we handle websites
+designed to be informative, to make them easy to maintain and preserve. The
+guiding intention is that the maintainer will try to keep the website up for at
+least 10 years, maybe even 20 or 30 years. These are not controversial views
+necessarily, but are aspirations that are not mainstream—a manifesto for a
+long-lasting website.
- After doing these things, go ahead and place a bit of text in the
- footer, "The page was designed to last", linking to this page
- explaining what that means. The words promise that the maintainer will
- do their best to follow the ideas in this manifesto.
+ 1. Return to vanilla HTML/CSS – I think we've reached the point where html/css
+ is more powerful, and nicer to use than ever before. Instead of starting
+ with a giant template filled with .js includes, it's now okay to just write
+ plain HTML from scratch again. CSS Flexbox and Grid, canvas, Selectors,
+ box-shadow, the video element, filter, etc. eliminate a lot of the need for
+ JavaScript libraries. We can avoid jquery and bootstrap when they're not
+ needed. The more libraries incorporated into the website, the more fragile
+ it becomes. Skip the polyfills and CSS prefixes, and stick with the CSS
+ attributes that work across all browsers. And frequently validate your
+ HTML; it could save you a headache in the future when you encounter a bug.
+ 2. Don't minimize that HTML – minimizing (compressing) your HTML and
+ associated CSS/JS seems like it saves precious bandwidth and all the big
+ companies are doing it. But why not? Well, you don't save much because your
+ web pages should be gzipped before being sent over the network, so
+ preemptively shrinking your content probably doesn't do much to save
+ bandwidth if anything at all. But even if it did save a few bytes (it's
+ just text in the end), you now need to have a build process and to add this
+ to your workflow, so updating a website just became more complex. If
+ there's a bug or future incompatibility in the html, the minimized form is
+ harder to debug. And it's unfriendly to your users; so many people got
+ their start with HTML by smashing that View Source button, and minimizing
+ your HTML prevents this ideal of learning by seeing what they did.
+ Minimizing HTML does not preserve its educational quality, and what gets
+ archived is only the resulting codejunk.
+ 3. Prefer one page over several – several pages are hard to maintain. You can
+ lose track of which pages link to what, and it also leads to some system of
+ page templates to reduce redundancy. How many pages can one person really
+ maintain? Having one file, probably just an index.html, is simple and
+ unforgettable. Make use of that infinite vertical scroll. You never have to
+ dig around your files or grep to see where some content lies. And how
+ should your version control that file? Should you use git? Shove them in an
+ 'old/' folder? Well I like the simple approach of naming old files with the
+ date they are retired, like index.20191213.html. Using the ISO format of
+ the date makes it so that it sorts easily, and there's no confusion between
+ American and European date formats. If I have multiple versions in one day,
+ I would use a style similar to that which is customary in log files, of
+ index.20191213.1.html. A nice side effect is then you can access an older
+ version of the file if you remember the date, without logging into the web
+ host.
+ 4. End all forms of hotlinking – this cautionary word seems to have
+ disappeared from internet vocabulary, but it's one of the reasons I've seen
+ a perfectly good website fall apart for no reason. Stop directly including
+ images from other websites, stop "borrowing" stylesheets by just linking to
+ them, and especially stop linking to JavaScript files, even the ones hosted
+ by the original developers. Hotlinking is [4]usually considered rude since
+ your visitors use someone else's bandwidth, it makes the user experience
+ slower, you let another website track your users, and worse of all if the
+ location you're linking to changes their folder structure or just goes
+ offline, then the failure cascades to your website as well. Google
+ Analytics is unnecessary; store your own server logs and set up [5]GoAccess
+ or cut them up however you like, giving you more detailed statistics. Don't
+ give away your logs to Google for free.
+ 5. Stick with native fonts – we're focusing on content first, so decorative
+ and unusual typefaces are completely unnecessary. Stick with either the 13
+ web-safe fonts or a [6]system font stack that matches the default font to
+ the operating system of your visitor. Using the system font stack might
+ look a bit different between operating systems, but your layout shouldn't
+ be so brittle that an extra word wrap will ruin it. Then you don't have to
+ worry about the flashing font problem either. Your focus should be about
+ delivering the content to the user effectively and making the choice of
+ font be invisible, rather than getting noticed to stroke your design ego.
+ 6. Obsessively compress your images – faster for your users, less space to
+ archive, and easier to maintain when you don't have to back up a humongous
+ folder. Your images can have the same high quality, but be smaller. [7]
+ Minify your SVGs, losslessly compress your PNGs, generate JPEGs to exactly
+ fit the width of the image. It's worth spending some time figuring out the
+ most optimal way to compress and [8]reduce the size of your images without
+ losing quality. And once [9]WebP gains support on Safari, switch over to
+ that format. Ruthlessly minimize the total size of your website and keep it
+ as small as possible. Every MB can cost someone real money, and in fact, my
+ mobile carrier (Google Fi) charges a cent per MB, so a 25 MB website which
+ is fairly common nowadays, costs a quarter itself, about as much as a
+ newspaper when I was a child.
+ 7. Eliminate the broken URL risk – there are [10]monitoring services that will
+ tell you when your URL is down, preventing you from realizing one day that
+ your homepage hasn't been loading for a month and the search engines have
+ deindexed it. Because 10 years is longer than most hard drives or operating
+ systems are meant to last. But to eliminate the risk of a URL breaking
+ completely, set up a second monitoring service. Because if the first one
+ stops for any reason (they move to a pay model, they shut down, you forget
+ to renew something, etc.) you will still get one notification when your URL
+ is down, then realize the other monitoring service is down because you
+ didn't get the second notification. Remember that we're trying to keep
+ something up for over 10 years (ideally way longer, even 30 years), and a
+ lot of services will shut down during this period, so two monitoring
+ services is safer.
- Before you protest, this is obviously not for web applications. If you
- are making an application, then make your web or mobile app with the
- workflow you need. I don't even know any web applications that have
- remained similarly functioning over 10 years so it seems like a lost
- cause anyway (except Philip Guo's python tutor, due to his
- [11]minimalist strategy for maintaining it). It's also not for websites
- maintained by an organization like Wikipedia or Twitter. The salaries
- for an IT team is probably enough to keep a website alive for a while.
+After doing these things, go ahead and place a bit of text in the footer, "The
+page was designed to last", linking to this page explaining what that means.
+The words promise that the maintainer will do their best to follow the ideas in
+this manifesto.
- In fact, it's not even that important you strictly follow the 7
- "rules", as they're more of a provocation than strict rules.
+Before you protest, this is obviously not for web applications. If you are
+making an application, then make your web or mobile app with the workflow you
+need. I don't even know any web applications that have remained similarly
+functioning over 10 years so it seems like a lost cause anyway (except Philip
+Guo's python tutor, due to his [11]minimalist strategy for maintaining it).
+It's also not for websites maintained by an organization like Wikipedia or
+Twitter. The salaries for an IT team is probably enough to keep a website alive
+for a while.
- But let's say some small part of the web starts designing websites to
- last for content that is meant to last. What happens then? Well, people
- may prefer to link to them since they have a promise of working in the
- future. People more generally may be more mindful of making their pages
- more permanent. And users and archivers both save bandwidth when
- visiting and storing these pages.
+In fact, it's not even that important you strictly follow the 7 "rules", as
+they're more of a provocation than strict rules.
- The effects are long term, but the achievements are incremental and can
- be implemented by website owners without being dependent on anyone else
- or waiting for a network effect. You can do this now for your website,
- and that already would be a positive outcome. Like using a recycled
- shopping bag instead of a taking a plastic one, it's a small individual
- action.
+But let's say some small part of the web starts designing websites to last for
+content that is meant to last. What happens then? Well, people may prefer to
+link to them since they have a promise of working in the future. People more
+generally may be more mindful of making their pages more permanent. And users
+and archivers both save bandwidth when visiting and storing these pages.
- This article is meant to provoke and lead to individual action, not
- propose a complete solution to the decaying web. It's a small simple
- step for a complex sociotechnical system. So I'd love to see this
- happen. I intend to keep this page up for at least 10 years.
+The effects are long term, but the achievements are incremental and can be
+implemented by website owners without being dependent on anyone else or waiting
+for a network effect. You can do this now for your website, and that already
+would be a positive outcome. Like using a recycled shopping bag instead of a
+taking a plastic one, it's a small individual action.
- If you are interested in receiving updates to [12]irchiver, our project
- for a personal archive of the web pages you visit, please [13]subscribe
- here.
+This article is meant to provoke and lead to individual action, not propose a
+complete solution to the decaying web. It's a small simple step for a complex
+sociotechnical system. So I'd love to see this happen. I intend to keep this
+page up for at least 10 years.
- Thanks to my Ph.D. students Shaun Wallace, Nediyana Daskalova, Talie
- Massachi, Alexandra Papoutsaki, my colleagues James Tompkin, Stephen
- Bach, my teaching assistant Kathleen Chai, and my research assistant
- Yusuf Karim for feedback on earlier drafts.
+If you are interested in receiving updates to [12]irchiver, our project for a
+personal archive of the web pages you visit, please [13]subscribe here.
- See discussions on [14]Hacker News and [15]reddit /r/programming
+Thanks to my Ph.D. students Shaun Wallace, Nediyana Daskalova, Talie Massachi,
+Alexandra Papoutsaki, my colleagues James Tompkin, Stephen Bach, my teaching
+assistant Kathleen Chai, and my research assistant Yusuf Karim for feedback on
+earlier drafts.
+
+See discussions on [14]Hacker News and [15]reddit /r/programming
Also in this series
- [16]Behind the scenes: the struggle for each paper to get published
+[16]Behind the scenes: the struggle for each paper to get published
- [17]Illustrative notes for obsessing over publishing aesthetics
+[17]Illustrative notes for obsessing over publishing aesthetics
Other articles I've written
- [18]My productivity app is a never-ending .txt file
+[18]My productivity app is a never-ending .txt file
- [19]The Coronavirus pandemic has changed our sleep behavior
+[19]The Coronavirus pandemic has changed our sleep behavior
- [20]Extracting data from tracking devices by going to the cloud
+[20]Extracting data from tracking devices by going to the cloud
- [21]CS Faculty Composition and Hiring Trends
+[21]CS Faculty Composition and Hiring Trends
- [22]Bias in Computer Science Rankings
+[22]Bias in Computer Science Rankings
- [23]Who Wins CS Best Paper Awards?
+[23]Who Wins CS Best Paper Awards?
- [24]Verified Computer Science Ph.D. Stipends
+[24]Verified Computer Science Ph.D. Stipends
- This page is [25]designed to last.
+This page is [25]designed to last.
-References
+References:
- 1. https://jeffhuang.com/
- 2. https://gomakethings.com/the-web-is-not-dying/
- 3. https://archivebox.io/
- 4. https://webmasters.stackexchange.com/questions/25315/hotlinking-what-is-it-and-why-shouldnt-people-do-it
- 5. https://goaccess.io/
- 6. https://systemfontstack.com/
- 7. https://victorzhou.com/blog/minify-svgs/
- 8. https://evilmartians.com/chronicles/images-done-right-web-graphics-good-to-the-last-byte-optimization-techniques
- 9. https://caniuse.com/#feat=webp
- 10. https://uptimerobot.com/
- 11. https://pg.ucsd.edu/publications/Python-Tutor-scalable-sustainable-research-software_UIST-2021.pdf
- 12. https://irchiver.com/
- 13. https://docs.google.com/forms/d/e/1FAIpQLSeTCgnwF1gjrc1O8mfJ_5TmT_TLowFQ2DUhsollmqPG84pAFQ/viewform?usp=pp_url&entry.1299571007=irchiver:+your+full-resolution+personal+web+archive+and+search&entry.1760653896=designed_to_last
- 14. https://news.ycombinator.com/item?id=21840140
- 15. https://www.reddit.com/r/programming/comments/ed88ra/this_page_is_designed_to_last_a_manifesto_for/
- 16. https://jeffhuang.com/struggle_for_each_paper/
- 17. https://jeffhuang.com/illustrative-notes-for-publishing-aesthetics/
- 18. https://jeffhuang.com/productivity_text_file/
- 19. https://jeffhuang.com/covid_sleep/
- 20. https://jeffhuang.com/extracting_data_from_tracking_devices/
- 21. https://jeffhuang.com/computer-science-open-data/#cs-faculty-composition-and-hiring-trends
- 22. https://jeffhuang.com/computer-science-open-data/#bias-in-computer-science-rankings
- 23. https://jeffhuang.com/computer-science-open-data/#who-wins-cs-best-paper-awards
- 24. https://jeffhuang.com/computer-science-open-data/#verified-computer-science-phd-stipends
- 25. http://jeffhuang.com/designed_to_last/
+[1] https://jeffhuang.com/
+[2] https://gomakethings.com/the-web-is-not-dying/
+[3] https://archivebox.io/
+[4] https://webmasters.stackexchange.com/questions/25315/hotlinking-what-is-it-and-why-shouldnt-people-do-it
+[5] https://goaccess.io/
+[6] https://systemfontstack.com/
+[7] https://victorzhou.com/blog/minify-svgs/
+[8] https://evilmartians.com/chronicles/images-done-right-web-graphics-good-to-the-last-byte-optimization-techniques
+[9] https://caniuse.com/#feat=webp
+[10] https://uptimerobot.com/
+[11] https://pg.ucsd.edu/publications/Python-Tutor-scalable-sustainable-research-software_UIST-2021.pdf
+[12] https://irchiver.com/
+[13] https://docs.google.com/forms/d/e/1FAIpQLSeTCgnwF1gjrc1O8mfJ_5TmT_TLowFQ2DUhsollmqPG84pAFQ/viewform?usp=pp_url&entry.1299571007=irchiver:+your+full-resolution+personal+web+archive+and+search&entry.1760653896=designed_to_last
+[14] https://news.ycombinator.com/item?id=21840140
+[15] https://www.reddit.com/r/programming/comments/ed88ra/this_page_is_designed_to_last_a_manifesto_for/
+[16] https://jeffhuang.com/struggle_for_each_paper/
+[17] https://jeffhuang.com/illustrative-notes-for-publishing-aesthetics/
+[18] https://jeffhuang.com/productivity_text_file/
+[19] https://jeffhuang.com/covid_sleep/
+[20] https://jeffhuang.com/extracting_data_from_tracking_devices/
+[21] https://jeffhuang.com/computer-science-open-data/#cs-faculty-composition-and-hiring-trends
+[22] https://jeffhuang.com/computer-science-open-data/#bias-in-computer-science-rankings
+[23] https://jeffhuang.com/computer-science-open-data/#who-wins-cs-best-paper-awards
+[24] https://jeffhuang.com/computer-science-open-data/#verified-computer-science-phd-stipends
+[25] http://jeffhuang.com/designed_to_last/
diff --git a/static/archive/josem-co-8ssbyq.txt b/static/archive/josem-co-8ssbyq.txt
index 0d6d49d..d4c4239 100644
--- a/static/archive/josem-co-8ssbyq.txt
+++ b/static/archive/josem-co-8ssbyq.txt
@@ -1,133 +1,126 @@
- #[1]alternate
+[1]
- * [2]Home
- * [3]Articles
- * [4]Subscribe
- * [5]Work
- * [6]About
- * (BUTTON)
+ • [2]Home
+ • [3]Articles
+ • [4]Subscribe
+ • [5]Work
+ • [6]About
+ •
- The beauty of finished software
+The beauty of finished software
- October 31, 2023
+October 31, 2023
- Let me introduce you to [7]WordStar 4.0, a popular word processor from
- the early 80s.
+Let me introduce you to [8]WordStar 4.0, a popular word processor from the
+early 80s.
- Wordstar 4.0 WordStar 4.0
+Wordstar 4.0 WordStar 4.0
- As old as it seems, George R.R. Martin used it to write “A Song of Ice
- and Fire”.
+As old as it seems, George R.R. Martin used it to write “A Song of Ice and
+Fire”.
- Why would someone use such an old piece of software to write over 5,000
- pages? I love how he puts it:
+Why would someone use such an old piece of software to write over 5,000 pages?
+I love how he puts it:
- It does everything I want a word processing program to do and it
- doesn't do anything else. I don't want any help. I hate some of
- these modern systems where you type up a lowercase letter and it
- becomes a capital. I don't want a capital, if I'd wanted a capital,
- I would have typed the capital.[8]George R.R. Martin
+ It does everything I want a word processing program to do and it doesn't do
+ anything else. I don't want any help. I hate some of these modern systems
+ where you type up a lowercase letter and it becomes a capital. I don't want
+ a capital, if I'd wanted a capital, I would have typed the capital.[9]
+ George R.R. Martin
- This program embodies the concept of finished software — a software you
- can use forever with no unneeded changes.
+This program embodies the concept of finished software — a software you can use
+forever with no unneeded changes.
- Finished software is software that’s not expected to change, and that’s
- a feature! You can rely on it to do some real work.
+Finished software is software that’s not expected to change, and that’s a
+feature! You can rely on it to do some real work.
- Once you get used to the software, once the software works for you, you
- don’t need to learn anything new; the interface will exactly be the
- same, and all your files will stay relevant. No migrations, no new
- payments, no new changes.
+Once you get used to the software, once the software works for you, you don’t
+need to learn anything new; the interface will exactly be the same, and all
+your files will stay relevant. No migrations, no new payments, no new changes.
- This kind of software can be created intentionally, with a compromise
- from the creators that they won’t bother you with things you don’t
- need, and only the absolutely necessary will change, like minor updates
- to make it compatible with new operating systems.
+This kind of software can be created intentionally, with a compromise from the
+creators that they won’t bother you with things you don’t need, and only the
+absolutely necessary will change, like minor updates to make it compatible with
+new operating systems.
- Sometimes, finished software happens accidentally; maybe the company
- behind it has disappeared, or the product has been abandoned.
+Sometimes, finished software happens accidentally; maybe the company behind it
+has disappeared, or the product has been abandoned.
- There are also some great examples in the UNIX world of finished
- software: commands like cd(to change the current directory) or ls(to
- list what’s there) won’t ever change in a significant way. You can rely
- on them until the end of your career.
+There are also some great examples in the UNIX world of finished software:
+commands like cd(to change the current directory) or ls(to list what’s there)
+won’t ever change in a significant way. You can rely on them until the end of
+your career.
The seduction of constant updates
- Our expectations for software are different from other products we use
- in our daily lives.
+Our expectations for software are different from other products we use in our
+daily lives.
- When we buy a physical product, we accept that it won’t change in its
- lifetime. We’ll use it until it wears off, and we replace it. We can
- rely on that product not evolving; the gas pedal in my car will always
- be in the same place.
+When we buy a physical product, we accept that it won’t change in its lifetime.
+We’ll use it until it wears off, and we replace it. We can rely on that product
+not evolving; the gas pedal in my car will always be in the same place.
- However, when it comes to software, we usually have the ingrained
- expectations of perpetual updates. We believe that if software doesn’t
- evolve it’ll be boring, old and unusable. If we see an app with no
- updates in the last year, we think the creator might be dead.
+However, when it comes to software, we usually have the ingrained expectations
+of perpetual updates. We believe that if software doesn’t evolve it’ll be
+boring, old and unusable. If we see an app with no updates in the last year, we
+think the creator might be dead.
- We also expect new versions of any software will be better than the
- previous ones. Once it’s released, most of our problems will be solved!
- What a deceiving lie.
+We also expect new versions of any software will be better than the previous
+ones. Once it’s released, most of our problems will be solved! What a deceiving
+lie.
- Sometimes, a software upgrade is a step backward: less usable, less
- stable, with new bugs. Even if it’s genuinely better, there’s the
- learning curve. You were efficient with the old version, but now your
- most used button is on the other side of the screen under a hidden
- menu.
+Sometimes, a software upgrade is a step backward: less usable, less stable,
+with new bugs. Even if it’s genuinely better, there’s the learning curve. You
+were efficient with the old version, but now your most used button is on the
+other side of the screen under a hidden menu.
Finished software is a good reminder
- In a world where constant change is the norm, finished software
- provides a breath of fresh air. It’s a reminder that reliability,
- consistency, and user satisfaction can coexist in the realm of software
- development.
+In a world where constant change is the norm, finished software provides a
+breath of fresh air. It’s a reminder that reliability, consistency, and user
+satisfaction can coexist in the realm of software development.
- So the next time you find yourself yearning for the latest update,
- remember that sometimes, the best software is the one that doesn’t
- change at all.
- __________________________________________________________________
+So the next time you find yourself yearning for the latest update, remember
+that sometimes, the best software is the one that doesn’t change at all.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
References
- [1] George R.R. Martin in Conan show (2014).
- [9]https://www.youtube.com/watch?v=X5REM-3nWHg.
+[1] George R.R. Martin in Conan show (2014). [10]https://www.youtube.com/watch?
+v=X5REM-3nWHg.
- Subscribe below to get future posts in your inbox (no spam)
- ____________________
- ____________________
- Subscribe
+Subscribe below to get future posts in your inbox (no spam)
- Or use the [10]RSS feed link.
- __________________________________________________________________
+[11][ ]
+[12][ ]
+[13][Subscribe]
+Or use the [14]RSS feed link.
- This site is ads-free and done in my free time. [11]Buy Me A Coffee to
- help me keep working on it.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- © 2023 [12]Home | [13]Mastodon | [14]Twitter | [15]RSS feed | [16]Buy
- Me A Coffee
+This site is ads-free and done in my free time. [15]Buy Me A Coffee to help me
+keep working on it.
-References
+© 2023 [16]Home | [17]Mastodon | [18]Twitter | [19]RSS feed | [20]Buy Me A
+Coffee[21]
- Visible links:
- 1. https://josem.co//articles/index.xml
- 2. https://josem.co/
- 3. https://josem.co/articles/
- 4. https://josem.co/subscribe/
- 5. https://josem.co/work/
- 6. https://josem.co/about/
- 7. https://en.wikipedia.org/wiki/WordStar
- 8. https://josem.co/the-beauty-of-finished-software/#rf1
- 9. https://www.youtube.com/watch?v=X5REM-3nWHg
- 10. https://josem.co/articles/index.xml
- 11. https://www.buymeacoffee.com/josem.co
- 12. https://josem.co/
- 13. https://mstdn.social/@josem
- 14. https://twitter.com/gilgado_
- 15. https://josem.co/articles/index.xml
- 16. https://www.buymeacoffee.com/josem.co
+References:
- Hidden links:
- 18. https://josem.co/
- 19. https://josem.co/the-beauty-of-finished-software/#top
+[1] https://josem.co/
+[2] https://josem.co/
+[3] https://josem.co/articles/
+[4] https://josem.co/subscribe/
+[5] https://josem.co/work/
+[6] https://josem.co/about/
+[8] https://en.wikipedia.org/wiki/WordStar
+[9] https://josem.co/the-beauty-of-finished-software/#rf1
+[10] https://www.youtube.com/watch?v=X5REM-3nWHg
+[14] https://josem.co/articles/index.xml
+[15] https://www.buymeacoffee.com/josem.co
+[16] https://josem.co/
+[17] https://mstdn.social/@josem
+[18] https://twitter.com/gilgado_
+[19] https://josem.co/articles/index.xml
+[20] https://www.buymeacoffee.com/josem.co
+[21] https://josem.co/the-beauty-of-finished-software/#top
diff --git a/static/archive/leancrew-com-7l5uqs.txt b/static/archive/leancrew-com-7l5uqs.txt
index 55220f0..d78473c 100644
--- a/static/archive/leancrew-com-7l5uqs.txt
+++ b/static/archive/leancrew-com-7l5uqs.txt
@@ -1,42 +1,39 @@
- #[1]RSS Feed for ANIAT [2]JSON Feed for ANIAT
+[snowman-20]
- [snowman-200.jpg]
-
-[3]And now it’s all this
+[1]And now it’s all this
I just said what I said and it was wrong
Or was taken wrong
- [4]Next post [5]Previous post
+[2]Next post [3]Previous post
-[6]Tidying Markdown reference links
+[4]Tidying Markdown reference links
- September 17, 2012 at 9:15 PM by Dr. Drang
+September 17, 2012 at 9:15 PM by Dr. Drang
- Oscar Wilde—who would have been great on Twitter—[7]said “I couldn’t
- help it. I can resist everything except temptation.” That’s my excuse
- for this post.
+Oscar Wilde—who would have been great on Twitter—[5]said “I couldn’t help it. I
+can resist everything except temptation.” That’s my excuse for this post.
- Several days ago I got an email from a reader, asking if I knew of a
- script that would tidy up [8]Markdown reference links in a document.
- She wanted them reordered and renumbered at the end of the document to
- match the order in which they appear in the body of the text. I didn’t
- know of one^[9]1 and suggested she write it herself and let me know
- when it’s done. I’ve been getting progress reports, but her script
- isn’t finished yet.
+Several days ago I got an email from a reader, asking if I knew of a script
+that would tidy up [6]Markdown reference links in a document. She wanted them
+reordered and renumbered at the end of the document to match the order in which
+they appear in the body of the text. I didn’t know of one^[7]1 and suggested
+she write it herself and let me know when it’s done. I’ve been getting progress
+reports, but her script isn’t finished yet.
- There’s certainly no need to tidy the links up that way. Markdown
- doesn’t care what order the reference links appear in or the labels
- that are assigned to them. I’ve written dozens of posts in which the
- order of the references at the end of the Markdown source were way off
- from the order of the links in body. But…
+There’s certainly no need to tidy the links up that way. Markdown doesn’t care
+what order the reference links appear in or the labels that are assigned to
+them. I’ve written dozens of posts in which the order of the references at the
+end of the Markdown source were way off from the order of the links in body.
+But…
- But there is an attraction to putting everything in apple pie order,
- even when no one but me will ever see it. Last night I succumbed and
- wrote a script to tidy up the links. Sorry, Phaedra.
+But there is an attraction to putting everything in apple pie order, even when
+no one but me will ever see it. Last night I succumbed and wrote a script to
+tidy up the links. Sorry, Phaedra.
+
+Here’s an example of a short Markdown document with out-of-order reference
+links:
- Here’s an example of a short Markdown document with out-of-order
- reference links:
Species and their hybrids, How simply are these facts! How
strange that the pollen of each But we may thus have
[succeeded][2] in selecting so many exceptions to this rule.
@@ -64,9 +61,10 @@ selection may be extended--to the stigma of.
[3]: http://docs.python.org/library/index.html
[4]: http://www.kungfugrippe.com/
- Note that the references are numbered 1, 2, 3, 4 at the bottom of the
- document, but that they appear in the body in the order 2, 4, 3, 1. The
- purpose of the script is to change the document to
+Note that the references are numbered 1, 2, 3, 4 at the bottom of the document,
+but that they appear in the body in the order 2, 4, 3, 1. The purpose of the
+script is to change the document to
+
Species and their hybrids, How simply are these facts! How
strange that the pollen of each But we may thus have
[succeeded][1] in selecting so many exceptions to this rule.
@@ -95,12 +93,13 @@ selection may be extended--to the stigma of.
[3]: http://www.kungfugrippe.com/
[4]: http://daringfireball.net/markdown/
- Now the links are numbered 1, 2, 3, 4 in both the text and the end
- references. The HTML produced when this document is run through a
- Markdown processor will be the same as the previous one—the links will
- still go to the right places—but the Markdown source looks better.
+Now the links are numbered 1, 2, 3, 4 in both the text and the end references.
+The HTML produced when this document is run through a Markdown processor will
+be the same as the previous one—the links will still go to the right places—but
+the Markdown source looks better.
+
+Here’s the script that does it:
- Here’s the script that does it:
python:
1: #!/usr/bin/python
2:
@@ -137,8 +136,7 @@ python:
33: order.append(i[1])
34:
35: # Make a list of the references in order of appearance.
-36: newlabels = [ '[%d]: %s' % (i + 1, labels[j]) for (i, j) in enumerate(order
-) ]
+36: newlabels = [ '[%d]: %s' % (i + 1, labels[j]) for (i, j) in enumerate(order) ]
37:
38: # Remove the old references and put the new ones at the end of the text.
39: text = label.sub('', text).rstrip() + '\n'*3 + '\n'.join(newlabels)
@@ -148,139 +146,135 @@ python:
43:
44: print text
- The regular expressions in Lines 13 and 17 are fairly easy to
- understand. The first one looks for the links in the body of the text
- and the second looks for the labels.
+The regular expressions in Lines 13 and 17 are fairly easy to understand. The
+first one looks for the links in the body of the text and the second looks for
+the labels.
+
+The key to the script are the four data structures: links, labels, order, and
+newlabels. For our example document, links is the list of tuples
- The key to the script are the four data structures: links, labels,
- order, and newlabels. For our example document, links is the list of
- tuples
[('succeeded', '2'),
('single character', '4'),
('under confinement', '3'),
('slaves', '1')]
- labels is the dictionary
+labels is the dictionary
+
{'1': 'http://daringfireball.net/markdown/',
'3': 'http://docs.python.org/library/index.html',
'2': 'http://www.google.com/',
'4': 'http://www.kungfugrippe.com/'}
- order is the list
+order is the list
+
['2', '4', '3', '1']
- and newlabels is the list of strings
+and newlabels is the list of strings
+
['[1]: http://www.google.com/',
'[2]: http://docs.python.org/library/index.html',
'[3]: http://www.kungfugrippe.com/',
'[4]: http://daringfireball.net/markdown/']
- links and labels are built via the regex findall method in Lines 25-26.
- links is the direct output of the method and maintains the order in
- which the links appear in the text. labels is that same output, but
- converted to a dictionary. Its order, which we don’t care about, is
- lost in the conversion, but it can be used to easily access the URL
- from the link label.
+links and labels are built via the regex findall method in Lines 25-26. links
+is the direct output of the method and maintains the order in which the links
+appear in the text. labels is that same output, but converted to a dictionary.
+Its order, which we don’t care about, is lost in the conversion, but it can be
+used to easily access the URL from the link label.
- order is the order in which the link labels first appear in the text.
- The if statement in Line 32 ensures that repeated links don’t overwrite
- each other.
+order is the order in which the link labels first appear in the text. The if
+statement in Line 32 ensures that repeated links don’t overwrite each other.
- newlabels is built from labels and order in Line 36. It’s the list of
- labels after the renumbering. Line 39 deletes the original label lines
- and puts the new ones at the end of the document.
+newlabels is built from labels and order in Line 36. It’s the list of labels
+after the renumbering. Line 39 deletes the original label lines and puts the
+new ones at the end of the document.
- Finally, Line 42 replaces all the link labels in the body of the text
- with the new values. Rather than a replacement string, it uses a simple
- replacement function defined in Lines 19-21 to do so.
+Finally, Line 42 replaces all the link labels in the body of the text with the
+new values. Rather than a replacement string, it uses a simple replacement
+function defined in Lines 19-21 to do so.
- Barring any bugs I haven’t found yet, this script (or filter) will work
- on any Markdown document and can be used either directly from the
- command line or through whatever system your text editor uses to call
- external scripts. I have it stored in BBEdit’s Text Filters folder
- under the name “Tidy Markdown Reference Links.py,” so I can call it
- from the Text ‣ Apply Text Filter submenu.
+Barring any bugs I haven’t found yet, this script (or filter) will work on any
+Markdown document and can be used either directly from the command line or
+through whatever system your text editor uses to call external scripts. I have
+it stored in BBEdit’s Text Filters folder under the name “Tidy Markdown
+Reference Links.py,” so I can call it from the Text ‣ Apply Text Filter
+submenu.
- I should mention that although this script is fairly compact and
- simple, it didn’t spring from my head fully formed. There were starts
- and stops as I figured out which data structures were needed and how
- they could be built. Each little subsection of the script was tested as
- I went along. The order list was originally a list of tuples; it wasn’t
- until I had a working version of the entire script that I realized that
- it could be simplified down to a list of link labels. That change
- shortened the script by five lines or so and, more importantly,
- clarified its logic.
+I should mention that although this script is fairly compact and simple, it
+didn’t spring from my head fully formed. There were starts and stops as I
+figured out which data structures were needed and how they could be built. Each
+little subsection of the script was tested as I went along. The order list was
+originally a list of tuples; it wasn’t until I had a working version of the
+entire script that I realized that it could be simplified down to a list of
+link labels. That change shortened the script by five lines or so and, more
+importantly, clarified its logic.
- Despite these improvements, the script is hardly foolproof. The
- Markdown source of this very post confuses the hell out it. Not only
- does it think there are links in the sample document (which you’d
- probably guess), it also thinks the [%s][%d] in Line 21 of the script
- is a link (and the one in this sentence, too). And why wouldn’t it? To
- distinguish between real links and things that look like links in
- embedded source code, the script would have to be able to parse
- Markdown, not just match a couple of short regular expressions. This is
- a variant on what Hamish Sanderson said in the comments on [10]an
- earlier post.
+Despite these improvements, the script is hardly foolproof. The Markdown source
+of this very post confuses the hell out it. Not only does it think there are
+links in the sample document (which you’d probably guess), it also thinks the
+[%s][%d] in Line 21 of the script is a link (and the one in this sentence,
+too). And why wouldn’t it? To distinguish between real links and things that
+look like links in embedded source code, the script would have to be able to
+parse Markdown, not just match a couple of short regular expressions. This is a
+variant on what Hamish Sanderson said in the comments on [8]an earlier post.
- At the moment, I’m not willing to sacrifice the simplicity of the Tidy
- script to get it to handle weird posts like this one. But if I find
- that it fails often with the kind of input I commonly give it, I’ll
- have to revisit that decision.
+At the moment, I’m not willing to sacrifice the simplicity of the Tidy script
+to get it to handle weird posts like this one. But if I find that it fails
+often with the kind of input I commonly give it, I’ll have to revisit that
+decision.
- As Wilde also said, “Experience is the name everyone gives to their
- mistakes.”
- __________________________________________________________________
+As Wilde also said, “Experience is the name everyone gives to their mistakes.”
- 1. I didn’t think [11]Seth Brown’s formd did that, but [12]this tweet
- from Brett Terpsta says I was wrong about that. [13]↩
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- [14]Next post [15]Previous post
+ 1. I didn’t think [9]Seth Brown’s formd did that, but [10]this tweet from
+ Brett Terpsta says I was wrong about that. [11]↩
+
+[12]Next post [13]Previous post
Site search
- ____________________ Go!
-
+[21][ ] [22][Go!]
Meta
- * drdrang at leancrew
- * [16]Blog archive
- * [17]RSS feed
- * [18]JSON feed
- * [19]Mastodon
- * [20]GitHub repositories
+ • drdrang at leancrew
+ • [23]Blog archive
+ • [24]RSS feed
+ • [25]JSON feed
+ • [26]Mastodon
+ • [27]GitHub repositories
Recent posts
Credits
- [21]Powered by MathJax
+[28] Powered by MathJax
- This work is licensed under a [22]Creative Commons Attribution-Share
- Alike 3.0 Unported License.
+This work is licensed under a [29]Creative Commons Attribution-Share Alike 3.0
+Unported License.
- © 2005–2023, Dr. Drang
+© 2005–2023, Dr. Drang
-References
- 1. https://leancrew.com/all-this/feed/
- 2. https://leancrew.com/all-this/feed.json
- 3. https://leancrew.com/all-this/
- 4. https://leancrew.com/all-this/2012/09/some-kind-of-druid-dudes-lifting-the-veil/
- 5. https://leancrew.com/all-this/2012/09/implementing-pubsubhubbub/
- 6. https://leancrew.com/all-this/2012/09/tidying-markdown-reference-links/
- 7. http://www.gutenberg.org/dirs/etext97/lwfan10h.htm
- 8. http://daringfireball.net/projects/markdown/syntax#link
- 9. https://leancrew.com/all-this/2012/09/tidying-markdown-reference-links/#fn:formd
- 10. http://www.leancrew.com/all-this/2012/09/applescript-syntax-highlighting-finally/
- 11. http://www.drbunsen.org/formd-a-markdown-formatting-tool.html
- 12. https://twitter.com/ttscoff/status/247398632377184256
- 13. https://leancrew.com/all-this/2012/09/tidying-markdown-reference-links/#fnref:formd
- 14. https://leancrew.com/all-this/2012/09/some-kind-of-druid-dudes-lifting-the-veil/
- 15. https://leancrew.com/all-this/2012/09/implementing-pubsubhubbub/
- 16. https://leancrew.com/all-this/archive/
- 17. https://leancrew.com/all-this/feed/
- 18. https://leancrew.com/all-this/feed.json
- 19. https://fosstodon.org/@drdrang
- 20. http://github.com/drdrang
- 21. http://www.mathjax.org/
- 22. http://creativecommons.org/licenses/by-sa/3.0/
+References:
+
+[1] https://leancrew.com/all-this/
+[2] https://leancrew.com/all-this/2012/09/some-kind-of-druid-dudes-lifting-the-veil/
+[3] https://leancrew.com/all-this/2012/09/implementing-pubsubhubbub/
+[4] https://leancrew.com/all-this/2012/09/tidying-markdown-reference-links/
+[5] http://www.gutenberg.org/dirs/etext97/lwfan10h.htm
+[6] http://daringfireball.net/projects/markdown/syntax#link
+[7] https://leancrew.com/all-this/2012/09/tidying-markdown-reference-links/#fn:formd
+[8] http://www.leancrew.com/all-this/2012/09/applescript-syntax-highlighting-finally/
+[9] http://www.drbunsen.org/formd-a-markdown-formatting-tool.html
+[10] https://twitter.com/ttscoff/status/247398632377184256
+[11] https://leancrew.com/all-this/2012/09/tidying-markdown-reference-links/#fnref:formd
+[12] https://leancrew.com/all-this/2012/09/some-kind-of-druid-dudes-lifting-the-veil/
+[13] https://leancrew.com/all-this/2012/09/implementing-pubsubhubbub/
+[23] https://leancrew.com/all-this/archive/
+[24] https://leancrew.com/all-this/feed/
+[25] https://leancrew.com/all-this/feed.json
+[26] https://fosstodon.org/@drdrang
+[27] http://github.com/drdrang
+[28] http://www.mathjax.org/
+[29] http://creativecommons.org/licenses/by-sa/3.0/
diff --git a/static/archive/lukeplant-me-uk-ms1b6l.txt b/static/archive/lukeplant-me-uk-ms1b6l.txt
index 1833a30..707e01e 100644
--- a/static/archive/lukeplant-me-uk-ms1b6l.txt
+++ b/static/archive/lukeplant-me-uk-ms1b6l.txt
@@ -1,126 +1,123 @@
- * Site
- + [1]Home
- + [2]About me
- * Blog
- + [3]Posts
- + [4]Categories
- * Post
- + [5]Comments
- + [6]Related
+ • Site
+ □ [1]Home
+ □ [2]About me
+ • Blog
+ □ [3]Posts
+ □ [4]Categories
+ • Post
+ □ [5]Comments
+ □ [6]Related
No one actually wants simplicity
- by [7]Luke Plant
- Posted in:
- * [8]Rants
- * [9]Software development
- * [10]Web development
+by [7]Luke Plant
+Posted in:
- — August 22, 2023 18:49
+ • [8]Rants
+ • [9]Software development
+ • [10]Web development
- The reason that modern web development is [11]swamped with complexity
- is that no one really wants things to be simple. We just think we do,
- while our choices prove otherwise.
+— August 22, 2023 18:49
- A lot of developers want simplicity in the same way that a lot of
- clients claim they want a fast website. You respond “OK, so we can
- remove some of these 17 Javascript trackers and other bloat that’s
- making your website horribly slow?” – no, apparently those are all
- critical business functionality.
+The reason that modern web development is [11]swamped with complexity is that
+no one really wants things to be simple. We just think we do, while our choices
+prove otherwise.
- In other words, they prioritise everything over speed. And then they
- wonder why using their website is like rowing a boat through a lake of
- molasses on a cold day using nothing but a small plastic spoon.
+A lot of developers want simplicity in the same way that a lot of clients claim
+they want a fast website. You respond “OK, so we can remove some of these 17
+Javascript trackers and other bloat that’s making your website horribly slow?”
+– no, apparently those are all critical business functionality.
- The same is often true of complexity. The real test is the question
- “what are you willing to sacrifice to achieve simplicity?” If the
- answer is “nothing”, then you don’t actually love simplicity at all,
- it’s your lowest priority.
+In other words, they prioritise everything over speed. And then they wonder why
+using their website is like rowing a boat through a lake of molasses on a cold
+day using nothing but a small plastic spoon.
- When I say “sacrifice”, I don’t mean that choosing simplicity will mean
- you are worse off overall – simplicity brings massive benefits. But it
- does mean that there will be some things that tempt you to believe you
- are missing out.
+The same is often true of complexity. The real test is the question “what are
+you willing to sacrifice to achieve simplicity?” If the answer is “nothing”,
+then you don’t actually love simplicity at all, it’s your lowest priority.
- For every developer, it might be something different. For one, the
- tedium of having to spend half an hour a month ensuring that two
- different things are kept in sync easily justifies the adoption of a
- bulky framework that solves that particular problem. For another, the
- ability to control how a checkbox animates when you check it is of
- course a valid reason to add another 50 packages and 3 layers of
- frameworks to their product. For another, adding an abstraction with
- thousands of lines of codes, dozens of classes and page after page of
- documentation in order to avoid manually writing a [12]tiny factory
- function for a test is a great trade-off.
+When I say “sacrifice”, I don’t mean that choosing simplicity will mean you are
+worse off overall – simplicity brings massive benefits. But it does mean that
+there will be some things that tempt you to believe you are missing out.
- Of course we all claim to hate complexity, but it’s actually just
- complexity added by other people that we hate — our own bugbears are
- always exempted, and for things we understand we quickly become unable
- to even see there is a potential problem for other people. Certainly
- there are frameworks and dependencies that justify their existence and
- adoption, but working out which ones they are is hard.
+For every developer, it might be something different. For one, the tedium of
+having to spend half an hour a month ensuring that two different things are
+kept in sync easily justifies the adoption of a bulky framework that solves
+that particular problem. For another, the ability to control how a checkbox
+animates when you check it is of course a valid reason to add another 50
+packages and 3 layers of frameworks to their product. For another, adding an
+abstraction with thousands of lines of codes, dozens of classes and page after
+page of documentation in order to avoid manually writing a [12]tiny factory
+function for a test is a great trade-off.
- I think a good test of whether you truly love simplicity is whether you
- are able to remove things you have added, especially code you’ve
- written, even when it is still providing value, because you realise it
- is not providing enough value.
+Of course we all claim to hate complexity, but it’s actually just complexity
+added by other people that we hate — our own bugbears are always exempted, and
+for things we understand we quickly become unable to even see there is a
+potential problem for other people. Certainly there are frameworks and
+dependencies that justify their existence and adoption, but working out which
+ones they are is hard.
- Another test is what you are tempted to do when a problem arises with
- some of the complexity you’ve added. Is your first instinct to add even
- more stuff to fix it, or is it to remove and live with the loss?
+I think a good test of whether you truly love simplicity is whether you are
+able to remove things you have added, especially code you’ve written, even when
+it is still providing value, because you realise it is not providing enough
+value.
- The only path I can see through all this is to cultivate an almost
- obsessive suspicion of [13]FOMO. I think that’s probably key to
- learning to [14]say no.
+Another test is what you are tempted to do when a problem arises with some of
+the complexity you’ve added. Is your first instinct to add even more stuff to
+fix it, or is it to remove and live with the loss?
+
+The only path I can see through all this is to cultivate an almost obsessive
+suspicion of [13]FOMO. I think that’s probably key to learning to [14]say no.
Links
- * [15]Discussion of this post on Lobsters
+ • [15]Discussion of this post on Lobsters
You may also like: [16]§
- * [17]Super-fast Sphinx docs, and SNOB driven development
- * [18]Test smarter, not harder
- * [19]Announcement: Django Views - The Right Way
- * [20]Wedding hacks - seating planner using simulated annealing
- * [21]Wedding hacks - John Lewis gift list hyperlink
- * [22]A prayer to the programming gods
- * [23]Why learning Haskell/Python makes you a worse programmer
+ • [17]Super-fast Sphinx docs, and SNOB driven development
+ • [18]Test smarter, not harder
+ • [19]Announcement: Django Views - The Right Way
+ • [20]Wedding hacks - seating planner using simulated annealing
+ • [21]Wedding hacks - John Lewis gift list hyperlink
+ • [22]A prayer to the programming gods
+ • [23]Why learning Haskell/Python makes you a worse programmer
Comments [24]§
- Comments should load when you scroll to here...
+Comments should load when you scroll to here...
- Copyright Luke Plant
+Copyright Luke Plant
- Built using [25]Nikola
- Powered by [26]DigitalOcean
+Built using [25]Nikola
+Powered by [26]DigitalOcean
-References
- 1. https://lukeplant.me.uk/
- 2. https://lukeplant.me.uk/personal/
- 3. https://lukeplant.me.uk/blog/
- 4. https://lukeplant.me.uk/blog/categories/
- 5. https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#comments
- 6. https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#related
- 7. https://lukeplant.me.uk/
- 8. https://lukeplant.me.uk/blog/categories/rants/
- 9. https://lukeplant.me.uk/blog/categories/software-development/
- 10. https://lukeplant.me.uk/blog/categories/web-development/
- 11. https://www.youtube.com/watch?v=BtJAsvJOlhM
- 12. https://lukeplant.me.uk/blog/posts/test-factory-functions-in-django/
- 13. https://en.wikipedia.org/wiki/Fear_of_missing_out
- 14. https://grugbrain.dev/#grug-on-saying-no
- 15. https://lobste.rs/s/ao2x0v/no_one_actually_wants_simplicity
- 16. https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#related
- 17. https://lukeplant.me.uk/blog/posts/super-fast-sphinx-docs/
- 18. https://lukeplant.me.uk/blog/posts/test-smarter-not-harder/
- 19. https://lukeplant.me.uk/blog/posts/announcement-django-views-the-right-way/
- 20. https://lukeplant.me.uk/blog/posts/wedding-hacks---seating-planner-using-simulated-annealing/
- 21. https://lukeplant.me.uk/blog/posts/wedding-hacks---john-lewis-gift-list-hyperlink/
- 22. https://lukeplant.me.uk/blog/posts/a-prayer-to-the-programming-gods/
- 23. https://lukeplant.me.uk/blog/posts/why-learning-haskell-python-makes-you-a-worse-programmer/
- 24. https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#comments
- 25. https://getnikola.com/
- 26. https://m.do.co/c/cef485980f20
+References:
+
+[1] https://lukeplant.me.uk/
+[2] https://lukeplant.me.uk/personal/
+[3] https://lukeplant.me.uk/blog/
+[4] https://lukeplant.me.uk/blog/categories/
+[5] https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#comments
+[6] https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#related
+[7] https://lukeplant.me.uk/
+[8] https://lukeplant.me.uk/blog/categories/rants/
+[9] https://lukeplant.me.uk/blog/categories/software-development/
+[10] https://lukeplant.me.uk/blog/categories/web-development/
+[11] https://www.youtube.com/watch?v=BtJAsvJOlhM
+[12] https://lukeplant.me.uk/blog/posts/test-factory-functions-in-django/
+[13] https://en.wikipedia.org/wiki/Fear_of_missing_out
+[14] https://grugbrain.dev/#grug-on-saying-no
+[15] https://lobste.rs/s/ao2x0v/no_one_actually_wants_simplicity
+[16] https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#related
+[17] https://lukeplant.me.uk/blog/posts/super-fast-sphinx-docs/
+[18] https://lukeplant.me.uk/blog/posts/test-smarter-not-harder/
+[19] https://lukeplant.me.uk/blog/posts/announcement-django-views-the-right-way/
+[20] https://lukeplant.me.uk/blog/posts/wedding-hacks---seating-planner-using-simulated-annealing/
+[21] https://lukeplant.me.uk/blog/posts/wedding-hacks---john-lewis-gift-list-hyperlink/
+[22] https://lukeplant.me.uk/blog/posts/a-prayer-to-the-programming-gods/
+[23] https://lukeplant.me.uk/blog/posts/why-learning-haskell-python-makes-you-a-worse-programmer/
+[24] https://lukeplant.me.uk/blog/posts/no-one-actually-wants-simplicity/#comments
+[25] https://getnikola.com/
+[26] https://m.do.co/c/cef485980f20
diff --git a/static/archive/macwright-com-o4dndf.txt b/static/archive/macwright-com-o4dndf.txt
index e050afc..7e37454 100644
--- a/static/archive/macwright-com-o4dndf.txt
+++ b/static/archive/macwright-com-o4dndf.txt
@@ -1,349 +1,328 @@
- #[1]macwright.com - Micro [2]macwright.com - Micro
+Tom MacWright
+
+tom@macwright.com
Tom MacWright
- tom@macwright.com
-
-Tom MacWright
-
- * [3]Writing
- * [4]Reading
- * [5]Photos
- * [6]Projects
- * [7]Drawings
- * [8]Micro
- * [9]About
+ • [1]Writing⇠
+ • [2]Reading
+ • [3]Photos
+ • [4]Projects
+ • [5]Drawings
+ • [6]Micro
+ • [7]About
A year of Rails
- Railroad
+Railroad
- I spent most of 2020 working with [10]Ruby on Rails. I moved a project
- from [11]Next.js + [12]Rust to… Rails, baby! Back to the future. My
- earlier post on [13]Second-guessing the modern web was inspired by this
- experience, that for the product we were building, a ‘modern’ stack was
- not working as well as a traditional one.
+I spent most of 2020 working with [8]Ruby on Rails. I moved a project from [9]
+Next.js + [10]Rust to… Rails, baby! Back to the future. My earlier post on [11]
+Second-guessing the modern web was inspired by this experience, that for the
+product we were building, a ‘modern’ stack was not working as well as a
+traditional one.
- We didn’t do competitive analysis against Laravel, Django, or Phoenix.
- They’re similar, not radically better or worse. There are multiple
- acceptable solutions to a problem, and this was more a matter of
- choosing the right kind of solution than pursuing some kind of perfect
- choice and burning hours and motivation doing the window-shopping.
+We didn’t do competitive analysis against Laravel, Django, or Phoenix. They’re
+similar, not radically better or worse. There are multiple acceptable solutions
+to a problem, and this was more a matter of choosing the right kind of solution
+than pursuing some kind of perfect choice and burning hours and motivation
+doing the window-shopping.
- What helped Rails win was that the team had a little more experience in
- Ruby (with the exception of myself), and we found plenty of resources
- for developing and deploying the stack. Rails fit perfectly into the
- ideology of [14]Choosing boring technology. Another part of the product
- would be the hard, innovative part, so it made no sense to grapple with
- bleeding-edge web frameworks.
+What helped Rails win was that the team had a little more experience in Ruby
+(with the exception of myself), and we found plenty of resources for developing
+and deploying the stack. Rails fit perfectly into the ideology of [12]Choosing
+boring technology. Another part of the product would be the hard, innovative
+part, so it made no sense to grapple with bleeding-edge web frameworks.
- This was a really fun experience. There’s a lot to love about Rails.
- Other communities could learn a bit from the Ruby & Rails culture and
- wisdom. I won’t implement everything in Rails, but it’ll be part of the
- toolbox.
+This was a really fun experience. There’s a lot to love about Rails. Other
+communities could learn a bit from the Ruby & Rails culture and wisdom. I won’t
+implement everything in Rails, but it’ll be part of the toolbox.
- Before this, I hadn’t touched the stuff. And I bet a lot of people are
- like that - they came of age in the world of React and Go, and haven’t
- tried anything even remotely similar to Rails. For their benefit, and
- to debrief from 2020, here are some notes on the experience. Plus,
- [15]Rails-like projects in JavaScript are ramping up quickly, and it’s
- fun to know the origins.
+Before this, I hadn’t touched the stuff. And I bet a lot of people are like
+that - they came of age in the world of React and Go, and haven’t tried
+anything even remotely similar to Rails. For their benefit, and to debrief from
+2020, here are some notes on the experience. Plus, [13]Rails-like projects in
+JavaScript are ramping up quickly, and it’s fun to know the origins.
The good
Debugging Rails apps is amazing
- A while ago, I [16]wrote on Twitter
+A while ago, I [14]wrote on Twitter
- the real reason why javascript developers don’t use breakpoints and
- use console.log is that breakpoints don’t work
+ the real reason why javascript developers don’t use breakpoints and use
+ console.log is that breakpoints don’t work
- After years of working in JavaScript, I’m used to bad debugging
- experiences. The Chrome debugger’s [17]automatic pause on caught
- exceptions is amazing, sometimes. But throwing a debugger statement in
- some React code is dodgy as hell. Sometimes it works, mostly it
- doesn’t. You have to deal with code that might not have the right
- [18]sourcemap to translate from bundled & minified code to original
- source. Subtle abstractions like React hooks and advanced transpiler
- stuff like [19]Regenerator mean that your code’s stacktrace probably
- looks nothing like what you expect, with lots of internal garbage.
- Sure, you can learn better techniques for diagnosing and debugging
- errors, but it’s not just you - the debugging story in JavaScript is
- pretty bad. This applies even to Node.js, where one of the debugging
- stories is to connect Chrome’s debugger to a Node.js instance: a
- finicky solution that doesn’t consistently work.
+After years of working in JavaScript, I’m used to bad debugging experiences.
+The Chrome debugger’s [15]automatic pause on caught exceptions is amazing,
+sometimes. But throwing a debugger statement in some React code is dodgy as
+hell. Sometimes it works, mostly it doesn’t. You have to deal with code that
+might not have the right [16]sourcemap to translate from bundled & minified
+code to original source. Subtle abstractions like React hooks and advanced
+transpiler stuff like [17]Regenerator mean that your code’s stacktrace probably
+looks nothing like what you expect, with lots of internal garbage. Sure, you
+can learn better techniques for diagnosing and debugging errors, but it’s not
+just you - the debugging story in JavaScript is pretty bad. This applies even
+to Node.js, where one of the debugging stories is to connect Chrome’s debugger
+to a Node.js instance: a finicky solution that doesn’t consistently work.
- In Rails, there is [20]byebug. You write byebug in your source code,
- and you get an interactive REPL right there. It works in views,
- controllers, database migrations, everywhere. It almost always works.
- Variables are named what you expect. The whole system is paused at that
- moment, and you can actually interact with it, using all of the Rails
- utilities and your installed gems.
+In Rails, there is [18]byebug. You write byebug in your source code, and you
+get an interactive REPL right there. It works in views, controllers, database
+migrations, everywhere. It almost always works. Variables are named what you
+expect. The whole system is paused at that moment, and you can actually
+interact with it, using all of the Rails utilities and your installed gems.
- If a page crashes unexpectedly, you get a similar REPL experience, in
- your browser, automatically. With an automatically cleaned-up
- stacktrace that excludes Rails’s own frames. Like the byebug interface,
- this REPL actually works and is consistently helpful in finding root
- causes. Rarely will you need to use puts to print something to the
- console because this debugging system is so good.
+If a page crashes unexpectedly, you get a similar REPL experience, in your
+browser, automatically. With an automatically cleaned-up stacktrace that
+excludes Rails’s own frames. Like the byebug interface, this REPL actually
+works and is consistently helpful in finding root causes. Rarely will you need
+to use puts to print something to the console because this debugging system is
+so good.
The magic mostly works
- Our Rails app didn’t have any require statements. You mention a
- module’s name, and it’s automatically included, using [21]Zeitwerk, a
- tool that comes standard with Rails.
+Our Rails app didn’t have any require statements. You mention a module’s name,
+and it’s automatically included, using [19]Zeitwerk, a tool that comes standard
+with Rails.
- This kind of system was terrifying to me before. What if you
- accidentally import something just by mentioning it? What if two things
- have the same name and you import the wrong one? How do you really know
- what’s happening? Sure, you’re happy now, with all of that annoying
- importing and exporting taken care of, but the sky might fall.
+This kind of system was terrifying to me before. What if you accidentally
+import something just by mentioning it? What if two things have the same name
+and you import the wrong one? How do you really know what’s happening? Sure,
+you’re happy now, with all of that annoying importing and exporting taken care
+of, but the sky might fall.
- Or maybe it just… doesn’t. Maybe impure, vaguely risky techniques are
- just a net positive over time, and making everything fully explicit
- isn’t really necessary? Now when I’m using other systems, I wonder -
- what if I could just mention one of my React components and it would
- just… be there? Sure, the system would have to complain if there were
- two components with the same name, and it would have to make
- assumptions about directory structure, but overall, wouldn’t this be
- nice?
+Or maybe it just… doesn’t. Maybe impure, vaguely risky techniques are just a
+net positive over time, and making everything fully explicit isn’t really
+necessary? Now when I’m using other systems, I wonder - what if I could just
+mention one of my React components and it would just… be there? Sure, the
+system would have to complain if there were two components with the same name,
+and it would have to make assumptions about directory structure, but overall,
+wouldn’t this be nice?
- This applies to a lot of other parts of the system too. Rails is famous
- for doing pluralization - you name a model Post and you automatically
- get an interface called posts. But what, you ask, of words with uneven
- pluralization rules? Rails actually [22]does the right thing, almost
- always. And when it fails, you can override it. It actually just saves
- time, reliably.
+This applies to a lot of other parts of the system too. Rails is famous for
+doing pluralization - you name a model Post and you automatically get an
+interface called posts. But what, you ask, of words with uneven pluralization
+rules? Rails actually [20]does the right thing, almost always. And when it
+fails, you can override it. It actually just saves time, reliably.
Testing works
- I’ve tried to test front-end applications. I’ve set up [23]nightwatch,
- [24]jest, [25]enzyme, [26]cypress, and probably 5-10 other frameworks.
- Front-end testing is universally terrible. Projects like Cypress are
- throwing untold hours into making it less terrible, taking on massive
- amounts of complexity to abstract away from fickle browser behavior and
- complex interactions.
+I’ve tried to test front-end applications. I’ve set up [21]nightwatch, [22]jest
+, [23]enzyme, [24]cypress, and probably 5-10 other frameworks. Front-end
+testing is universally terrible. Projects like Cypress are throwing untold
+hours into making it less terrible, taking on massive amounts of complexity to
+abstract away from fickle browser behavior and complex interactions.
- But it still sucks. Frontend testing has no good attributes: it’s
- unreliable, hard to automate, hard to debug when it fails, and often
- doesn’t even assert for important behaviors, so it doesn’t actually
- identify regressions. Running frontend tests in CI is resource-heavy,
- requiring you to set up headless X windows environments on servers or
- use specialized CI services that produce screencasts of test runs.
+But it still sucks. Frontend testing has no good attributes: it’s unreliable,
+hard to automate, hard to debug when it fails, and often doesn’t even assert
+for important behaviors, so it doesn’t actually identify regressions. Running
+frontend tests in CI is resource-heavy, requiring you to set up headless X
+windows environments on servers or use specialized CI services that produce
+screencasts of test runs.
- Testing fully-server-rendered applications, on the other hand, is
- amazing. A vanilla testing setup with Rails & [27]RSpec can give you
- fast, stable, concise, and actually-useful test coverage. You can
- actually assert for behavior and navigate through an application like a
- user would. These tests are solving a simpler problem - making requests
- and parsing responses, without the need for a full browser or headless
- browser, without multiple kinds of state to track.
+Testing fully-server-rendered applications, on the other hand, is amazing. A
+vanilla testing setup with Rails & [25]RSpec can give you fast, stable,
+concise, and actually-useful test coverage. You can actually assert for
+behavior and navigate through an application like a user would. These tests are
+solving a simpler problem - making requests and parsing responses, without the
+need for a full browser or headless browser, without multiple kinds of state to
+track.
- Not only do the tests work better, the testing culture is a completely
- different universe. There are entire books written about how to write
- RSpec tests that catch bugs, allow software evolution, and aren’t
- filled with boilerplate.
+Not only do the tests work better, the testing culture is a completely
+different universe. There are entire books written about how to write RSpec
+tests that catch bugs, allow software evolution, and aren’t filled with
+boilerplate.
Gems are so powerful
- Powerful and dangerous.
+Powerful and dangerous.
- I’m used to modules as they work in other systems - Python, Node, Elm,
- and so on. They provide objects, functions, and variables that you can
- import and combine into your code explicitly. Usually they sit on some
- specific level of abstraction - it’s a utility for connecting to
- servers or a React component you can use.
+I’m used to modules as they work in other systems - Python, Node, Elm, and so
+on. They provide objects, functions, and variables that you can import and
+combine into your code explicitly. Usually they sit on some specific level of
+abstraction - it’s a utility for connecting to servers or a React component you
+can use.
- Gems can do so much more. You install something like [28]Devise into
- your system and it adds views, routes, methods, utilities, you name it.
- It’s not like “loading some functions”, it’s more like composing a
- whole different app into your app, implicitly.
+Gems can do so much more. You install something like [26]Devise into your
+system and it adds views, routes, methods, utilities, you name it. It’s not
+like “loading some functions”, it’s more like composing a whole different app
+into your app, implicitly.
- This is obviously terrifying. It means that you can’t look at your
- directories of views and your file of routes.rb and know what exists at
- a glance. There are other layers, lurking in the ephemeral space of
- third-party code. They interact in serious but uncertain ways.
+This is obviously terrifying. It means that you can’t look at your directories
+of views and your file of routes.rb and know what exists at a glance. There are
+other layers, lurking in the ephemeral space of third-party code. They interact
+in serious but uncertain ways.
- But it’s also pretty incredible - the idea that something like
- [29]passport, Node’s middleware, could instead be a full-fledged
- authentication system. It means that you have to write a lot less code,
- and it also means that the people who use that code have a lot more
- code in common. That gems can work on a higher level of abstraction,
- making it possible to cobble together software faster, to write less
- ‘glue code.’
+But it’s also pretty incredible - the idea that something like [27]passport,
+Node’s middleware, could instead be a full-fledged authentication system. It
+means that you have to write a lot less code, and it also means that the people
+who use that code have a lot more code in common. That gems can work on a
+higher level of abstraction, making it possible to cobble together software
+faster, to write less ‘glue code.’
There’s so much good writing about Rails
- Even if you don’t write Ruby, you should pay attention to [30]Sandi
- Metz. She’s incredibly wise and has so many incredible ideas to share.
+Even if you don’t write Ruby, you should pay attention to [28]Sandi Metz. She’s
+incredibly wise and has so many incredible ideas to share.
- And then there’s [31]arkency, [32]ThoughtBot, and so many other
- thoughtful writers with years of experience in Rails. Sometimes it’s a
- little shocking to google for some obscure problem and see a decade of
- discussion about it.
+And then there’s [29]arkency, [30]ThoughtBot, and so many other thoughtful
+writers with years of experience in Rails. Sometimes it’s a little shocking to
+google for some obscure problem and see a decade of discussion about it.
- The best practices are also formalized into tools like [33]Code Climate
- and [34]reek. I’ve never seen so many actually-useful suggestions come
- out of automated systems as I did in the world of Ruby and Rails.
+The best practices are also formalized into tools like [31]Code Climate and
+[32]reek. I’ve never seen so many actually-useful suggestions come out of
+automated systems as I did in the world of Ruby and Rails.
Ruby
- Ruby is a pretty pleasant language to work in. Sure, it has a lot of
- syntax and a sprawling standard library, but you don’t have to use all
- of that if you don’t want to. It took me a while to adjust to the
- object-oriented way of doing things - in particular, the idea that you
- can’t just have a free-range function floating out there, unassociated
- with a class or module, like you can in JavaScript. And you can’t just
- create an arbitrary one-off object - you either need to define a class
- to create an object, or use a Hash to store data.
+Ruby is a pretty pleasant language to work in. Sure, it has a lot of syntax and
+a sprawling standard library, but you don’t have to use all of that if you
+don’t want to. It took me a while to adjust to the object-oriented way of doing
+things - in particular, the idea that you can’t just have a free-range function
+floating out there, unassociated with a class or module, like you can in
+JavaScript. And you can’t just create an arbitrary one-off object - you either
+need to define a class to create an object, or use a Hash to store data.
- But Ruby’s standard library isn’t that huge. I’ve seen JavaScript’s
- ‘standard library’ grow a lot too, and frankly it’s nice to have
- methods like [35]String.prototype.padStart instead of having every
- little thing in userspace. The only part that felt actively weird was
- [36]activesupport - a gem that extends Ruby’s core objects, but is part
- of Rails. It felt weird to have string methods that would only work if
- your environment was Rails.
+But Ruby’s standard library isn’t that huge. I’ve seen JavaScript’s ‘standard
+library’ grow a lot too, and frankly it’s nice to have methods like [33]
+String.prototype.padStart instead of having every little thing in userspace.
+The only part that felt actively weird was [34]activesupport - a gem that
+extends Ruby’s core objects, but is part of Rails. It felt weird to have string
+methods that would only work if your environment was Rails.
- The [37]Dash app for documentation rocketed from my pile of unused
- tools to an absolute must-have. In the world of Ruby and Rails, with
- most gems having pretty good, semi-standard documentation, you can
- search for, and get answers, super fast. The Ruby language
- documentation and the Rails documentation is absolutely great. The
- JavaScript equivalent - [38]MDN - pales in comparison.
+The [35]Dash app for documentation rocketed from my pile of unused tools to an
+absolute must-have. In the world of Ruby and Rails, with most gems having
+pretty good, semi-standard documentation, you can search for, and get answers,
+super fast. The Ruby language documentation and the Rails documentation is
+absolutely great. The JavaScript equivalent - [36]MDN - pales in comparison.
The bad
The asset pipeline
- Remember SASS and the YUI Compressor? These are, unfortunately,
- defaults in the [39]asset pipeline. There’s [40]Webpacker too, which
- has a parallel approach to CSS and images as the asset pipeline. It has
- [41]opinionated integrations with stuff like React. Ah, and I should
- mention that Rails’s [42]JavaScript utilities are written in…
- CoffeeScript.
+Remember SASS and the YUI Compressor? These are, unfortunately, defaults in the
+[37]asset pipeline. There’s [38]Webpacker too, which has a parallel approach to
+CSS and images as the asset pipeline. It has [39]opinionated integrations with
+stuff like React. Ah, and I should mention that Rails’s [40]JavaScript
+utilities are written in… CoffeeScript.
- I get it - it’s hard to keep up with the latest trends in frontend. But
- this is one area where Rails’s strong backwards compatibility feels
- iffy. I wish that Rails was more opinionated about the frontend, and
- that it had better opinions.
+I get it - it’s hard to keep up with the latest trends in frontend. But this is
+one area where Rails’s strong backwards compatibility feels iffy. I wish that
+Rails was more opinionated about the frontend, and that it had better opinions.
Best practice churn
- In Smalltalk, everything happens somewhere else. - [43]Adele
- Goldberg
+ In Smalltalk, everything happens somewhere else. - [41]Adele Goldberg
- Ruby, as today’s Smalltalk, has the same issue. The community venerates
- small - that methods should be short, files should be small, complexity
- should be controlled. This begs the question of where it all goes -
- certainly not in controllers, which should be skinny, and not in views,
- which should have very little logic at all, and maybe [44]not in models
- either. Maybe in [45]Service Objects, or policies, or decorators?
+Ruby, as today’s Smalltalk, has the same issue. The community venerates small -
+that methods should be short, files should be small, complexity should be
+controlled. This begs the question of where it all goes - certainly not in
+controllers, which should be skinny, and not in views, which should have very
+little logic at all, and maybe [42]not in models either. Maybe in [43]Service
+Objects, or policies, or decorators?
- I found myself falling victim to this. I’d try to win CodeClimate’s
- approval by moving code around, perfecting the art of making everything
- small or at most medium-sized, extracting concerns until most files
- looked okay. This was time well-spent on learning, but I have to admit
- that it doesn’t actually matter for an early-stage startup’s product.
+I found myself falling victim to this. I’d try to win CodeClimate’s approval by
+moving code around, perfecting the art of making everything small or at most
+medium-sized, extracting concerns until most files looked okay. This was time
+well-spent on learning, but I have to admit that it doesn’t actually matter for
+an early-stage startup’s product.
- In stark contrast to the folks who say that Rails is for prototypes,
- there’s a lot of attention paid to long-lived engineering efforts -
- adopting patterns that let many team work on the same ‘monolith’,
- identifying [46]shotgun surgery - a term I first heard from Sandi Metz.
+In stark contrast to the folks who say that Rails is for prototypes, there’s a
+lot of attention paid to long-lived engineering efforts - adopting patterns
+that let many team work on the same ‘monolith’, identifying [44]shotgun surgery
+- a term I first heard from Sandi Metz.
ActiveRecord is great, except when it isn’t
- One of the hardest bugs we encountered happened with ActiveRecord. We
- were creating a set of changes to apply to a model, using their
- in-memory instances to do some stuff, and then finally applying them.
- This broke because one of the ActiveRecord methods automatically
- ‘committed’ those changes, quietly.
+One of the hardest bugs we encountered happened with ActiveRecord. We were
+creating a set of changes to apply to a model, using their in-memory instances
+to do some stuff, and then finally applying them. This broke because one of the
+ActiveRecord methods automatically ‘committed’ those changes, quietly.
- ActiveRecord is kind of like this - a lot of the times it’s pleasantly
- implicit, letting you just assign a value and automatically saving that
- to the database. But then it’ll do something implicitly that you don’t
- want to happen, and figuring out why this happened and how to stop it
- from happening is a real challenge.
+ActiveRecord is kind of like this - a lot of the times it’s pleasantly
+implicit, letting you just assign a value and automatically saving that to the
+database. But then it’ll do something implicitly that you don’t want to happen,
+and figuring out why this happened and how to stop it from happening is a real
+challenge.
- Most of the time, to be clear - it’s a really great system. It provides
- lots of ways to generate efficient-enough queries, knowing full well
- that SQL performance is often the bottleneck of web applications. Most
- of the time it’s really nice that it automatically casts and
- deserializes query results. But when it goes bad, the diagnosis and the
- cure can be pretty ugly.
+Most of the time, to be clear - it’s a really great system. It provides lots of
+ways to generate efficient-enough queries, knowing full well that SQL
+performance is often the bottleneck of web applications. Most of the time it’s
+really nice that it automatically casts and deserializes query results. But
+when it goes bad, the diagnosis and the cure can be pretty ugly.
+
+The other issue with ActiveRecord is that it has efficient methods and
+inefficient methods right next to each other, because it automatically turns
+your ‘query builder’ into an array when you call array-like methods. So, for
+example:
- The other issue with ActiveRecord is that it has efficient methods and
- inefficient methods right next to each other, because it automatically
- turns your ‘query builder’ into an array when you call array-like
- methods. So, for example:
Dogs.all.max_by(&:height)
- Is wildly inefficient. It might fetch and deserialized a million
- records just to sort them and give you the first. On the other hand,
+Is wildly inefficient. It might fetch and deserialized a million records just
+to sort them and give you the first. On the other hand,
+
Dogs.order(height: :desc).first
- Is fast - it sorts in the database and fetches a single record. Rails
- is both offering smart and easy ways to write optimized code, but also
- making it really easy to write inefficient code.
- __________________________________________________________________
+Is fast - it sorts in the database and fetches a single record. Rails is both
+offering smart and easy ways to write optimized code, but also making it really
+easy to write inefficient code.
- A Rails-like framework is a really good thing to have in your toolbox,
- and there’s a lot to learn from the Ruby community. My hope is that we
- see these sorts of abstractions in new languages and frameworks, and
- see more of the Ruby community’s culture filter into the programming
- world.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- February 18, 2021 [47]Tom MacWright ([48]@tmcw,
- [49]@tmcw@mastodon.social)
+A Rails-like framework is a really good thing to have in your toolbox, and
+there’s a lot to learn from the Ruby community. My hope is that we see these
+sorts of abstractions in new languages and frameworks, and see more of the Ruby
+community’s culture filter into the programming world.
-References
+February 18, 2021 [45]Tom MacWright ([46]@tmcw, [47]@tmcw@mastodon.social)
- 1. https://macwright.com/micro/rss.xml
- 2. https://macwright.com/micro/atom.xml
- 3. https://macwright.com/
- 4. https://macwright.com/reading/
- 5. https://macwright.com/photos/
- 6. https://macwright.com/projects/
- 7. https://macwright.com/drawings/
- 8. https://macwright.com/micro/
- 9. https://macwright.com/about/
- 10. https://rubyonrails.org/
- 11. https://nextjs.org/
- 12. https://www.rust-lang.org/
- 13. https://macwright.com/2020/05/10/spa-fatigue
- 14. http://boringtechnology.club/
- 15. https://macwright.com/2020/10/28/if-not-spas
- 16. https://twitter.com/tmcw/status/1321133460501585922
- 17. https://developers.google.com/web/updates/2015/05/automatically-pause-on-any-exception
- 18. https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/
- 19. https://github.com/facebook/regenerator
- 20. https://github.com/deivid-rodriguez/byebug
- 21. https://github.com/fxn/zeitwerk
- 22. https://weblog.rubyonrails.org/2005/8/25/10-reasons-rails-does-pluralization/
- 23. https://nightwatchjs.org/
- 24. https://jestjs.io/
- 25. https://enzymejs.github.io/enzyme/
- 26. https://www.cypress.io/
- 27. https://rspec.info/
- 28. https://github.com/heartcombo/devise
- 29. http://www.passportjs.org/
- 30. https://sandimetz.com/
- 31. https://blog.arkency.com/
- 32. https://thoughtbot.com/blog/
- 33. https://codeclimate.com/
- 34. https://github.com/troessner/reek
- 35. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
- 36. https://web.archive.org/web/https://rubygems.org/gems/activesupport/versions/6.1.1
- 37. https://kapeli.com/dash
- 38. https://developer.mozilla.org/en-US/
- 39. https://guides.rubyonrails.org/asset_pipeline.html
- 40. https://edgeguides.rubyonrails.org/webpacker.html
- 41. https://github.com/rails/webpacker#integrations
- 42. https://github.com/rails/rails/tree/main/actionview/app/assets/javascripts
- 43. https://en.wikipedia.org/wiki/Adele_Goldberg_(computer_scientist)
- 44. https://thoughtbot.com/blog/skinny-controllers-skinny-models
- 45. https://codeclimate.com/blog/7-ways-to-decompose-fat-activerecord-models/
- 46. https://en.wikipedia.org/wiki/Shotgun_surgery
- 47. https://macwright.com/about/
- 48. https://twitter.com/intent/follow?screen_name=tmcw&user_id=1458271
- 49. https://mastodon.social/@tmcw
+
+References:
+
+[1] https://macwright.com/
+[2] https://macwright.com/reading/
+[3] https://macwright.com/photos/
+[4] https://macwright.com/projects/
+[5] https://macwright.com/drawings/
+[6] https://macwright.com/micro/
+[7] https://macwright.com/about/
+[8] https://rubyonrails.org/
+[9] https://nextjs.org/
+[10] https://www.rust-lang.org/
+[11] https://macwright.com/2020/05/10/spa-fatigue
+[12] http://boringtechnology.club/
+[13] https://macwright.com/2020/10/28/if-not-spas
+[14] https://twitter.com/tmcw/status/1321133460501585922
+[15] https://developers.google.com/web/updates/2015/05/automatically-pause-on-any-exception
+[16] https://www.html5rocks.com/en/tutorials/developertools/sourcemaps/
+[17] https://github.com/facebook/regenerator
+[18] https://github.com/deivid-rodriguez/byebug
+[19] https://github.com/fxn/zeitwerk
+[20] https://weblog.rubyonrails.org/2005/8/25/10-reasons-rails-does-pluralization/
+[21] https://nightwatchjs.org/
+[22] https://jestjs.io/
+[23] https://enzymejs.github.io/enzyme/
+[24] https://www.cypress.io/
+[25] https://rspec.info/
+[26] https://github.com/heartcombo/devise
+[27] http://www.passportjs.org/
+[28] https://sandimetz.com/
+[29] https://blog.arkency.com/
+[30] https://thoughtbot.com/blog/
+[31] https://codeclimate.com/
+[32] https://github.com/troessner/reek
+[33] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
+[34] https://web.archive.org/web/https://rubygems.org/gems/activesupport/versions/6.1.1
+[35] https://kapeli.com/dash
+[36] https://developer.mozilla.org/en-US/
+[37] https://guides.rubyonrails.org/asset_pipeline.html
+[38] https://edgeguides.rubyonrails.org/webpacker.html
+[39] https://github.com/rails/webpacker#integrations
+[40] https://github.com/rails/rails/tree/main/actionview/app/assets/javascripts
+[41] https://en.wikipedia.org/wiki/Adele_Goldberg_%28computer_scientist%29
+[42] https://thoughtbot.com/blog/skinny-controllers-skinny-models
+[43] https://codeclimate.com/blog/7-ways-to-decompose-fat-activerecord-models/
+[44] https://en.wikipedia.org/wiki/Shotgun_surgery
+[45] https://macwright.com/about/
+[46] https://twitter.com/intent/follow?screen_name=tmcw&user_id=1458271
+[47] https://mastodon.social/@tmcw
diff --git a/static/archive/macwright-com-vvkegs.txt b/static/archive/macwright-com-vvkegs.txt
index 972db5b..97b9c00 100644
--- a/static/archive/macwright-com-vvkegs.txt
+++ b/static/archive/macwright-com-vvkegs.txt
@@ -1,288 +1,267 @@
- #[1]macwright.com - Micro [2]macwright.com - Micro
+Tom MacWright
+
+tom@macwright.com
Tom MacWright
- tom@macwright.com
-
-Tom MacWright
-
- * [3]Writing
- * [4]Reading
- * [5]Photos
- * [6]Projects
- * [7]Drawings
- * [8]Micro
- * [9]About
+ • [1]Writing⇠
+ • [2]Reading
+ • [3]Photos
+ • [4]Projects
+ • [5]Drawings
+ • [6]Micro
+ • [7]About
Second-guessing the modern web
- The emerging norm for web development is to build a React single-page
- application, with server rendering. The two key elements of this
- architecture are something like:
- 1. The main UI is built & updated in JavaScript using React or
- something similar.
- 2. The backend is an API that that application makes requests against.
+The emerging norm for web development is to build a React single-page
+application, with server rendering. The two key elements of this architecture
+are something like:
- This idea has really swept the internet. It started with a few major
- popular websites and has crept into corners like marketing sites and
- blogs.
+ 1. The main UI is built & updated in JavaScript using React or something
+ similar.
+ 2. The backend is an API that that application makes requests against.
- I’m increasingly skeptical of it.
+This idea has really swept the internet. It started with a few major popular
+websites and has crept into corners like marketing sites and blogs.
- There is a sweet spot of React: in moderately interactive interfaces.
- Complex forms that require immediate feedback, UIs that need to move
- around and react instantly. That’s where it excels. I helped build the
- editors in [10]Mapbox Studio and [11]Observable and for the most part,
- React was a great choice.
+I’m increasingly skeptical of it.
- But there’s a lot on either side of that sweet spot.
+There is a sweet spot of React: in moderately interactive interfaces. Complex
+forms that require immediate feedback, UIs that need to move around and react
+instantly. That’s where it excels. I helped build the editors in [8]Mapbox
+Studio and [9]Observable and for the most part, React was a great choice.
- The high performance parts aren’t React. [12]Mapbox GL, for example, is
- vanilla JavaScript and probably should be forever. The level of
- abstraction that React works on is too high, and the cost of using
- React - in payload, parse time, and so on - is too much for any company
- to include it as part of an SDK. Same with the [13]Observable runtime,
- the juicy center of that product: it’s very performance-intensive and
- would barely benefit from a port.
+But there’s a lot on either side of that sweet spot.
- The less interactive parts don’t benefit much from React. Listing
- pages, static pages, blogs - these things are increasingly built in
- React, but the benefits they accrue are extremely narrow. A lot of the
- optimizations we’re deploying to speed up these things, things like
- bundle splitting, server-side rendering, and prerendering, are
- triangulating what we had before the rise of React.
+The high performance parts aren’t React. [10]Mapbox GL, for example, is vanilla
+JavaScript and probably should be forever. The level of abstraction that React
+works on is too high, and the cost of using React - in payload, parse time, and
+so on - is too much for any company to include it as part of an SDK. Same with
+the [11]Observable runtime, the juicy center of that product: it’s very
+performance-intensive and would barely benefit from a port.
- And they’re kind of messy optimizations. Here are some examples.
+The less interactive parts don’t benefit much from React. Listing pages, static
+pages, blogs - these things are increasingly built in React, but the benefits
+they accrue are extremely narrow. A lot of the optimizations we’re deploying to
+speed up these things, things like bundle splitting, server-side rendering, and
+prerendering, are triangulating what we had before the rise of React.
+
+And they’re kind of messy optimizations. Here are some examples.
Bundle splitting.
- As your React application grows, the application bundle grows. Unlike
- with a traditional multi-page app, that growth affects every visitor:
- you download the whole app the first time that you visit it. At some
- point, this becomes a real problem. Someone who lands on the About page
- is also downloading 20 other pages in the same application bundle.
- Bundle splitting ‘solves’ this problem by creating many JavaScript
- bundles that can lazily load each other. So you load the About page and
- what your browser downloads is an ‘index’ bundle, and then that ‘index’
- bundle loads the ‘about page’ bundle.
+As your React application grows, the application bundle grows. Unlike with a
+traditional multi-page app, that growth affects every visitor: you download the
+whole app the first time that you visit it. At some point, this becomes a real
+problem. Someone who lands on the About page is also downloading 20 other pages
+in the same application bundle. Bundle splitting ‘solves’ this problem by
+creating many JavaScript bundles that can lazily load each other. So you load
+the About page and what your browser downloads is an ‘index’ bundle, and then
+that ‘index’ bundle loads the ‘about page’ bundle.
- This sort of solves the problem, but it’s not great. Most bundle
- splitting techniques require you to load that ‘index bundle’, and then
- only once that JavaScript is loaded and executed does your browser know
- which ‘page bundle’ it needs. So you need two round-trips to start
- rendering.
+This sort of solves the problem, but it’s not great. Most bundle splitting
+techniques require you to load that ‘index bundle’, and then only once that
+JavaScript is loaded and executed does your browser know which ‘page bundle’ it
+needs. So you need two round-trips to start rendering.
- And then there’s the question of updating code-split bundles. User
- sessions are surprisingly long: someone might have your website open in
- a tab for weeks at a time. I’ve seen it happen. So if they open the
- ‘about page’, keep the tab open for a week, and then request the ‘home
- page’, then the home page that they request is dictated by the index
- bundle that they downloaded last week. This is a deeply weird and
- under-discussed situation. There are essentially two solutions to it:
- 1. You keep all generated JavaScript around, forever, and people will
- see the version of the site that was live at the time of their
- first page request.
- 2. You create a system that alerts users when you’ve deployed a new
- version of the site, and prompt them to reload.
+And then there’s the question of updating code-split bundles. User sessions are
+surprisingly long: someone might have your website open in a tab for weeks at a
+time. I’ve seen it happen. So if they open the ‘about page’, keep the tab open
+for a week, and then request the ‘home page’, then the home page that they
+request is dictated by the index bundle that they downloaded last week. This is
+a deeply weird and under-discussed situation. There are essentially two
+solutions to it:
- The first solution has a drawback that might not be immediately
- obvious. In those intervening weeks between loading the site and
- clicking a link, you might’ve deployed a new API version. So the user
- will be using an old version of your JavaScript frontend with a new
- version of your API backend, and they’ll trigger errors that none of
- your testing knows about, because you’ll usually be testing current
- versions of each.
+ 1. You keep all generated JavaScript around, forever, and people will see the
+ version of the site that was live at the time of their first page request.
+ 2. You create a system that alerts users when you’ve deployed a new version of
+ the site, and prompt them to reload.
- And the second solution, while it works (and is what we implemented for
- Mapbox Studio), is a bizarre way for a web application to behave.
- Prompting users to ‘update’ is something from the bad old days of
- desktop software, not from the shiny new days of the web.
+The first solution has a drawback that might not be immediately obvious. In
+those intervening weeks between loading the site and clicking a link, you
+might’ve deployed a new API version. So the user will be using an old version
+of your JavaScript frontend with a new version of your API backend, and they’ll
+trigger errors that none of your testing knows about, because you’ll usually be
+testing current versions of each.
- Sure: traditional non-SPA websites are not immune to this pitfall.
- Someone might load your website, have a form open for many weeks, and
- then submit it after their session expired or the API changed. But
- that’s a much more limited exposure to failure than in the SPA case.
+And the second solution, while it works (and is what we implemented for Mapbox
+Studio), is a bizarre way for a web application to behave. Prompting users to
+‘update’ is something from the bad old days of desktop software, not from the
+shiny new days of the web.
+
+Sure: traditional non-SPA websites are not immune to this pitfall. Someone
+might load your website, have a form open for many weeks, and then submit it
+after their session expired or the API changed. But that’s a much more limited
+exposure to failure than in the SPA case.
Server-Side Rendering
- Okay, so the theory here is that SPAs are initially a blank page, which
- is then filled out by React & JavaScript. That’s bad for performance:
- HTML pages don’t need to be blank initially. So, Server-Side Rendering
- runs your JavaScript frontend code on the backend, creating a
- filled-out HTML page. The user loads the page, which now has
- pre-rendered content, and then the JavaScript loads and makes the page
- interactive.
+Okay, so the theory here is that SPAs are initially a blank page, which is then
+filled out by React & JavaScript. That’s bad for performance: HTML pages don’t
+need to be blank initially. So, Server-Side Rendering runs your JavaScript
+frontend code on the backend, creating a filled-out HTML page. The user loads
+the page, which now has pre-rendered content, and then the JavaScript loads and
+makes the page interactive.
- A great optimization, but again, caveats.
+A great optimization, but again, caveats.
- The first is that the page you initially render is dead: you’ve created
- the [14]Time To Interactive metric. It’s your startup’s homepage, and
- it has a “Sign up” button, but until the JavaScript loads, that button
- doesn’t do anything. So you need to compensate. Either you omit some
- interactive elements on load, or you try really hard to make sure that
- the JavaScript loads faster than users will click, or you make some
- elements not require JavaScript to work - like making them normal links
- or forms. Or some combination of those.
+The first is that the page you initially render is dead: you’ve created the
+[12]Time To Interactive metric. It’s your startup’s homepage, and it has a
+“Sign up” button, but until the JavaScript loads, that button doesn’t do
+anything. So you need to compensate. Either you omit some interactive elements
+on load, or you try really hard to make sure that the JavaScript loads faster
+than users will click, or you make some elements not require JavaScript to work
+- like making them normal links or forms. Or some combination of those.
- And then there’s the authentication story. If you do SSR on any pages
- that are custom to the user, then you need to forward any cookies or
- authentication-relevant information to your API backend and make sure
- that you never cache the server-rendered result. Your
- formerly-lightweight application server is now doing quite a bit of
- labor, running React & making API requests in order to do this
- pre-rendering.
+And then there’s the authentication story. If you do SSR on any pages that are
+custom to the user, then you need to forward any cookies or
+authentication-relevant information to your API backend and make sure that you
+never cache the server-rendered result. Your formerly-lightweight application
+server is now doing quite a bit of labor, running React & making API requests
+in order to do this pre-rendering.
APIs
- The dream of APIs is that you have generic, flexible endpoints upon
- which you can build any web application. That idea breaks down pretty
- fast.
+The dream of APIs is that you have generic, flexible endpoints upon which you
+can build any web application. That idea breaks down pretty fast.
- Most interactive web applications start to triangulate on “one query
- per page.” API calls being generic or reusable never seems to persist
- as a value in infrastructure. This is because a large portion of web
- applications are, at their core, query & transformation interfaces on
- top of databases. The hardest performance problems they tend to have
- are query problems and transfer problems.
+Most interactive web applications start to triangulate on “one query per page.”
+API calls being generic or reusable never seems to persist as a value in
+infrastructure. This is because a large portion of web applications are, at
+their core, query & transformation interfaces on top of databases. The hardest
+performance problems they tend to have are query problems and transfer
+problems.
- For example: a generically-designed REST API that tries not to mix
- ‘concerns’ will produce a frontend application that has to make lots of
- requests to display a page. And then a new-age GraphQL application will
- suffer under the [15]N+1 query problem at the database level until an
- optimization arrives. And a traditional “make a query and put it on a
- page” application will just, well, try to write some good queries.
+For example: a generically-designed REST API that tries not to mix ‘concerns’
+will produce a frontend application that has to make lots of requests to
+display a page. And then a new-age GraphQL application will suffer under the
+[13]N+1 query problem at the database level until an optimization arrives. And
+a traditional “make a query and put it on a page” application will just, well,
+try to write some good queries.
- None of these solutions are silver bullets: I’ve worked with
- overly-strict REST APIs, optimization-hungry GraphQL APIs, and
- hand-crafted SQL APIs. But no option really lets a web app be careless
- about its data-fetching layer. Web applications can’t sit on top of
- independently-designed APIs: to have a chance at performance, the
- application and its datasource need to be designed as one.
+None of these solutions are silver bullets: I’ve worked with overly-strict REST
+APIs, optimization-hungry GraphQL APIs, and hand-crafted SQL APIs. But no
+option really lets a web app be careless about its data-fetching layer. Web
+applications can’t sit on top of independently-designed APIs: to have a chance
+at performance, the application and its datasource need to be designed as one.
Data fetching
- Speaking of data fetching. It’s really important and really bizarre in
- React land. Years ago, I expected that some good patterns would emerge.
- Frankly, they didn’t.
+Speaking of data fetching. It’s really important and really bizarre in React
+land. Years ago, I expected that some good patterns would emerge. Frankly, they
+didn’t.
- There are decent patterns in the form of GraphQL, but for a React
- component that loads data with fetch from an API, the solutions have
- only gotten weirder. There’s great documentation for everything else,
- but old-fashioned data loading is relegated to one example of how to
- mock out ‘fetch’ for testing, and lots of Medium posts of varying
- quality.
- __________________________________________________________________
+There are decent patterns in the form of GraphQL, but for a React component
+that loads data with fetch from an API, the solutions have only gotten weirder.
+There’s great documentation for everything else, but old-fashioned data loading
+is relegated to one example of how to mock out ‘fetch’ for testing, and lots of
+Medium posts of varying quality.
- Don’t read this as anti-React. I still think React is pretty great, and
- for a particular set of use cases it’s the best tool you can find. And
- I explicitly want to say that – from what I’ve seen – most other
- Single-Page-Application tools share most of these problems. They’re
- issues with the pattern, not the specific frameworks used to implement
- it. React alternatives have some great ideas, and they might be better,
- but they are ultimately really similar.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- But I’m at the point where I look at where the field is and what the
- alternative patterns are – taking a second look at unloved, unpopular,
- uncool things like Django, Rails, Laravel – and think what the heck is
- happening. We’re layering optimizations upon optimizations in order to
- get the SPA-like pattern to fit every use case, and I’m not sure that
- it is, well, worth it.
+Don’t read this as anti-React. I still think React is pretty great, and for a
+particular set of use cases it’s the best tool you can find. And I explicitly
+want to say that – from what I’ve seen – most other Single-Page-Application
+tools share most of these problems. They’re issues with the pattern, not the
+specific frameworks used to implement it. React alternatives have some great
+ideas, and they might be better, but they are ultimately really similar.
- And it should be easy to do a good job.
+But I’m at the point where I look at where the field is and what the
+alternative patterns are – taking a second look at unloved, unpopular, uncool
+things like Django, Rails, Laravel – and think what the heck is happening.
+We’re layering optimizations upon optimizations in order to get the SPA-like
+pattern to fit every use case, and I’m not sure that it is, well, worth it.
- Frameworks should lure people into the [16]pit of success, where
- following the normal rules and using normal techniques is the winning
- approach.
+And it should be easy to do a good job.
- I don’t think that React, in this context, really is that pit of
- success. A naïvely implemented React SPA isn’t stable, or efficient,
- and it doesn’t naturally scale to significant complexity.
+Frameworks should lure people into the [14]pit of success, where following the
+normal rules and using normal techniques is the winning approach.
- You can add optimizations on top of it that fix those problems, or you
- can use a framework like Next.js that will include those optimizations
- by default. That’ll help you get pretty far. But then you’ll be lured
- by all of the easy one-click ways to add bloat and complexity. You’ll
- be responsible for keeping some of these complex, finicky optimizations
- working properly.
+I don’t think that React, in this context, really is that pit of success. A
+naïvely implemented React SPA isn’t stable, or efficient, and it doesn’t
+naturally scale to significant complexity.
- And for what? Again - there is a swath of use cases which would be hard
- without React and which aren’t complicated enough to push beyond
- React’s limits. But there are also a lot of problems for which I can’t
- see any concrete benefit to using React. Those are things like blogs,
- shopping-cart-websites, mostly-[17]CRUD-and-forms-websites. For these
- things, all of the fancy optimizations are trying to get you closer to
- the performance you would’ve gotten if you just hadn’t used so much
- technology.
+You can add optimizations on top of it that fix those problems, or you can use
+a framework like Next.js that will include those optimizations by default.
+That’ll help you get pretty far. But then you’ll be lured by all of the easy
+one-click ways to add bloat and complexity. You’ll be responsible for keeping
+some of these complex, finicky optimizations working properly.
- I can, for example, guarantee that this blog is faster than any Gatsby
- blog (and much love to the Gatsby team) because there is nothing that a
- React static site can do that will make it faster than a non-React
- static site.
- __________________________________________________________________
+And for what? Again - there is a swath of use cases which would be hard without
+React and which aren’t complicated enough to push beyond React’s limits. But
+there are also a lot of problems for which I can’t see any concrete benefit to
+using React. Those are things like blogs, shopping-cart-websites, mostly-[15]
+CRUD-and-forms-websites. For these things, all of the fancy optimizations are
+trying to get you closer to the performance you would’ve gotten if you just
+hadn’t used so much technology.
- But the cultural tides are strong. Building a company on Django in 2020
- seems like the equivalent of driving a PT Cruiser and blasting Faith
- Hill’s “Breathe” on a CD while your friends are listening to The Weeknd
- in their Teslas. Swimming against this current isn’t easy, and not in a
- trendy contrarian way.
+I can, for example, guarantee that this blog is faster than any Gatsby blog
+(and much love to the Gatsby team) because there is nothing that a React static
+site can do that will make it faster than a non-React static site.
- I don’t think that everyone’s using the SPA pattern for no reason. For
- large corporations, it allows teams to work independently: the
- “frontend engineers” can “consume” “APIs” from teams that probably work
- in a different language and can only communicate through the hierarchy.
- For heavily interactive applications, it has real benefits in
- modularity, performance, and structure. And it’s beneficial for
- companies to shift computing requirements from their servers to their
- customers browsers: a real win for reducing their spend on
- infrastructure.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- But I think there are a lot of problems that are better solved some
- other way. There’s no category winner like React as an alternative.
- Ironically, backends are churning through technology even faster than
- frontends, which have been loyal to one programming language for
- decades. There are some age-old technologies like Rails, Django, and
- Laravel, and there are a few halfhearted attempts to do templating and
- “serve web pages” from Go, Node, and other new languages. If you go
- this way, you’re beset by the cognitive dissonance of following in the
- footsteps of enormous projects - Wikipedia rendering web pages in PHP,
- Craigslist rendering webpages in Perl - but being far outside the norms
- of modern web development. If Wikipedia were started today, it’d be
- React. Maybe?
+But the cultural tides are strong. Building a company on Django in 2020 seems
+like the equivalent of driving a PT Cruiser and blasting Faith Hill’s “Breathe”
+on a CD while your friends are listening to The Weeknd in their Teslas.
+Swimming against this current isn’t easy, and not in a trendy contrarian way.
- What if everyone’s wrong? We’ve been wrong before.
- Follow-ups & commmentary
- * [18]"In defense of the modern web", Rich Harris
- * [19]Friday Night Deploys (Podcast) #22: A Brief Discussion On The
- State Of The Modern Web
- * [20]Frontend First (Podcast): Read & Discuss
- * [21]A Ready-To-Try Concept in Response to “Second-guessing the
- modern web”
+I don’t think that everyone’s using the SPA pattern for no reason. For large
+corporations, it allows teams to work independently: the “frontend engineers”
+can “consume” “APIs” from teams that probably work in a different language and
+can only communicate through the hierarchy. For heavily interactive
+applications, it has real benefits in modularity, performance, and structure.
+And it’s beneficial for companies to shift computing requirements from their
+servers to their customers browsers: a real win for reducing their spend on
+infrastructure.
- May 10, 2020 [22]Tom MacWright ([23]@tmcw, [24]@tmcw@mastodon.social)
+But I think there are a lot of problems that are better solved some other way.
+There’s no category winner like React as an alternative. Ironically, backends
+are churning through technology even faster than frontends, which have been
+loyal to one programming language for decades. There are some age-old
+technologies like Rails, Django, and Laravel, and there are a few halfhearted
+attempts to do templating and “serve web pages” from Go, Node, and other new
+languages. If you go this way, you’re beset by the cognitive dissonance of
+following in the footsteps of enormous projects - Wikipedia rendering web pages
+in PHP, Craigslist rendering webpages in Perl - but being far outside the norms
+of modern web development. If Wikipedia were started today, it’d be React.
+Maybe?
-References
+What if everyone’s wrong? We’ve been wrong before.
- 1. https://macwright.com/micro/rss.xml
- 2. https://macwright.com/micro/atom.xml
- 3. https://macwright.com/
- 4. https://macwright.com/reading/
- 5. https://macwright.com/photos/
- 6. https://macwright.com/projects/
- 7. https://macwright.com/drawings/
- 8. https://macwright.com/micro/
- 9. https://macwright.com/about/
- 10. https://www.mapbox.com/mapbox-studio/
- 11. https://observablehq.com/
- 12. https://docs.mapbox.com/mapbox-gl-js/api/
- 13. https://github.com/observablehq/runtime
- 14. https://web.dev/interactive/
- 15. https://engineering.shopify.com/blogs/engineering/solving-the-n-1-problem-for-graphql-through-batching
- 16. https://blog.codinghorror.com/falling-into-the-pit-of-success/
- 17. https://en.wikipedia.org/wiki/Create,_read,_update_and_delete
- 18. https://dev.to/richharris/in-defense-of-the-modern-web-2nia
- 19. https://dev.to/devplebs/friday-night-deploys-22-a-brief-discussion-on-the-state-of-the-modern-web-2961
- 20. https://frontendfirst.fm/episodes/read-and-discuss-second-guessing-the-modern-web
- 21. https://medium.com/@kevinkirchner/a-ready-to-try-concept-in-response-to-second-guessing-the-modern-web-6946ec4d0598
- 22. https://macwright.com/about/
- 23. https://twitter.com/intent/follow?screen_name=tmcw&user_id=1458271
- 24. https://mastodon.social/@tmcw
+Follow-ups & commmentary
+
+ • [16]"In defense of the modern web", Rich Harris
+ • [17]Friday Night Deploys (Podcast) #22: A Brief Discussion On The State Of
+ The Modern Web
+ • [18]Frontend First (Podcast): Read & Discuss
+ • [19]A Ready-To-Try Concept in Response to “Second-guessing the modern web”
+
+May 10, 2020 [20]Tom MacWright ([21]@tmcw, [22]@tmcw@mastodon.social)
+
+
+References:
+
+[1] https://macwright.com/
+[2] https://macwright.com/reading/
+[3] https://macwright.com/photos/
+[4] https://macwright.com/projects/
+[5] https://macwright.com/drawings/
+[6] https://macwright.com/micro/
+[7] https://macwright.com/about/
+[8] https://www.mapbox.com/mapbox-studio/
+[9] https://observablehq.com/
+[10] https://docs.mapbox.com/mapbox-gl-js/api/
+[11] https://github.com/observablehq/runtime
+[12] https://web.dev/interactive/
+[13] https://engineering.shopify.com/blogs/engineering/solving-the-n-1-problem-for-graphql-through-batching
+[14] https://blog.codinghorror.com/falling-into-the-pit-of-success/
+[15] https://en.wikipedia.org/wiki/Create,_read,_update_and_delete
+[16] https://dev.to/richharris/in-defense-of-the-modern-web-2nia
+[17] https://dev.to/devplebs/friday-night-deploys-22-a-brief-discussion-on-the-state-of-the-modern-web-2961
+[18] https://frontendfirst.fm/episodes/read-and-discuss-second-guessing-the-modern-web
+[19] https://medium.com/@kevinkirchner/a-ready-to-try-concept-in-response-to-second-guessing-the-modern-web-6946ec4d0598
+[20] https://macwright.com/about/
+[21] https://twitter.com/intent/follow?screen_name=tmcw&user_id=1458271
+[22] https://mastodon.social/@tmcw
diff --git a/static/archive/maggieappleton-com-7am49k.txt b/static/archive/maggieappleton-com-7am49k.txt
index 9925cfb..beee885 100644
--- a/static/archive/maggieappleton-com-7am49k.txt
+++ b/static/archive/maggieappleton-com-7am49k.txt
@@ -1,150 +1,145 @@
- #[1]Main RSS Feed
+[1]Home
+The Garden
+[3]Now
+[4]About
+notes
- [2]Home
- The Garden (BUTTON)
- [3]Now
- [4]About
- (BUTTON)
-
- notes
-
- evergreen
+evergreen
What App is That?
- A guide to the apps and tools I use to create illustrations
- * [5]How to Illustrate
+A guide to the apps and tools I use to create illustrations
- Planted over 3 years agoLast tended over 2 years ago
+ • [6]How to Illustrate
- (BUTTON) Back To Top
+Planted over 3 years agoLast tended over 2 years ago
+Back To Top
- "What app is that?"
- [6]
+ "What app is that?"
+
+[8]
I'm a Promiscuous Polytooler
- I use wide variety of different tools and apps for different kinds of
- visual creations. I'm not wedded to any one tool in particular – they
- all have their strengths and weaknesses. I'll use whatever fits the
- task at hand and move work between them liberally.
+I use wide variety of different tools and apps for different kinds of visual
+creations. I'm not wedded to any one tool in particular – they all have their
+strengths and weaknesses. I'll use whatever fits the task at hand and move work
+between them liberally.
- Here's all the apps and hardware that might be involved in a particular
- creation...
+Here's all the apps and hardware that might be involved in a particular
+creation...
- None of these are affiliate links - I'm just pointing you to official
- sites for more context
- [7]
+None of these are affiliate links - I'm just pointing you to official sites for
+more context
+
+[9]
Workflows
- And here's a couple of my common workflows for different styles of
- illustrations and visuals...
+And here's a couple of my common workflows for different styles of
+illustrations and visuals...
1. Illustrated notes
- Anything I make that has a painterly and loose hand-drawn feel was made
- in Procreate on the iPad or Photoshop on the Wacom Cintiq. Or probably
- a combination – it's easy to move files back and forth between the two
- and the tools they offer are very similar.
+Anything I make that has a painterly and loose hand-drawn feel was made in
+Procreate on the iPad or Photoshop on the Wacom Cintiq. Or probably a
+combination – it's easy to move files back and forth between the two and the
+tools they offer are very similar.
- Illustrations like these...
+Illustrations like these...
- Both of these applications allow you to draw in “raster” graphics,
- meaning you paint pixels onto a canvas. They require a decent level of
- hand-skills to make sure your lines aren't wobbly, although both
- applications have smoothing features to help with that.
+Both of these applications allow you to draw in “raster” graphics, meaning you
+paint pixels onto a canvas. They require a decent level of hand-skills to make
+sure your lines aren't wobbly, although both applications have smoothing
+features to help with that.
- When I'm in Procreate I use a small selection of brushes I've gathered
- over the years. It's hard for me to remember where they're all from,
- and I've customised the majority of them to suit my personal prefs.
- Most of them were originally from Max Ulichney's brushes. I have the
- essentials set ($2), the painters set ($8), and the comics set ($15),
- and can vouch they're all great.
+When I'm in Procreate I use a small selection of brushes I've gathered over the
+years. It's hard for me to remember where they're all from, and I've customised
+the majority of them to suit my personal prefs. Most of them were originally
+from Max Ulichney's brushes. I have the essentials set ($2), the painters set
+($8), and the comics set ($15), and can vouch they're all great.
- I move these pieces to Photoshop if I want to work on a larger screen,
- or have accidentally enlarged the canvas to a 14000px wide sprawling
- set of sketches that Procreate can't open without crashing.
+I move these pieces to Photoshop if I want to work on a larger screen, or have
+accidentally enlarged the canvas to a 14000px wide sprawling set of sketches
+that Procreate can't open without crashing.
2. Polished vector illustrations
- Illustrations that look more “polished” are made primarily in Adobe
- Illustrator, with a touch of Photoshop at the end for lighting effects
- and texture.
+Illustrations that look more “polished” are made primarily in Adobe
+Illustrator, with a touch of Photoshop at the end for lighting effects and
+texture.
- Pieces like these...
+Pieces like these...
- These illustrations are all vector-based, meaning we use mathematical
- curves to define their shapes, rather than painted pixels. Vectors are
- great for create hard, crisp edges and working with perfect geometric
- forms.
+These illustrations are all vector-based, meaning we use mathematical curves to
+define their shapes, rather than painted pixels. Vectors are great for create
+hard, crisp edges and working with perfect geometric forms.
- While I love vectors for laying down the foundation shapes of these,
- I'll move them over the Photoshop once they're 90% done to adjust the
- colors, add more subtlety to the lighting and shadows, and chuck a bit
- of texture on the top so they feel more tangible.
+While I love vectors for laying down the foundation shapes of these, I'll move
+them over the Photoshop once they're 90% done to adjust the colors, add more
+subtlety to the lighting and shadows, and chuck a bit of texture on the top so
+they feel more tangible.
- Want to share? (BUTTON) Tell Twitter About It
+Want to share?Tell Twitter About It
3 Backlinks
Why You Own an iPad and Still Can't Draw
- The failure of drawing materials without mediums and meat
+The failure of drawing materials without mediums and meat
Frequently Asked Questions
- Questions I am often asked to answer
+Questions I am often asked to answer
The Best Illustration Books and Courses
- My favourite resources for learning to draw and developing your visual
- thinking skills
+My favourite resources for learning to draw and developing your visual thinking
+skills
Mentions around the web
- Tomiwa 😃
- Maggie Appleton - indieweb.social/@maggie
- 2 Likes and Retweets
+Tomiwa 😃
+Maggie Appleton - indieweb.social/@maggie
+2 Likes and Retweets
Want to stay up to date?
- (BUTTON) Subscribe via RSS Feed
- © 2024 Maggie Appleton
- * [8]The Garden
- * [9]Essays
- * [10]About
- * [11]Notes
- * [12]Now
- * [13]Patterns
- * [14]Library
- * [15]Projects
- * [16]Colophon
+Subscribe via RSS Feed
+[12][13][14][15][16]
+© 2024 Maggie Appleton
-References
+ • [17]The Garden
+ • [18]Essays
+ • [19]About
+ • [20]Notes
+ • [21]Now
+ • [22]Patterns
+ • [23]Library
+ • [24]Projects
+ • [25]Colophon
- Visible links:
- 1. https://maggieappleton.com/rss.xml
- 2. https://maggieappleton.com/
- 3. https://maggieappleton.com/now
- 4. https://maggieappleton.com/about
- 5. https://maggieappleton.com/topics/how-to-illustrate
- 6. https://maggieappleton.com/apps#im-a-promiscuous-polytooler
- 7. https://maggieappleton.com/apps#workflows
- 8. https://maggieappleton.com/garden
- 9. https://maggieappleton.com/essays
- 10. https://maggieappleton.com/about
- 11. https://maggieappleton.com/notes
- 12. https://maggieappleton.com/now
- 13. https://maggieappleton.com/patterns
- 14. https://maggieappleton.com/library
- 15. https://maggieappleton.com/projects
- 16. https://maggieappleton.com/colophon
- Hidden links:
- 18. https://github.com/MaggieAppleton
- 19. https://uk.linkedin.com/in/maggieappleton
- 20. https://dribbble.com/mappleton
- 21. https://twitter.com/Mappletons
- 22. https://indieweb.social/@maggie
+References:
+
+[1] https://maggieappleton.com/
+[3] https://maggieappleton.com/now
+[4] https://maggieappleton.com/about
+[6] https://maggieappleton.com/topics/how-to-illustrate
+[8] https://maggieappleton.com/apps#im-a-promiscuous-polytooler
+[9] https://maggieappleton.com/apps#workflows
+[12] https://github.com/MaggieAppleton
+[13] https://uk.linkedin.com/in/maggieappleton
+[14] https://dribbble.com/mappleton
+[15] https://twitter.com/Mappletons
+[16] https://indieweb.social/@maggie
+[17] https://maggieappleton.com/garden
+[18] https://maggieappleton.com/essays
+[19] https://maggieappleton.com/about
+[20] https://maggieappleton.com/notes
+[21] https://maggieappleton.com/now
+[22] https://maggieappleton.com/patterns
+[23] https://maggieappleton.com/library
+[24] https://maggieappleton.com/projects
+[25] https://maggieappleton.com/colophon
diff --git a/static/archive/maggieappleton-com-fube9k.txt b/static/archive/maggieappleton-com-fube9k.txt
index aa2b115..81bd7a3 100644
--- a/static/archive/maggieappleton-com-fube9k.txt
+++ b/static/archive/maggieappleton-com-fube9k.txt
@@ -1,135 +1,128 @@
- #[1]Main RSS Feed
+[1]Home
+The Garden
+[3]Now
+[4]About
+Essays
- [2]Home
- The Garden (BUTTON)
- [3]Now
- [4]About
- (BUTTON)
-
- Essays
-
- budding
+budding
Why You Own an iPad and Still Can't Draw
- The failure of drawing materials without mediums and meat
- * [5]How to Illustrate
+The failure of drawing materials without mediums and meat
- Planted over 3 years agoLast tended over 3 years ago
+ • [6]How to Illustrate
- (BUTTON) Back To Top
+Planted over 3 years agoLast tended over 3 years ago
+Back To Top
+Assumed Audience
- Assumed Audience
+Anyone who thinks they can't draw, but would like to learn
- Anyone who thinks they can't draw, but would like to learn
+They message me a lot.
- They message me a lot.
+ Which iPad should I buy? What app do you use? What brush is that? What size
+ should my canvas be?
- Which iPad should I buy? What app do you use? What brush is that?
- What size should my canvas be?
+These questions aren't wrong. In fact they're perfectly reasonable.
- These questions aren't wrong. In fact they're perfectly reasonable.
+I'm vocal about the fact many of my illustrations are made on in an app called
+. I have a full post about my drawing equipment and workflows over at
+[8]What App is That?
- I'm vocal about the fact many of my illustrations are made on in an app
- called . I have a full post about my drawing equipment and workflows
- over at
- [6]What App is That?
+How are you supposed to draw if you don't also have these fancy tools?
- How are you supposed to draw if you don't also have these fancy tools?
+This is the tricky bit.
- This is the tricky bit.
+If you go out and buy yourself these same things, you'll have all the right
+materials to draw. But that's only the dressing on the drawing dish.
- If you go out and buy yourself these same things, you'll have all the
- right materials to draw. But that's only the dressing on the drawing
- dish.
- [7]
+[9]
What you have is Material without the Medium or the Meat
- What on earth do I mean by material, medium, and meat?
- __________________________________________________________________
+What on earth do I mean by material, medium, and meat?
- [8]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[10]
Moving past materials
- Worrying about the materials should take up - at most - 10% of your
- attention and concern. Focus 70% of your attention on learning the
- medium while you're just starting out.
+Worrying about the materials should take up - at most - 10% of your attention
+and concern. Focus 70% of your attention on learning the medium while you're
+just starting out.
- You can keep 20% of your focus on the Meat. But I wouldn't worry too
- much about communicating original, profound ideas at first. Doing so in
- addition to learning a whole new language is going to be overwhelming.
+You can keep 20% of your focus on the Meat. But I wouldn't worry too much about
+communicating original, profound ideas at first. Doing so in addition to
+learning a whole new language is going to be overwhelming.
- In the same way it's a bad idea to learn Spanish while simultaneously
- trying to write a philosophy dissertation in it.
+In the same way it's a bad idea to learn Spanish while simultaneously trying to
+write a philosophy dissertation in it.
- Once you get more comfortable “speaking" in visual language, you'll be
- able to shift a much higher percentage of your attention onto the Meat.
- You'll get to focus on The Thing You Want to Say, and know enough
- visual language to say it well.
+Once you get more comfortable “speaking" in visual language, you'll be able to
+shift a much higher percentage of your attention onto the Meat. You'll get to
+focus on The Thing You Want to Say, and know enough visual language to say it
+well.
- That's the ideal I'm currently striving for. To reach a point where the
- Material is irrelevant, the Medium is a baked into my subconscious, and
- I'm all about the Meat.
+That's the ideal I'm currently striving for. To reach a point where the
+Material is irrelevant, the Medium is a baked into my subconscious, and I'm all
+about the Meat.
- That's the goal. Don't let the shiny iPad reflection blind you.
+That's the goal. Don't let the shiny iPad reflection blind you.
- Get past picking the Material. Focus on the Medium. Aim for the Meat.
+Get past picking the Material. Focus on the Medium. Aim for the Meat.
- Want to share? (BUTTON) Tell Twitter About It
+Want to share?Tell Twitter About It
1 Backlinks
The Best Illustration Books and Courses
- My favourite resources for learning to draw and developing your visual
- thinking skills
+My favourite resources for learning to draw and developing your visual thinking
+skills
Mentions around the web
- Tomiwa 😃
- Maggie Appleton - indieweb.social/@maggie
- 2 Likes and Retweets
+Tomiwa 😃
+Maggie Appleton - indieweb.social/@maggie
+2 Likes and Retweets
Want to stay up to date?
- (BUTTON) Subscribe via RSS Feed
- © 2024 Maggie Appleton
- * [9]The Garden
- * [10]Essays
- * [11]About
- * [12]Notes
- * [13]Now
- * [14]Patterns
- * [15]Library
- * [16]Projects
- * [17]Colophon
+Subscribe via RSS Feed
+[13][14][15][16][17]
+© 2024 Maggie Appleton
-References
+ • [18]The Garden
+ • [19]Essays
+ • [20]About
+ • [21]Notes
+ • [22]Now
+ • [23]Patterns
+ • [24]Library
+ • [25]Projects
+ • [26]Colophon
- Visible links:
- 1. https://maggieappleton.com/rss.xml
- 2. https://maggieappleton.com/
- 3. https://maggieappleton.com/now
- 4. https://maggieappleton.com/about
- 5. https://maggieappleton.com/topics/how-to-illustrate
- 6. https://maggieappleton.com/apps
- 7. https://maggieappleton.com/still-cant-draw#what-you-have-is-material-without-the-medium-or-the-meat
- 8. https://maggieappleton.com/still-cant-draw#moving-past-materials
- 9. https://maggieappleton.com/garden
- 10. https://maggieappleton.com/essays
- 11. https://maggieappleton.com/about
- 12. https://maggieappleton.com/notes
- 13. https://maggieappleton.com/now
- 14. https://maggieappleton.com/patterns
- 15. https://maggieappleton.com/library
- 16. https://maggieappleton.com/projects
- 17. https://maggieappleton.com/colophon
- Hidden links:
- 19. https://github.com/MaggieAppleton
- 20. https://uk.linkedin.com/in/maggieappleton
- 21. https://dribbble.com/mappleton
- 22. https://twitter.com/Mappletons
- 23. https://indieweb.social/@maggie
+References:
+
+[1] https://maggieappleton.com/
+[3] https://maggieappleton.com/now
+[4] https://maggieappleton.com/about
+[6] https://maggieappleton.com/topics/how-to-illustrate
+[8] https://maggieappleton.com/apps
+[9] https://maggieappleton.com/still-cant-draw#what-you-have-is-material-without-the-medium-or-the-meat
+[10] https://maggieappleton.com/still-cant-draw#moving-past-materials
+[13] https://github.com/MaggieAppleton
+[14] https://uk.linkedin.com/in/maggieappleton
+[15] https://dribbble.com/mappleton
+[16] https://twitter.com/Mappletons
+[17] https://indieweb.social/@maggie
+[18] https://maggieappleton.com/garden
+[19] https://maggieappleton.com/essays
+[20] https://maggieappleton.com/about
+[21] https://maggieappleton.com/notes
+[22] https://maggieappleton.com/now
+[23] https://maggieappleton.com/patterns
+[24] https://maggieappleton.com/library
+[25] https://maggieappleton.com/projects
+[26] https://maggieappleton.com/colophon
diff --git a/static/archive/maggieappleton-com-n6xsqa.txt b/static/archive/maggieappleton-com-n6xsqa.txt
index 7cce61a..0ae8ac1 100644
--- a/static/archive/maggieappleton-com-n6xsqa.txt
+++ b/static/archive/maggieappleton-com-n6xsqa.txt
@@ -1,772 +1,738 @@
- #[1]Main RSS Feed
+[1]Home
+The Garden
+[3]Now
+[4]About
+Essays
- [2]Home
- The Garden (BUTTON)
- [3]Now
- [4]About
- (BUTTON)
-
- Essays
-
- evergreen
+evergreen
A Brief History & Ethos of the Digital Garden
- A newly revived philosophy for publishing personal knowledge on the web
- * [5]Digital Gardening
- * [6]Personal Knowledge
- * [7]The Web
+A newly revived philosophy for publishing personal knowledge on the web
- Planted over 3 years agoLast tended over 2 years ago
+ • [6]Digital Gardening
+ • [7]Personal Knowledge
+ • [8]The Web
- (BUTTON) Back To Top
+Planted over 3 years agoLast tended over 2 years ago
+Back To Top
Table of Contents
- [8]A Brief History of Digital Gardens[9]The Early Gardens of
- Hypertext[10]Digital Puttering on Twitter[11]Gardens, Streams, and
- Caufield's Metaphors[12]Carrying on Caufield[13]Digital Gardening's
- Fertile Soil[14]Developer-led Gardening[15]The Six Patterns of
- Gardening[16]1. Topography over Timelines[17]2. Continuous Growth[18]3.
- Imperfection & Learning in Public[19]4. Playful, Personal, and
- Experimental[20]5. Intercropping & Content Diversity[21]6. Independent
- Ownership
+[10]A Brief History of Digital Gardens[11]The Early Gardens of Hypertext[12]
+Digital Puttering on Twitter[13]Gardens, Streams, and Caufield's Metaphors[14]
+Carrying on Caufield[15]Digital Gardening's Fertile Soil[16]Developer-led
+Gardening[17]The Six Patterns of Gardening[18]1. Topography over Timelines[19]
+2. Continuous Growth[20]3. Imperfection & Learning in Public[21]4. Playful,
+Personal, and Experimental[22]5. Intercropping & Content Diversity[23]6.
+Independent Ownership
Table of Contents
- [22]A Brief History of Digital Gardens[23]The Early Gardens of
- Hypertext[24]Digital Puttering on Twitter[25]Gardens, Streams, and
- Caufield's Metaphors[26]Carrying on Caufield[27]Digital Gardening's
- Fertile Soil[28]Developer-led Gardening[29]The Six Patterns of
- Gardening[30]1. Topography over Timelines[31]2. Continuous Growth[32]3.
- Imperfection & Learning in Public[33]4. Playful, Personal, and
- Experimental[34]5. Intercropping & Content Diversity[35]6. Independent
- Ownership
- Loading...
+[24]A Brief History of Digital Gardens[25]The Early Gardens of Hypertext[26]
+Digital Puttering on Twitter[27]Gardens, Streams, and Caufield's Metaphors[28]
+Carrying on Caufield[29]Digital Gardening's Fertile Soil[30]Developer-led
+Gardening[31]The Six Patterns of Gardening[32]1. Topography over Timelines[33]
+2. Continuous Growth[34]3. Imperfection & Learning in Public[35]4. Playful,
+Personal, and Experimental[36]5. Intercropping & Content Diversity[37]6.
+Independent Ownership
+Loading...
- My highlighted a number of sites that are taking a new approach to the
- way we publish personal knowledge on the web.
+My highlighted a number of sites that are taking a new approach to the way we
+publish personal knowledge on the web.
- They're not following the conventions of the "personal blog," as we've
- come to know it. Rather than presenting a set of polished articles,
- displayed in reverse chronological order, these sites act more like
- free form, work-in-progress wikis.
+They're not following the conventions of the "personal blog," as we've come to
+know it. Rather than presenting a set of polished articles, displayed in
+reverse chronological order, these sites act more like free form,
+work-in-progress wikis.
- A garden is a collection of evolving ideas that aren't strictly
- organised by their publication date. They're inherently exploratory –
- notes are linked through contextual associations. They aren't refined
- or complete - notes are published as half-finished thoughts that will
- grow and evolve over time. They're less rigid, less performative, and
- less perfect than the personal websites we're used to seeing.
+A garden is a collection of evolving ideas that aren't strictly organised by
+their publication date. They're inherently exploratory – notes are linked
+through contextual associations. They aren't refined or complete - notes are
+published as half-finished thoughts that will grow and evolve over time.
+They're less rigid, less performative, and less perfect than the personal
+websites we're used to seeing.
- It harkens back to the early days of the web when people had fewer
- notions of how websites "should be.” It's an ethos that is both
- classically old and newly imagined.
- __________________________________________________________________
+It harkens back to the early days of the web when people had fewer notions of
+how websites "should be.” It's an ethos that is both classically old and newly
+imagined.
- [36]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[38]
A Brief History of Digital Gardens
- Let's go on a short journey to the origin of this word. The notion of a
- digital garden is not a 2020 invention. It's been floating around for
- over two decades. However, it's passed through a couple of semantic
- shifts in that time, meaning different things to different people
- across the years. As words tend to do.
+Let's go on a short journey to the origin of this word. The notion of a digital
+garden is not a 2020 invention. It's been floating around for over two decades.
+However, it's passed through a couple of semantic shifts in that time, meaning
+different things to different people across the years. As words tend to do.
- Tracing back how
- [37]Neologisms
- are born helps us understand why anyone needed this word in the first
- place. Language is always a response to the evolving world around us –
- we expand it when our current vocabulary fails to capture what we're
- observing, or have a particular desire for how we'd like the future to
- unfold. Naming is a political act as much as a poetic one.
+Tracing back how
+[39]Neologisms
+are born helps us understand why anyone needed this word in the first place.
+Language is always a response to the evolving world around us – we expand it
+when our current vocabulary fails to capture what we're observing, or have a
+particular desire for how we'd like the future to unfold. Naming is a political
+act as much as a poetic one.
The Early Gardens of Hypertext
- Mark Bernstein's 1998 essay appears to be the first recorded mention of
- the term. Mark was part of the early hypertext crowd – the developers
- figuring out how to arrange and present this new medium.
+Mark Bernstein's 1998 essay appears to be the first recorded mention of the
+term. Mark was part of the early hypertext crowd – the developers figuring out
+how to arrange and present this new medium.
- While the essay is a beautiful ode to free-wheeling internet
- exploration, it's less about building personal internet spaces, and
- more of a manifesto on user experience flows and content organisation.
+While the essay is a beautiful ode to free-wheeling internet exploration, it's
+less about building personal internet spaces, and more of a manifesto on user
+experience flows and content organisation.
- Let's note that Mark's graphics are to die for
+Let's note that Mark's graphics are to die for
- To put this in its historical context, Mark's writing was part of a
- larger conversation happening throughout the nineties around hypertext
- and its metaphorical framing.
+To put this in its historical context, Mark's writing was part of a larger
+conversation happening throughout the nineties around hypertext and its
+metaphorical framing.
- The early web-adopters were caught up in the idea of The Web as a
- labyrinth-esque community landscape tended by and These creators wanted
- to enable pick-your-own-path experiences, while also providing enough
- signposts that people didn't feel lost in their new, strange medium.
+The early web-adopters were caught up in the idea of The Web as a
+labyrinth-esque community landscape tended by and These creators wanted to
+enable pick-your-own-path experiences, while also providing enough signposts
+that people didn't feel lost in their new, strange medium.
- The early web debates around this became known as – the issue of how to
- give web users just enough guidance to freely explore the web, without
- forcing them into pre-defined browsing experiences. The eternal
- struggle to find the right balance of chaos and structure.
+The early web debates around this became known as – the issue of how to give
+web users just enough guidance to freely explore the web, without forcing them
+into pre-defined browsing experiences. The eternal struggle to find the right
+balance of chaos and structure.
- "Unplanned hypertext sprawl is wilderness: complex and interesting,
- but uninviting. Interesting things await us in the thickets, but we
- may be reluctant to plough through the brush, subject to thorns and
- mosquitoes"
+ "Unplanned hypertext sprawl is wilderness: complex and interesting, but
+ uninviting. Interesting things await us in the thickets, but we may be
+ reluctant to plough through the brush, subject to thorns and mosquitoes"
- While Mark's essay was concerned with different problems to the ones we
- face on the web today, its core ethos feels aligned with our emerging
- understanding of digital gardening. It captures the desire for
- exploratory experiences, a welcoming of digital weirdness, and a
- healthy amount of resistance to top-down structures.
+While Mark's essay was concerned with different problems to the ones we face on
+the web today, its core ethos feels aligned with our emerging understanding of
+digital gardening. It captures the desire for exploratory experiences, a
+welcoming of digital weirdness, and a healthy amount of resistance to top-down
+structures.
- After Mark's essay the term digital gardening goes quiet for nearly a
- decade.
+After Mark's essay the term digital gardening goes quiet for nearly a decade.
Digital Puttering on Twitter
- In April of 2007 when Tweets first started ringing through the internet
- airwaves, Rory Sutherland (oddly, the vice president of Ogilvy Group)
- used the term "digital gardening", but defined it as "faffing about
- syncing things, defragging - like pruning for young people"
- Loading...
+In April of 2007 when Tweets first started ringing through the internet
+airwaves, Rory Sutherland (oddly, the vice president of Ogilvy Group) used the
+term "digital gardening", but defined it as "faffing about syncing things,
+defragging - like pruning for young people"
- The next dozen mentions on Twitter all followed this sentiment – people
- were using the term as a way to describe digital maintenance - the act
- of cleaning up one's digital space. The focus was on sorting, weeding,
- pruning, and decluttering, rather than growing and cultivating. People
- mentioned cleaning out private folders, codebases, and photo albums as
- the focus of their gardening efforts.
+Loading...
- These people were digital puttering more than gardening.
- Loading...
- Loading...
- Loading...
+The next dozen mentions on Twitter all followed this sentiment – people were
+using the term as a way to describe digital maintenance - the act of cleaning
+up one's digital space. The focus was on sorting, weeding, pruning, and
+decluttering, rather than growing and cultivating. People mentioned cleaning
+out private folders, codebases, and photo albums as the focus of their
+gardening efforts.
- Since none of these folks reference to the earlier nineties notion of
- digital gardening, or mention issues of hypertext navigation, this use
- of the word feels like a brief tangent. Given the tiny size of Twitter
- in the early days, these people probably belonged to the same social
- flocks and were riffing off one another. It's not necessarily part of
- the mainstream narrative we're tracking, but shows there's not one
- strict meaning to the term.
+These people were digital puttering more than gardening.
- That said, some degree of faffing about, sorting, and pruning are
- certainly part of the practice of digital gardening. Though best
- enjoyed in moderation.
+Loading...
+Loading...
+Loading...
+
+Since none of these folks reference to the earlier nineties notion of digital
+gardening, or mention issues of hypertext navigation, this use of the word
+feels like a brief tangent. Given the tiny size of Twitter in the early days,
+these people probably belonged to the same social flocks and were riffing off
+one another. It's not necessarily part of the mainstream narrative we're
+tracking, but shows there's not one strict meaning to the term.
+
+That said, some degree of faffing about, sorting, and pruning are certainly
+part of the practice of digital gardening. Though best enjoyed in moderation.
Gardens, Streams, and Caufield's Metaphors
- At the 2015 Digital Learning Research Network, Mike Caufield delivered
- a keynote on . It later becomes that lays the foundations for our
- current understanding of the term. If anyone should be considered the
- original source of digital gardening, it's Caufield. They are the first
- to lay out this whole idea in poetic, coherent words.
+At the 2015 Digital Learning Research Network, Mike Caufield delivered a
+keynote on . It later becomes that lays the foundations for our current
+understanding of the term. If anyone should be considered the original source
+of digital gardening, it's Caufield. They are the first to lay out this whole
+idea in poetic, coherent words.
- Caufield makes clear digital gardening is not about specific tools –
- it's not a Wordpress plugin, Gastby theme, or Jekyll template. It's a
- different way of thinking about our online behaviour around information
- - one that accumulates personal knowledge over time in an explorable
- space.
+Caufield makes clear digital gardening is not about specific tools – it's not a
+Wordpress plugin, Gastby theme, or Jekyll template. It's a different way of
+thinking about our online behaviour around information - one that accumulates
+personal knowledge over time in an explorable space.
- Caufield's main argument was that we have become swept away by streams
- – the collapse of information into single-track timelines of events.
- The conversational feed design of email inboxes, group chats, and
- InstaTwitBook is fleeting – they're only concerned with self-assertive
- immediate thoughts that rush by us in a few moments.
+Caufield's main argument was that we have become swept away by streams – the
+collapse of information into single-track timelines of events. The
+conversational feed design of email inboxes, group chats, and InstaTwitBook is
+fleeting – they're only concerned with self-assertive immediate thoughts that
+rush by us in a few moments.
- This is not inherently bad. Streams have their time and place. Twitter
- is a force-multiplier for exploratory thoughts and delightful
- encounters once you fall in with the right crowd and learn to play the
- game.
+This is not inherently bad. Streams have their time and place. Twitter is a
+force-multiplier for exploratory thoughts and delightful encounters once you
+fall in with the right crowd and learn to play the game.
- But streams only surface the Zeitgeisty ideas of the last 24 hours.
- They are not designed to accumulate knowledge, connect disparate
- information, or mature over time.
+But streams only surface the Zeitgeisty ideas of the last 24 hours. They are
+not designed to accumulate knowledge, connect disparate information, or mature
+over time.
- The garden is our counterbalance. Gardens present information in a
- richly linked landscape that grows slowly over time. Everything is
- arranged and connected in ways that allow you to explore. Think about
- the way Wikipedia works when you're hopping from to to . It's
- hyperlinking at it's best. You get to actively choose which curiosity
- trail to follow, rather than defaulting to the algorithmically-filtered
- ephemeral stream. The garden helps us move away from time-bound streams
- and into contextual knowledge spaces.
- "The Garden is the web as topology. The web as space. It’s the
- integrative web, the iterative web, the web as an arrangement and
- rearrangement of things to one another."
+The garden is our counterbalance. Gardens present information in a richly
+linked landscape that grows slowly over time. Everything is arranged and
+connected in ways that allow you to explore. Think about the way Wikipedia
+works when you're hopping from to to . It's hyperlinking at it's best. You get
+to actively choose which curiosity trail to follow, rather than defaulting to
+the algorithmically-filtered ephemeral stream. The garden helps us move away
+from time-bound streams and into contextual knowledge spaces.
+
+ "The Garden is the web as topology. The web as space. It’s the integrative
+ web, the iterative web, the web as an arrangement and rearrangement of
+ things to one another."
Carrying on Caufield
- Good ideas take time to germinate, and Caufield's vision of the
- personal garden didn't reach critical mass right off the bat. It lay
- dormant, waiting for the right time and the right people to find it.
+Good ideas take time to germinate, and Caufield's vision of the personal garden
+didn't reach critical mass right off the bat. It lay dormant, waiting for the
+right time and the right people to find it.
- In late 2018 the corner of Twitter I hang out in began using the term
- more regularly – folks began passing around Caufield's original article
- and experimenting with ways to turn their chronological blogs into
- exploratory, interlinked gardens.
+In late 2018 the corner of Twitter I hang out in began using the term more
+regularly – folks began passing around Caufield's original article and
+experimenting with ways to turn their chronological blogs into exploratory,
+interlinked gardens.
- Tom Critchlow's 2018 article was one of the main kick-off points. Tom
- read Caufield's essay and began speculating on alternative metaphors to
- frame the way we consume and produce information. They suggested we add
- campfires to the idea of streams and gardens – the private Slack
- groups, casual blog rings, and
- [38]Cozy Web
- areas where people write in response to one another. While gardens
- present the ideas of an individual, campfires are conversational spaces
- to exchange ideas that aren't yet fully formed.
+Tom Critchlow's 2018 article was one of the main kick-off points. Tom read
+Caufield's essay and began speculating on alternative metaphors to frame the
+way we consume and produce information. They suggested we add campfires to the
+idea of streams and gardens – the private Slack groups, casual blog rings, and
+[40]Cozy Web
+areas where people write in response to one another. While gardens present the
+ideas of an individual, campfires are conversational spaces to exchange ideas
+that aren't yet fully formed.
- Tom piece was shortly followed by Joel Hooks' in early 2019. Joel
- focused on the process of digital gardening, emphasising the slow
- growth of ideas through writing, rewriting, editing, and revising
- thoughts in public. Instead of slapping Fully Formed Opinions up on the
- web and never changing them.
+Tom piece was shortly followed by Joel Hooks' in early 2019. Joel focused on
+the process of digital gardening, emphasising the slow growth of ideas through
+writing, rewriting, editing, and revising thoughts in public. Instead of
+slapping Fully Formed Opinions up on the web and never changing them.
- Joel also added Amy Hoy's post to the pile of influential ideas that
- led to our current gardening infatuation. While not specifically about
- gardening, Amy's piece gives us a lot of good historical context. In
- it, she explores the history of blogs over the last three decades, and
- pinpoints exactly when we all became fixated on publishing our thoughts
- in reverse chronological order (spoiler: around 2001 with the launch of
- ).
+Joel also added Amy Hoy's post to the pile of influential ideas that led to our
+current gardening infatuation. While not specifically about gardening, Amy's
+piece gives us a lot of good historical context. In it, she explores the
+history of blogs over the last three decades, and pinpoints exactly when we all
+became fixated on publishing our thoughts in reverse chronological order
+(spoiler: around 2001 with the launch of ).
- Amy argues that Moveable Type didn't just launch us into the
- "Chronological Sort Era". It also killed the wild, diverse, hodge-podge
- personalisation of websites that characterised the early web. Instead
- of hand-coding your own layout and deciding exactly how to arrange the
- digital furniture, we began to enter the age of standardised layouts.
- Plug n' play templates that you drop content into became the norm. It
- became harder and more technically involved to edit the HTML & CSS
- yourself.
+Amy argues that Moveable Type didn't just launch us into the "Chronological
+Sort Era". It also killed the wild, diverse, hodge-podge personalisation of
+websites that characterised the early web. Instead of hand-coding your own
+layout and deciding exactly how to arrange the digital furniture, we began to
+enter the age of standardised layouts. Plug n' play templates that you drop
+content into became the norm. It became harder and more technically involved to
+edit the HTML & CSS yourself.
- "Suddenly people weren’t creating homepages or even web pages...
- they were writing web content in form fields and text areas inside a
- web page."
+ "Suddenly people weren’t creating homepages or even web pages... they were
+ writing web content in form fields and text areas inside a web page."
- Many people have lamented the web's slow transition from unique
- homepages to a bland ocean of generic Wordpress themes. Digital
- gardening is part of the pushback against the limited range of vanilla
- web formats and layouts we now for granted.
+Many people have lamented the web's slow transition from unique homepages to a
+bland ocean of generic Wordpress themes. Digital gardening is part of the
+pushback against the limited range of vanilla web formats and layouts we now
+for granted.
- Over the course 2019 and early 2020, more and more people began riffing
- on the concept. Shaun Wang compiled the . Anne-Laure Le Cunff published
- a popular guide to setting up . The IndieWeb community hosted a to
- discuss the history of commonplace books, personal wikis, and memory
- palaces.
+Over the course 2019 and early 2020, more and more people began riffing on the
+concept. Shaun Wang compiled the . Anne-Laure Le Cunff published a popular
+guide to setting up . The IndieWeb community hosted a to discuss the history of
+commonplace books, personal wikis, and memory palaces.
- By late 2020 this whole concept had attracted enough attention for the
- MIT Tech Review to write on it. Perhaps this is the watershed moment
- when a Twitter buzzword has "made it."
+By late 2020 this whole concept had attracted enough attention for the MIT Tech
+Review to write on it. Perhaps this is the watershed moment when a Twitter
+buzzword has "made it."
Digital Gardening's Fertile Soil
- What made our current historical moment the right time for digital
- gardening to take off?
+What made our current historical moment the right time for digital gardening to
+take off?
- The timing coincided with a few complimentary ideas and communities
- rallying around personal knowledge systems, note-taking practices, and
- reimagining tools for blogging. The scene was ripe for new ideas around
- curating and sharing personal knowledge online.
+The timing coincided with a few complimentary ideas and communities rallying
+around personal knowledge systems, note-taking practices, and reimagining tools
+for blogging. The scene was ripe for new ideas around curating and sharing
+personal knowledge online.
- Many of the people who jumped on the early digital gardening bandwagon
- were part of communities like...
- * The collective – a group that has been championing independent web
- spaces outside the walled gardens of Instatwitbook for nearly a
- decade.
- * Users of the note-taking app – Roam pioneered new ways of
- interlinking content and strongly appeals to people trying to build
- sprawling knowledge graphs.
- * Followers of Tiago Forte's course which popularised the idea of
- actively curating personal knowledge.
- * People rallying around the ethos that encourages continuously
- creating 'learning exhaust' in the form of notes and summaries.
+Many of the people who jumped on the early digital gardening bandwagon were
+part of communities like...
+
+ • The collective – a group that has been championing independent web spaces
+ outside the walled gardens of Instatwitbook for nearly a decade.
+ • Users of the note-taking app – Roam pioneered new ways of interlinking
+ content and strongly appeals to people trying to build sprawling knowledge
+ graphs.
+ • Followers of Tiago Forte's course which popularised the idea of actively
+ curating personal knowledge.
+ • People rallying around the ethos that encourages continuously creating
+ 'learning exhaust' in the form of notes and summaries.
Developer-led Gardening
- Many of these early adopters were people who understood how to build
- websites – either professional developers or enthusiastic hobbyists.
- Any kind of novel experimentation with the web requires knowing a
- non-trivial amount of HTML, CSS, and JS. Not to mention all the
- surrounding infrastructure required actually to get a site live.
- Developers took to the idea because they already had the technical
- ability to jump in play around with what garden-esque websites might
- look like.
+Many of these early adopters were people who understood how to build websites –
+either professional developers or enthusiastic hobbyists. Any kind of novel
+experimentation with the web requires knowing a non-trivial amount of HTML,
+CSS, and JS. Not to mention all the surrounding infrastructure required
+actually to get a site live. Developers took to the idea because they already
+had the technical ability to jump in play around with what garden-esque
+websites might look like.
- The current state of web development helped here too. While it feels
- like we've been in a slow descent into a horrifyingly complex and
- bloated web development process, a number of recent tools have made it
- easier to get a fully customised website up and running. Services like
- and have taken the pain out of deployment. Static site generators like
- , , and make it easier to build sophisticated websites that
- auto-generate pages, and take care of grunt work like optimising load
- time, images, and SEO. These services are trying to find a happy middle
- ground between tediously hand-coding solutions, and being trapped in
- the restrictions of Wordpress or Squarespace.
+The current state of web development helped here too. While it feels like we've
+been in a slow descent into a horrifyingly complex and bloated web development
+process, a number of recent tools have made it easier to get a fully customised
+website up and running. Services like and have taken the pain out of
+deployment. Static site generators like , , and make it easier to build
+sophisticated websites that auto-generate pages, and take care of grunt work
+like optimising load time, images, and SEO. These services are trying to find a
+happy middle ground between tediously hand-coding solutions, and being trapped
+in the restrictions of Wordpress or Squarespace.
- While developers were the first on the scene, plenty of writers,
- researchers, and note-taking enthusiasts have been drawn to the idea of
- digital gardening. To help folks without programming skills join in,
- there's been a surge in templates and platforms that allow people to
- build their own digital gardens without touching a ton of code. I've
- written an entire guide to
- [39]Digital Gardening for Non-Technical Folks
- if you fall into that category.
+While developers were the first on the scene, plenty of writers, researchers,
+and note-taking enthusiasts have been drawn to the idea of digital gardening.
+To help folks without programming skills join in, there's been a surge in
+templates and platforms that allow people to build their own digital gardens
+without touching a ton of code. I've written an entire guide to
+[41]Digital Gardening for Non-Technical Folks
+if you fall into that category.
- Tools like , , and are all great options. Many of them offer fancy
- features like nested folders,
- [40]Bi-Directional Links
- , footnotes, and visual graphs.
+Tools like , , and are all great options. Many of them offer fancy features
+like nested folders,
+[42]Bi-Directional Links
+, footnotes, and visual graphs.
- However, many of these no-code tools still feel like cookie-cutter
- solutions. Rather than allowing people to design the and spatial
- layouts of their gardens, they inevitably force people into pre-made
- arrangements. This doesn't meant they don't "count,” as "real” gardens,
- but simply that they limit their gardeners to some extent. You can't
- design different types of links, novel features, experimental layouts,
- or custom architecture. They're pre-fab houses instead of raw building
- materials.
- __________________________________________________________________
+However, many of these no-code tools still feel like cookie-cutter solutions.
+Rather than allowing people to design the and spatial layouts of their gardens,
+they inevitably force people into pre-made arrangements. This doesn't meant
+they don't "count,” as "real” gardens, but simply that they limit their
+gardeners to some extent. You can't design different types of links, novel
+features, experimental layouts, or custom architecture. They're pre-fab houses
+instead of raw building materials.
- [41]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[43]
The Six Patterns of Gardening
- In all the recent gardening flurry, we've run into the inevitable
- confusion around how to define the term.
- Loading...
+In all the recent gardening flurry, we've run into the inevitable confusion
+around how to define the term.
- There are contested ideas about what qualifies as a garden, what the
- core ethos should focus on, and whether it's worthy of a new label at
- all. What exactly makes a website a digital garden as opposed to just
- another blog?
+Loading...
- After reading all the existing takes on the term, observing a wide
- variety of gardens, and collecting some of the , I've identified a few
- key qualities they all share.
+There are contested ideas about what qualifies as a garden, what the core ethos
+should focus on, and whether it's worthy of a new label at all. What exactly
+makes a website a digital garden as opposed to just another blog?
- There are a few guiding principles, design patterns and structures
- people are rallying around. This amounts to a kind of digital gardening
- [42]Pattern Language
- .
+After reading all the existing takes on the term, observing a wide variety of
+gardens, and collecting some of the , I've identified a few key qualities they
+all share.
+
+There are a few guiding principles, design patterns and structures people are
+rallying around. This amounts to a kind of digital gardening
+[44]Pattern Language
+.
1. Topography over Timelines
- Gardens are organised around contextual relationships and associative
- links; the concepts and themes within each note determine how it's
- connected to others.
+Gardens are organised around contextual relationships and associative links;
+the concepts and themes within each note determine how it's connected to
+others.
- This runs counter to the time-based structure of traditional blogs:
- posts presented in reverse chronological order based on publication
- date.
+This runs counter to the time-based structure of traditional blogs: posts
+presented in reverse chronological order based on publication date.
- Gardens don't consider publication dates the most important detail of a
- piece of writing. Dates might be included on posts, but they aren't the
- structural basis of how you navigate around the garden. Posts are
- connected to other by posts through related themes, topics, and shared
- context.
+Gardens don't consider publication dates the most important detail of a piece
+of writing. Dates might be included on posts, but they aren't the structural
+basis of how you navigate around the garden. Posts are connected to other by
+posts through related themes, topics, and shared context.
- One of the best ways to do this is through
- [43]Bi-Directional Links
- – links that make both the destination page and the source page visible
- to the reader. This makes it easy to move between related content.
+One of the best ways to do this is through
+[45]Bi-Directional Links
+– links that make both the destination page and the source page visible to the
+reader. This makes it easy to move between related content.
- Because garden notes are densely linked, a garden explorer can enter at
- any location and follow any trail they link through the content, rather
- than being dumped into a "most recent” feed.
+Because garden notes are densely linked, a garden explorer can enter at any
+location and follow any trail they link through the content, rather than being
+dumped into a "most recent” feed.
- Dense links are essential, but gardeners often layer on other ways of
- exploring their knowledge base. They might have , , tags and filtering
- functionality, , , or listing notable and popular content.
+Dense links are essential, but gardeners often layer on other ways of exploring
+their knowledge base. They might have , , tags and filtering functionality, , ,
+or listing notable and popular content.
- Many entry points but no prescribed pathways.
+Many entry points but no prescribed pathways.
2. Continuous Growth
- Gardens are never finished, they're constantly growing, evolving, and
- changing. Just like a real soil, carrot, and cabbage garden.
+Gardens are never finished, they're constantly growing, evolving, and changing.
+Just like a real soil, carrot, and cabbage garden.
- The isn't how we usually think about writing on the web. Over the last
- decade, we've moved away from casual live journal entries and
- formalised our writing into articles and essays. These are carefully
- crafted, edited, revised, and published with a timestamp. When it's
- done, it's done. We act like tiny magazines, sending our writing off to
- the printer.
+The isn't how we usually think about writing on the web. Over the last decade,
+we've moved away from casual live journal entries and formalised our writing
+into articles and essays. These are carefully crafted, edited, revised, and
+published with a timestamp. When it's done, it's done. We act like tiny
+magazines, sending our writing off to the printer.
- This is odd considering editability is one of the main selling points
- of the web. Gardens lean into this – there is no "final version” on a
- garden. What you publish is always open to revision and expansion.
+This is odd considering editability is one of the main selling points of the
+web. Gardens lean into this – there is no "final version” on a garden. What you
+publish is always open to revision and expansion.
- Gardens are designed to evolve alongside your thoughts. When you first
- have an idea, it's fuzzy and unrefined. You might notice a pattern in
- your corner of the world, but need to collect evidence, consider
- counter-arguments, spot similar trends, and research who else has thunk
- such thoughts before you. In short, you need to do your homework and
- critically think about it over time.
+Gardens are designed to evolve alongside your thoughts. When you first have an
+idea, it's fuzzy and unrefined. You might notice a pattern in your corner of
+the world, but need to collect evidence, consider counter-arguments, spot
+similar trends, and research who else has thunk such thoughts before you. In
+short, you need to do your homework and critically think about it over time.
- In performance-blog-land you do that thinking and researching
- privately, then shove it out at the final moment. A grand flourish that
- hides the process.
+In performance-blog-land you do that thinking and researching privately, then
+shove it out at the final moment. A grand flourish that hides the process.
- In garden-land, that process of researching and refining happens on the
- open internet. You post ideas while they're still "seedlings,” and tend
- them regularly until they're fully grown, respectable opinions.
+In garden-land, that process of researching and refining happens on the open
+internet. You post ideas while they're still "seedlings,” and tend them
+regularly until they're fully grown, respectable opinions.
- This has a number of benefits:
- * You're freed from the pressure to get everything right immediately.
- You can test ideas, get feedback, and revise your opinions like a
- good internet citizen.
- * It's low friction. Gardening your thoughts becomes a daily ritual
- that only takes a small amount of effort. Over time, big things
- grow.
- * It gives readers an insight into your writing and thinking process.
- They come to realise you are not a magical idea machine banging out
- perfectly formed thoughts, but instead an equally mediocre human
- doing The Work of trying to understand the world and make sense of
- it alongside you.
+This has a number of benefits:
- This all comes with an important caveat; gardens make their
- imperfection known to readers. Which brings us to the next pattern...
+ • You're freed from the pressure to get everything right immediately. You can
+ test ideas, get feedback, and revise your opinions like a good internet
+ citizen.
+ • It's low friction. Gardening your thoughts becomes a daily ritual that only
+ takes a small amount of effort. Over time, big things grow.
+ • It gives readers an insight into your writing and thinking process. They
+ come to realise you are not a magical idea machine banging out perfectly
+ formed thoughts, but instead an equally mediocre human doing The Work of
+ trying to understand the world and make sense of it alongside you.
+
+This all comes with an important caveat; gardens make their imperfection known
+to readers. Which brings us to the next pattern...
3. Imperfection & Learning in Public
- Gardens are imperfect by design. They don't hide their rough edges or
- claim to be a permanent source of truth.
+Gardens are imperfect by design. They don't hide their rough edges or claim to
+be a permanent source of truth.
- Putting anything imperfect and half-written on an "official website”
- may feel strange. We have all been trained to behave like tiny,
- performative corporations when it comes to presenting ourselves in
- digital space. Blogging evolved in the culture of Millenialism as a way
- to Promote Your Personal Brand™ and market your SEO-optimized Content.
+Putting anything imperfect and half-written on an "official website” may feel
+strange. We have all been trained to behave like tiny, performative
+corporations when it comes to presenting ourselves in digital space. Blogging
+evolved in the culture of Millenialism as a way to Promote Your Personal Brand™
+and market your SEO-optimized Content.
- Weird, quirky personal blogs of the early 2000's turned into cleanly
- crafted brands with publishing strategies and media campaigns. Everyone
- now has a modern minimalist logo and an LLC.
+Weird, quirky personal blogs of the early 2000's turned into cleanly crafted
+brands with publishing strategies and media campaigns. Everyone now has a
+modern minimalist logo and an LLC.
- Digital gardening is the response to the professional personal blog;
- it's both intimate and public, weird and welcoming. It's less
- performative than a blog, but more intentional and thoughtful than a
- Twitter feed. It wants to build personal knowledge over time, rather
- than engage in banter and quippy conversations.
+Digital gardening is the response to the professional personal blog; it's both
+intimate and public, weird and welcoming. It's less performative than a blog,
+but more intentional and thoughtful than a Twitter feed. It wants to build
+personal knowledge over time, rather than engage in banter and quippy
+conversations.
- Think of it as a spectrum. Things we dump into private WhatsApp group
- chats, DMs, and cavalier Tweet threads are part of our chaos streams -
- a continuous flow of high noise / low signal ideas. On the other end we
- have highly performative and cultivated artefacts like published books
- that you prune and tend for years.
+Think of it as a spectrum. Things we dump into private WhatsApp group chats,
+DMs, and cavalier Tweet threads are part of our chaos streams - a continuous
+flow of high noise / low signal ideas. On the other end we have highly
+performative and cultivated artefacts like published books that you prune and
+tend for years.
- Gardening sits in the middle. It's the perfect balance of chaos and
- cultivation.
+Gardening sits in the middle. It's the perfect balance of chaos and
+cultivation.
- This ethos of imperfection opens up a world of possibility that
- performative blogging shut down. First, it enables you to ; the
- practice of sharing what you learn as you're learning it, not a decade
- later once you're an "expert.”
+This ethos of imperfection opens up a world of possibility that performative
+blogging shut down. First, it enables you to ; the practice of sharing what you
+learn as you're learning it, not a decade later once you're an "expert.”
- This freedom of course comes with great responsibility. Publishing
- imperfect and early ideas requires that we make the status of our notes
- clear to readers. You should include some indicator of how "done” they
- are, and how much effort you've invested in them.
+This freedom of course comes with great responsibility. Publishing imperfect
+and early ideas requires that we make the status of our notes clear to readers.
+You should include some indicator of how "done” they are, and how much effort
+you've invested in them.
- This could be with a simple categorisation system. I personally use an
- overly horticultural metaphor:
- * 🌱 Seedlings for very rough and early ideas
- * 🌿 Budding for work I've cleaned up and clarified
- * 🌳 Evergreen for work that is reasonably complete (though I still
- tend these over time).
+This could be with a simple categorisation system. I personally use an overly
+horticultural metaphor:
- I also include the dates I planted and last tended a post so people get
- a sense of how long I've been growing it.
+ • 🌱 Seedlings for very rough and early ideas
+ • 🌿 Budding for work I've cleaned up and clarified
+ • 🌳 Evergreen for work that is reasonably complete (though I still tend these
+ over time).
- Other gardeners include an epistemic status on their posts – a short
- statement that makes clear how they know what they know, and how much
- time they've invested in researching it.
+I also include the dates I planted and last tended a post so people get a sense
+of how long I've been growing it.
- was one of the earliest and most consistent gardeners to offer
- meta-reflections on their work. Each entry comes with:
- * topic tags
- * start and end date
- * a stage tag: draft, in progress, or finished
- * a certainty tag: impossible, unlikely, certain, etc.
- * 1-10 importance tag
+Other gardeners include an epistemic status on their posts – a short statement
+that makes clear how they know what they know, and how much time they've
+invested in researching it.
- These are all explained in their , which is worth reading if you're
- designing your own epistemological system.
+was one of the earliest and most consistent gardeners to offer meta-reflections
+on their work. Each entry comes with:
- Devon Zuegal is another notable gardener who has epistemic status and
- epistemic effort on their posts, indicating both their certainty level
- about the material, and how much effort went into making it. They also
- make a strong case for as a feature, not a bug.
+ • topic tags
+ • start and end date
+ • a stage tag: draft, in progress, or finished
+ • a certainty tag: impossible, unlikely, certain, etc.
+ • 1-10 importance tag
- In a similar vein, Shawn Wang has written the Digital Gardening which I
- adore and ascribe to. They ask the reader to allow the writer to be
- wrong, offer constructive criticism, and attribute their work. They ask
- gardeners to be considerate of others (don't share private information
- or name and shame), offer epistemic disclosure, and respond to
- feedback.
- The digital gardening terms of service – Source: Shawn Wang, swyx.io
+These are all explained in their , which is worth reading if you're designing
+your own epistemological system.
- All of these design patterns feed our growing desire for transparency,
- meta information, and breadcrumbs back to the source of ideas.
+Devon Zuegal is another notable gardener who has epistemic status and epistemic
+effort on their posts, indicating both their certainty level about the
+material, and how much effort went into making it. They also make a strong case
+for as a feature, not a bug.
+
+In a similar vein, Shawn Wang has written the Digital Gardening which I adore
+and ascribe to. They ask the reader to allow the writer to be wrong, offer
+constructive criticism, and attribute their work. They ask gardeners to be
+considerate of others (don't share private information or name and shame),
+offer epistemic disclosure, and respond to feedback.
+
+The digital gardening terms of service – Source: Shawn Wang, swyx.io
+
+All of these design patterns feed our growing desire for transparency, meta
+information, and breadcrumbs back to the source of ideas.
4. Playful, Personal, and Experimental
- Gardens are non-homogenous by nature. You can plant the same seeds as
- your neighbour, but you'll always end up with a different arrangement
- of plants.
+Gardens are non-homogenous by nature. You can plant the same seeds as your
+neighbour, but you'll always end up with a different arrangement of plants.
- Digital gardens should be just as unique and particular as their
- vegetative counterparts. The point of a garden is that it's a personal
- playspace. You organise the garden around the ideas and mediums that
- match your way of thinking, rather than off someone else's standardised
- template.
+Digital gardens should be just as unique and particular as their vegetative
+counterparts. The point of a garden is that it's a personal playspace. You
+organise the garden around the ideas and mediums that match your way of
+thinking, rather than off someone else's standardised template.
- Ideally, this involves experimenting with the native languages of the
- web – HTML, CSS, and JavaScript. They're the most flexible and robust
- tools we have for building interconnected knowledge online. Gardens are
- a chance to question the established norms of a 'personal website', and
- make space for weirder, wilder experiments.
+Ideally, this involves experimenting with the native languages of the web –
+HTML, CSS, and JavaScript. They're the most flexible and robust tools we have
+for building interconnected knowledge online. Gardens are a chance to question
+the established norms of a 'personal website', and make space for weirder,
+wilder experiments.
- That said, I should acknowledge that jumping into full-on web
- development is simply beyond the abilities and interests of many
- people. There is still room for personalisation and play if you're
- using a pre-made template or service – it'll just be within the
- constraints of that system.
+That said, I should acknowledge that jumping into full-on web development is
+simply beyond the abilities and interests of many people. There is still room
+for personalisation and play if you're using a pre-made template or service –
+it'll just be within the constraints of that system.
- One goal of these hyper-personalised gardens is deep contextualisation.
- The overwhelming lesson of the Web 2.0 social media age is that dumping
- millions of people together into decontextualised social spaces is a
- shit show. Devoid of any established social norms and abstracted from
- our specific cultural identities, we end up in awkward, aggravating
- exchanges with people who are socially incoherent to us. We know
- nothing of their lives, backgrounds, or belief systems, and have to
- assume the worst. Twitter only offers us a 240 character bio. Facebook
- pre-selects the categories it deems important about you – relationship
- status, gender, hometown.
+One goal of these hyper-personalised gardens is deep contextualisation. The
+overwhelming lesson of the Web 2.0 social media age is that dumping millions of
+people together into decontextualised social spaces is a shit show. Devoid of
+any established social norms and abstracted from our specific cultural
+identities, we end up in awkward, aggravating exchanges with people who are
+socially incoherent to us. We know nothing of their lives, backgrounds, or
+belief systems, and have to assume the worst. Twitter only offers us a 240
+character bio. Facebook pre-selects the categories it deems important about you
+– relationship status, gender, hometown.
- Gardens offer us the ability to present ourselves in forms that aren't
- cookie cutter profiles. They're the higher-fidelity version, complete
- with quirks, contradictions, and complexity.
+Gardens offer us the ability to present ourselves in forms that aren't cookie
+cutter profiles. They're the higher-fidelity version, complete with quirks,
+contradictions, and complexity.
5. Intercropping & Content Diversity
- Gardens are not just a collection of interlinked words. While linear
- writing is an incredible medium that has served us well for a little
- over 5000 years, it is daft to pretend working in a single medium is a
- sufficient way to explore complex ideas.
+Gardens are not just a collection of interlinked words. While linear writing is
+an incredible medium that has served us well for a little over 5000 years, it
+is daft to pretend working in a single medium is a sufficient way to explore
+complex ideas.
- It is also absurd to ignore the fact we're living in an audio-visual
- cornucopia that the web makes possible. Podcasts, videos, diagrams,
- illustrations, interactive web animations, academic papers, tweets,
- rough sketches, and code snippets should all live and grow in the
- garden.
- [intercropping-garden_shrink_mx6nx8.png]
+It is also absurd to ignore the fact we're living in an audio-visual cornucopia
+that the web makes possible. Podcasts, videos, diagrams, illustrations,
+interactive web animations, academic papers, tweets, rough sketches, and code
+snippets should all live and grow in the garden.
- Historically, monocropping has been the quickest route to starvation,
- pests, and famine. Don't be a lumper potato farmer while everyone else
- is sustainably intercropping.
+[intercropping-garden_shrink_mx6nx8]
+
+Historically, monocropping has been the quickest route to starvation, pests,
+and famine. Don't be a lumper potato farmer while everyone else is sustainably
+intercropping.
6. Independent Ownership
- Gardening is about claiming a small patch of the web for yourself, one
- you fully own and control.
+Gardening is about claiming a small patch of the web for yourself, one you
+fully own and control.
- This patch should not live on the servers of Facebook, LinkedIn,
- Twitter, Instagram (aka. also Facebook), or Medium. None of these
- platforms are designed to help you slowly build and weave personal
- knowledge. Most of them actively fight against it.
+This patch should not live on the servers of Facebook, LinkedIn, Twitter,
+Instagram (aka. also Facebook), or Medium. None of these platforms are designed
+to help you slowly build and weave personal knowledge. Most of them actively
+fight against it.
- If any of those services go under, your writing and creations sink with
- it (crazier things have happened in the span of humanity). None of them
- have an easy export button. And they certainly won't hand you your data
- in a transferable format.
- A set of walled gardens with the Twitter, Medium, and Facebook logos
- next to an open garden built on HTML, CSS, and Markdown
+If any of those services go under, your writing and creations sink with it
+(crazier things have happened in the span of humanity). None of them have an
+easy export button. And they certainly won't hand you your data in a
+transferable format.
- Independently owning your garden helps you plan for long-term change.
- You should think about how you want your space to grow over the next
- few decades, not just the next few months.
+A set of walled gardens with the Twitter, Medium, and Facebook logos next to an
+open garden built on HTML, CSS, and Markdown
- If you give it a bit of forethought, you can build your garden in a way
- that makes it easy to transfer and adapt. Platforms and technologies
- will inevitably change. Using old-school, reliable, and widely used web
- native formats like HTML/CSS is a safe bet. Backing up your notes as
- flat markdown files won't hurt either.
+Independently owning your garden helps you plan for long-term change. You
+should think about how you want your space to grow over the next few decades,
+not just the next few months.
- Keeping your garden on the open web also sets you up to take part in
- the future of gardening. At the moment our gardens are rather solo
- affairs. We haven't figure out how to make them multi-player. But
- there's an enthusiastic community of developers and designers trying to
- fix that. It's hard to say what kind of libraries, frameworks, and
- design patterns might emerge out of that effort, but it certainly isn't
- going to happen behind a Medium paywall.
- A set of gardens with plant life moving between them
- __________________________________________________________________
+If you give it a bit of forethought, you can build your garden in a way that
+makes it easy to transfer and adapt. Platforms and technologies will inevitably
+change. Using old-school, reliable, and widely used web native formats like
+HTML/CSS is a safe bet. Backing up your notes as flat markdown files won't hurt
+either.
- This is all my take on gardening, but knowledge and neologisms always
- live within communities. No one owns The Official Definition of digital
- gardening. Numerous people have contributed to the growing conversation
- and you should read their thoughts as well.
+Keeping your garden on the open web also sets you up to take part in the future
+of gardening. At the moment our gardens are rather solo affairs. We haven't
+figure out how to make them multi-player. But there's an enthusiastic community
+of developers and designers trying to fix that. It's hard to say what kind of
+libraries, frameworks, and design patterns might emerge out of that effort, but
+it certainly isn't going to happen behind a Medium paywall.
- Want to share? (BUTTON) Tell Twitter About It
+A set of gardens with plant life moving between them
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+This is all my take on gardening, but knowledge and neologisms always live
+within communities. No one owns The Official Definition of digital gardening.
+Numerous people have contributed to the growing conversation and you should
+read their thoughts as well.
+
+Want to share?Tell Twitter About It
8 Backlinks
The Expanding Dark Forest and Generative AI
- Proving you're a human on a web flooded with generative AI content
+Proving you're a human on a web flooded with generative AI content
A Short History of Bi-Directional Links
- Seventy years ago we dreamed up links that would allow us to create
- two-way, contextual conversations. Why don't we use them on the web?
+Seventy years ago we dreamed up links that would allow us to create two-way,
+contextual conversations. Why don't we use them on the web?
Digital Gardening for Non-Technical Folks
- How to build a digital garden without touching code
+How to build a digital garden without touching code
Transclusion and Transcopyright Dreams
- The lost permissioning and copyright system of the Web
+The lost permissioning and copyright system of the Web
The Pattern Language of Project Xanadu
- Project Xanadu as a pattern language, rather than a failed software
- project
+Project Xanadu as a pattern language, rather than a failed software project
Growing the Evergreens
- Illustrated notes on the concept of 'Evergreen notes' and how to write
- them
+Illustrated notes on the concept of 'Evergreen notes' and how to write them
A Meta-Tour of This Site
- A video tour through how I build the old version of this site
+A video tour through how I build the old version of this site
Tending Evergreen Notes in Roam Research
- A walkthrough of how I manage and tend Evergreen notes in Roam
+A walkthrough of how I manage and tend Evergreen notes in Roam
Mentions around the web
- subterraneanwebZ
- a new hope
- with-heart
- Winson Tang
- Hacker News
- Abra Tusz
- King | "OG" Zettelkasten 🧠 2nd Brain 🚢
- HN Front Page
- ⎯ΘωΘ⟶
- lqdev
- Evgeny Kuznetsov
- Brad
- Brad
- Chris Aldrich
- DixOnGE
- talyssa
- Chris Krycho
- márcio moreira
- 84 Likes and Retweets
- [44]wildrye.commentionedMarch 10, 2023
- Image by Pallangor, How to Make a Beautiful Minecraft GardenGarden of
- Infinite Possibilities Jorge Luis Borges’ story the “Garden of Forking
- Paths” is set in an elaborate garden, but the real garden is a book
- that is structured in such a way as to allow infinite possibilities.
- [45]wildrye.commentionedMarch 09, 2023
- Mike Caufield talks about his collection of notes in his wiki and how
- they work together as a rich network of ideas. Part of his method is to
- very carefully describe the relationship between two ideas when he
- builds his links. These descriptions become ideas in their own right.
- [46]Cristinamentionedin What the heck is a digital garden?March 04,
- 2023
- Digital gardens are a relatively new concept that are gaining
- popularity online. They are often described as a cross between a blog
- and a personal wiki. At its core, a digital garden is a place for
- someone to share their thoughts, ideas, and learning experiences in a
- more casual
- Whatdefang
- [47]WhatdefangmentionedFebruary 28, 2023
- Naming is a political act as much as a poetic one.
- (BUTTON) Show 33 more
+subterraneanwebZ
+a new hope
+with-heart
+Winson Tang
+Hacker News
+Abra Tusz
+King | "OG" Zettelkasten 🧠 2nd Brain 🚢
+HN Front Page
+⎯ΘωΘ⟶
+lqdev
+Evgeny Kuznetsov
+Brad
+Brad
+Chris Aldrich
+DixOnGE
+talyssa
+Chris Krycho
+márcio moreira
+84 Likes and Retweets
+[47]wildrye.commentionedMarch 10, 2023
+Image by Pallangor, How to Make a Beautiful Minecraft GardenGarden of Infinite
+Possibilities Jorge Luis Borges’ story the “Garden of Forking Paths” is set in
+an elaborate garden, but the real garden is a book that is structured in such a
+way as to allow infinite possibilities.
+[48]wildrye.commentionedMarch 09, 2023
+Mike Caufield talks about his collection of notes in his wiki and how they work
+together as a rich network of ideas. Part of his method is to very carefully
+describe the relationship between two ideas when he builds his links. These
+descriptions become ideas in their own right.
+[49]Cristinamentionedin What the heck is a digital garden?March 04, 2023
+Digital gardens are a relatively new concept that are gaining popularity
+online. They are often described as a cross between a blog and a personal wiki.
+At its core, a digital garden is a place for someone to share their thoughts,
+ideas, and learning experiences in a more casual
+Whatdefang
+[50]WhatdefangmentionedFebruary 28, 2023
+Naming is a political act as much as a poetic one.
+Show 33 more
Want to stay up to date?
- (BUTTON) Subscribe via RSS Feed
- © 2024 Maggie Appleton
- * [48]The Garden
- * [49]Essays
- * [50]About
- * [51]Notes
- * [52]Now
- * [53]Patterns
- * [54]Library
- * [55]Projects
- * [56]Colophon
+Subscribe via RSS Feed
+[53][54][55][56][57]
+© 2024 Maggie Appleton
-References
+ • [58]The Garden
+ • [59]Essays
+ • [60]About
+ • [61]Notes
+ • [62]Now
+ • [63]Patterns
+ • [64]Library
+ • [65]Projects
+ • [66]Colophon
- Visible links:
- 1. https://maggieappleton.com/rss.xml
- 2. https://maggieappleton.com/
- 3. https://maggieappleton.com/now
- 4. https://maggieappleton.com/about
- 5. https://maggieappleton.com/topics/digital-gardening
- 6. https://maggieappleton.com/topics/personal-knowledge
- 7. https://maggieappleton.com/topics/the-web
- 8. https://maggieappleton.com/garden-history#a-brief-history-of-digital-gardens
- 9. https://maggieappleton.com/garden-history#the-early-gardens-of-hypertext
- 10. https://maggieappleton.com/garden-history#digital-puttering-on-twitter
- 11. https://maggieappleton.com/garden-history#gardens-streams-and-caufield's-metaphors
- 12. https://maggieappleton.com/garden-history#carrying-on-caufield
- 13. https://maggieappleton.com/garden-history#digital-gardening's-fertile-soil
- 14. https://maggieappleton.com/garden-history#developer-led-gardening
- 15. https://maggieappleton.com/garden-history#the-six-patterns-of-gardening
- 16. https://maggieappleton.com/garden-history#1-topography-over-timelines
- 17. https://maggieappleton.com/garden-history#2-continuous-growth
- 18. https://maggieappleton.com/garden-history#3-imperfection-&-learning-in-public
- 19. https://maggieappleton.com/garden-history#4-playful-personal-and-experimental
- 20. https://maggieappleton.com/garden-history#5-intercropping-&-content-diversity
- 21. https://maggieappleton.com/garden-history#6-independent-ownership
- 22. https://maggieappleton.com/garden-history#a-brief-history-of-digital-gardens
- 23. https://maggieappleton.com/garden-history#the-early-gardens-of-hypertext
- 24. https://maggieappleton.com/garden-history#digital-puttering-on-twitter
- 25. https://maggieappleton.com/garden-history#gardens-streams-and-caufield's-metaphors
- 26. https://maggieappleton.com/garden-history#carrying-on-caufield
- 27. https://maggieappleton.com/garden-history#digital-gardening's-fertile-soil
- 28. https://maggieappleton.com/garden-history#developer-led-gardening
- 29. https://maggieappleton.com/garden-history#the-six-patterns-of-gardening
- 30. https://maggieappleton.com/garden-history#1-topography-over-timelines
- 31. https://maggieappleton.com/garden-history#2-continuous-growth
- 32. https://maggieappleton.com/garden-history#3-imperfection-&-learning-in-public
- 33. https://maggieappleton.com/garden-history#4-playful-personal-and-experimental
- 34. https://maggieappleton.com/garden-history#5-intercropping-&-content-diversity
- 35. https://maggieappleton.com/garden-history#6-independent-ownership
- 36. https://maggieappleton.com/garden-history#a-brief-history-of-digital-gardens
- 37. https://maggieappleton.com/neologisms
- 38. https://maggieappleton.com/cozy-web
- 39. https://maggieappleton.com/nontechnical-gardening
- 40. https://maggieappleton.com/bidirectionals
- 41. https://maggieappleton.com/garden-history#the-six-patterns-of-gardening
- 42. https://maggieappleton.com/pattern-languages
- 43. https://maggieappleton.com/bidirectionals
- 44. https://wildrye.com/what-is-a-digital-garden/
- 45. https://wildrye.com/the-digital-garden-as-an-experience-generator/
- 46. https://embersonthehearth.com/2023/03/04/what-the-heck-is-a-digital-garden/
- 47. https://twitter.com/whatdefang/status/1630464510740815872
- 48. https://maggieappleton.com/garden
- 49. https://maggieappleton.com/essays
- 50. https://maggieappleton.com/about
- 51. https://maggieappleton.com/notes
- 52. https://maggieappleton.com/now
- 53. https://maggieappleton.com/patterns
- 54. https://maggieappleton.com/library
- 55. https://maggieappleton.com/projects
- 56. https://maggieappleton.com/colophon
- Hidden links:
- 58. https://github.com/MaggieAppleton
- 59. https://uk.linkedin.com/in/maggieappleton
- 60. https://dribbble.com/mappleton
- 61. https://twitter.com/Mappletons
- 62. https://indieweb.social/@maggie
+References:
+
+[1] https://maggieappleton.com/
+[3] https://maggieappleton.com/now
+[4] https://maggieappleton.com/about
+[6] https://maggieappleton.com/topics/digital-gardening
+[7] https://maggieappleton.com/topics/personal-knowledge
+[8] https://maggieappleton.com/topics/the-web
+[10] https://maggieappleton.com/garden-history#a-brief-history-of-digital-gardens
+[11] https://maggieappleton.com/garden-history#the-early-gardens-of-hypertext
+[12] https://maggieappleton.com/garden-history#digital-puttering-on-twitter
+[13] https://maggieappleton.com/garden-history#gardens-streams-and-caufield's-metaphors
+[14] https://maggieappleton.com/garden-history#carrying-on-caufield
+[15] https://maggieappleton.com/garden-history#digital-gardening's-fertile-soil
+[16] https://maggieappleton.com/garden-history#developer-led-gardening
+[17] https://maggieappleton.com/garden-history#the-six-patterns-of-gardening
+[18] https://maggieappleton.com/garden-history#1-topography-over-timelines
+[19] https://maggieappleton.com/garden-history#2-continuous-growth
+[20] https://maggieappleton.com/garden-history#3-imperfection-&-learning-in-public
+[21] https://maggieappleton.com/garden-history#4-playful-personal-and-experimental
+[22] https://maggieappleton.com/garden-history#5-intercropping-&-content-diversity
+[23] https://maggieappleton.com/garden-history#6-independent-ownership
+[24] https://maggieappleton.com/garden-history#a-brief-history-of-digital-gardens
+[25] https://maggieappleton.com/garden-history#the-early-gardens-of-hypertext
+[26] https://maggieappleton.com/garden-history#digital-puttering-on-twitter
+[27] https://maggieappleton.com/garden-history#gardens-streams-and-caufield's-metaphors
+[28] https://maggieappleton.com/garden-history#carrying-on-caufield
+[29] https://maggieappleton.com/garden-history#digital-gardening's-fertile-soil
+[30] https://maggieappleton.com/garden-history#developer-led-gardening
+[31] https://maggieappleton.com/garden-history#the-six-patterns-of-gardening
+[32] https://maggieappleton.com/garden-history#1-topography-over-timelines
+[33] https://maggieappleton.com/garden-history#2-continuous-growth
+[34] https://maggieappleton.com/garden-history#3-imperfection-&-learning-in-public
+[35] https://maggieappleton.com/garden-history#4-playful-personal-and-experimental
+[36] https://maggieappleton.com/garden-history#5-intercropping-&-content-diversity
+[37] https://maggieappleton.com/garden-history#6-independent-ownership
+[38] https://maggieappleton.com/garden-history#a-brief-history-of-digital-gardens
+[39] https://maggieappleton.com/neologisms
+[40] https://maggieappleton.com/cozy-web
+[41] https://maggieappleton.com/nontechnical-gardening
+[42] https://maggieappleton.com/bidirectionals
+[43] https://maggieappleton.com/garden-history#the-six-patterns-of-gardening
+[44] https://maggieappleton.com/pattern-languages
+[45] https://maggieappleton.com/bidirectionals
+[47] https://wildrye.com/what-is-a-digital-garden/
+[48] https://wildrye.com/the-digital-garden-as-an-experience-generator/
+[49] https://embersonthehearth.com/2023/03/04/what-the-heck-is-a-digital-garden/
+[50] https://twitter.com/whatdefang/status/1630464510740815872
+[53] https://github.com/MaggieAppleton
+[54] https://uk.linkedin.com/in/maggieappleton
+[55] https://dribbble.com/mappleton
+[56] https://twitter.com/Mappletons
+[57] https://indieweb.social/@maggie
+[58] https://maggieappleton.com/garden
+[59] https://maggieappleton.com/essays
+[60] https://maggieappleton.com/about
+[61] https://maggieappleton.com/notes
+[62] https://maggieappleton.com/now
+[63] https://maggieappleton.com/patterns
+[64] https://maggieappleton.com/library
+[65] https://maggieappleton.com/projects
+[66] https://maggieappleton.com/colophon
diff --git a/static/archive/mcfunley-com-5myzcq.txt b/static/archive/mcfunley-com-5myzcq.txt
index 4e448f7..26a25d2 100644
--- a/static/archive/mcfunley-com-5myzcq.txt
+++ b/static/archive/mcfunley-com-5myzcq.txt
@@ -1,260 +1,247 @@
- #[1]alternate
+[1]
- [2]
+Dan McKinley
+Math, Programming, and Minority Reports
- Dan McKinley
- Math, Programming, and Minority Reports
+[2] Tweet [3] Follow @mcfunley
- [3]Tweet [4]Follow @mcfunley
+[4]Choose Boring Technology
+March 30th, 2015
- [5]Choose Boring Technology
- March 30th, 2015
+Probably the single best thing to happen to me in my career was having had [5]
+Kellan placed in charge of me. I stuck around long enough to see Kellan’s
+technical decisionmaking start to bear fruit. I learned a great deal from this,
+but I also learned a great deal as a result of this. I would not have been free
+to become the engineer that wrote [6]Data Driven Products Now! if Kellan had
+not been there to so thoroughly stick the landing on technology choices.
- Probably the single best thing to happen to me in my career was having
- had [6]Kellan placed in charge of me. I stuck around long enough to see
- Kellan’s technical decisionmaking start to bear fruit. I learned a
- great deal from this, but I also learned a great deal as a result of
- this. I would not have been free to become the engineer that wrote
- [7]Data Driven Products Now! if Kellan had not been there to so
- thoroughly stick the landing on technology choices.
- [FRQKLCy.jpg] Being inspirational as always.
+[FRQKLCy] Being inspirational as always.
- In the year since leaving Etsy, I’ve resurrected my ability to care
- about technology. And my thoughts have crystallized to the point where
- I can write them down coherently. What follows is a distillation of the
- Kellan gestalt, which will hopefully serve to horrify him only
- slightly.
+In the year since leaving Etsy, I’ve resurrected my ability to care about
+technology. And my thoughts have crystallized to the point where I can write
+them down coherently. What follows is a distillation of the Kellan gestalt,
+which will hopefully serve to horrify him only slightly.
- Embrace Boredom.
+Embrace Boredom.
- Let’s say every company gets about three innovation tokens. You can
- spend these however you want, but the supply is fixed for a long while.
- You might get a few more after you achieve a [8]certain level of
- stability and maturity, but the general tendency is to overestimate the
- contents of your wallet. Clearly this model is approximate, but I think
- it helps.
+Let’s say every company gets about three innovation tokens. You can spend these
+however you want, but the supply is fixed for a long while. You might get a few
+more after you achieve a [7]certain level of stability and maturity, but the
+general tendency is to overestimate the contents of your wallet. Clearly this
+model is approximate, but I think it helps.
- If you choose to write your website in NodeJS, you just spent one of
- your innovation tokens. If you choose to use [9]MongoDB, you just spent
- one of your innovation tokens. If you choose to use [10]service
- discovery tech that’s existed for a year or less, you just spent one of
- your innovation tokens. If you choose to write your own database, oh
- god, you’re in trouble.
+If you choose to write your website in NodeJS, you just spent one of your
+innovation tokens. If you choose to use [8]MongoDB, you just spent one of your
+innovation tokens. If you choose to use [9]service discovery tech that’s
+existed for a year or less, you just spent one of your innovation tokens. If
+you choose to write your own database, oh god, you’re in trouble.
- Any of those choices might be sensible if you’re a javascript
- consultancy, or a database company. But you’re probably not. You’re
- probably working for a company that is at least ostensibly
- [11]rethinking global commerce or [12]reinventing payments on the web
- or pursuing some other suitably epic mission. In that context, devoting
- any of your limited attention to innovating ssh is an excellent way to
- fail. Or at best, delay success [13][1].
+Any of those choices might be sensible if you’re a javascript consultancy, or a
+database company. But you’re probably not. You’re probably working for a
+company that is at least ostensibly [10]rethinking global commerce or [11]
+reinventing payments on the web or pursuing some other suitably epic mission.
+In that context, devoting any of your limited attention to innovating ssh is an
+excellent way to fail. Or at best, delay success [12][1].
- What counts as boring? That’s a little tricky. “Boring” should not be
- conflated with “bad.” There is technology out there that is both boring
- and bad [14][2]. You should not use any of that. But there are many
- choices of technology that are boring and good, or at least good
- enough. MySQL is boring. Postgres is boring. PHP is boring. Python is
- boring. Memcached is boring. Squid is boring. Cron is boring.
+What counts as boring? That’s a little tricky. “Boring” should not be conflated
+with “bad.” There is technology out there that is both boring and bad [13][2].
+You should not use any of that. But there are many choices of technology that
+are boring and good, or at least good enough. MySQL is boring. Postgres is
+boring. PHP is boring. Python is boring. Memcached is boring. Squid is boring.
+Cron is boring.
- The nice thing about boringness (so constrained) is that the
- capabilities of these things are well understood. But more importantly,
- their failure modes are well understood. Anyone who knows me well will
- understand that it’s only with a overwhelming sense of malaise that I
- now invoke the spectre of Don Rumsfeld, but I must.
- [n8ElWr3.jpg] To be clear, fuck this guy.
+The nice thing about boringness (so constrained) is that the capabilities of
+these things are well understood. But more importantly, their failure modes are
+well understood. Anyone who knows me well will understand that it’s only with a
+overwhelming sense of malaise that I now invoke the spectre of Don Rumsfeld,
+but I must.
- When choosing technology, you have both known unknowns and unknown
- unknowns [15][3].
- * A known unknown is something like: we don’t know what happens when
- this database hits 100% CPU.
- * An unknown unknown is something like: geez it didn’t even occur to
- us that [16]writing stats would cause GC pauses.
+[n8ElWr3] To be clear, fuck this guy.
- Both sets are typically non-empty, even for tech that’s existed for
- decades. But for shiny new technology the magnitude of unknown unknowns
- is significantly larger, and this is important.
+When choosing technology, you have both known unknowns and unknown unknowns
+[14][3].
- Optimize Globally.
+ • A known unknown is something like: we don’t know what happens when this
+ database hits 100% CPU.
+ • An unknown unknown is something like: geez it didn’t even occur to us that
+ [15]writing stats would cause GC pauses.
- I unapologetically think a bias in favor of boring technology is a good
- thing, but it’s not the only factor that needs to be considered.
- Technology choices don’t happen in isolation. They have a scope that
- touches your entire team, organization, and the system that emerges
- from the sum total of your choices.
+Both sets are typically non-empty, even for tech that’s existed for decades.
+But for shiny new technology the magnitude of unknown unknowns is significantly
+larger, and this is important.
- Adding technology to your company comes with a cost. As an abstract
- statement this is obvious: if we’re already using Ruby, adding Python
- to the mix doesn’t feel sensible because the resulting complexity would
- outweigh Python’s marginal utility. But somehow when we’re talking
- about Python and Scala or MySQL and Redis people [17]lose their minds,
- discard all constraints, and start raving about using the best tool for
- the job.
+Optimize Globally.
- [18]Your function in a nutshell is to map business problems onto a
- solution space that involves choices of software. If the choices of
- software were truly without baggage, you could indeed pick a whole mess
- of locally-the-best tools for your assortment of problems.
- Created with Sketch. Problems Technical Solutions The way you might
- choose technology in a world where choices are cheap: "pick the right
- tool for the job."
+I unapologetically think a bias in favor of boring technology is a good thing,
+but it’s not the only factor that needs to be considered. Technology choices
+don’t happen in isolation. They have a scope that touches your entire team,
+organization, and the system that emerges from the sum total of your choices.
- But of course, the baggage exists. We call the baggage “operations” and
- to a lesser extent “cognitive overhead.” You have to monitor the thing.
- You have to figure out unit tests. You need to know the first thing
- about it to hack on it. You need an init script. I could go on for days
- here, and all of this adds up fast.
- Created with Sketch. Problems Technical Solutions The way you choose
- technology in the world where operations are a serious concern (i.e.,
- "reality").
+Adding technology to your company comes with a cost. As an abstract statement
+this is obvious: if we’re already using Ruby, adding Python to the mix doesn’t
+feel sensible because the resulting complexity would outweigh Python’s marginal
+utility. But somehow when we’re talking about Python and Scala or MySQL and
+Redis people [16]lose their minds, discard all constraints, and start raving
+about using the best tool for the job.
- The problem with “best tool for the job” thinking is that it takes a
- myopic view of the words “best” and “job.” Your job is keeping the
- company in business, god damn it. And the “best” tool is the one that
- occupies the “least worst” position for as many of your problems as
- possible.
+[17]Your function in a nutshell is to map business problems onto a solution
+space that involves choices of software. If the choices of software were truly
+without baggage, you could indeed pick a whole mess of locally-the-best tools
+for your assortment of problems.
- It is basically always the case that the long-term costs of keeping a
- system working reliably vastly exceed any inconveniences you encounter
- while building it. Mature and productive developers understand this.
+Created with Sketch. Problems Technical Solutions The way you might choose
+technology in a world where choices are cheap: "pick the right tool for the
+job."
- Choose New Technology, Sometimes.
+But of course, the baggage exists. We call the baggage “operations” and to a
+lesser extent “cognitive overhead.” You have to monitor the thing. You have to
+figure out unit tests. You need to know the first thing about it to hack on it.
+You need an init script. I could go on for days here, and all of this adds up
+fast.
- Taking this reasoning to its reductio ad absurdum would mean picking
- Java, and then trying to implement a website without using anything
- else at all. And that would be crazy. You need some means to add things
- to your toolbox.
+Created with Sketch. Problems Technical Solutions The way you choose technology
+in the world where operations are a serious concern (i.e., "reality").
- An important first step is to acknowledge that this is a process, and a
- conversation. New tech eventually has company-wide effects, so adding
- tech is a decision that requires company-wide visibility. Your
- organizational specifics may force the conversation, or [19]they may
- facilitate developers adding new databases and queues without talking
- to anyone. One way or another you have to set cultural expectations
- that this is something we all talk about.
+The problem with “best tool for the job” thinking is that it takes a myopic
+view of the words “best” and “job.” Your job is keeping the company in
+business, god damn it. And the “best” tool is the one that occupies the “least
+worst” position for as many of your problems as possible.
- One of the most worthwhile exercises I recommend here is to consider
- how you would solve your immediate problem without adding anything new.
- First, posing this question should detect the situation where the
- “problem” is that someone really wants to use the technology. If that
- is the case, you should immediately abort.
- [rmdSx.gif] I just watched a webinar about this graph database, we
- should try it out.
+It is basically always the case that the long-term costs of keeping a system
+working reliably vastly exceed any inconveniences you encounter while building
+it. Mature and productive developers understand this.
- It can be amazing how far a small set of technology choices can go. The
- answer to this question in practice is almost never “we can’t do it,”
- it’s usually just somewhere on the spectrum of “well, we could do it,
- but it would be too hard” [20][4]. If you think you can’t accomplish
- your goals with what you’ve got now, you are probably just not thinking
- creatively enough.
+Choose New Technology, Sometimes.
- It’s helpful to write down exactly what it is about the current stack
- that makes solving the problem prohibitively expensive and difficult.
- This is related to the previous exercise, but it’s subtly different.
+Taking this reasoning to its reductio ad absurdum would mean picking Java, and
+then trying to implement a website without using anything else at all. And that
+would be crazy. You need some means to add things to your toolbox.
- New technology choices might be purely additive (for example: “we don’t
- have caching yet, so let’s add memcached”). But they might also overlap
- or replace things you are already using. If that’s the case, you should
- set clear expectations about migrating old functionality to the new
- system. The policy should typically be “we’re committed to migrating,”
- with a proposed timeline. The intention of this step is to keep
- wreckage at manageable levels, and to avoid proliferating
- locally-optimal solutions.
+An important first step is to acknowledge that this is a process, and a
+conversation. New tech eventually has company-wide effects, so adding tech is a
+decision that requires company-wide visibility. Your organizational specifics
+may force the conversation, or [18]they may facilitate developers adding new
+databases and queues without talking to anyone. One way or another you have to
+set cultural expectations that this is something we all talk about.
- This process is not daunting, and it’s not much of a hassle. It’s a
- handful of questions to fill out as homework, followed by a meeting to
- talk about it. I think that if a new technology (or a new service to be
- created on your infrastructure) can pass through this gauntlet
- unscathed, adding it is fine.
+One of the most worthwhile exercises I recommend here is to consider how you
+would solve your immediate problem without adding anything new. First, posing
+this question should detect the situation where the “problem” is that someone
+really wants to use the technology. If that is the case, you should immediately
+abort.
- Just Ship.
+[rmdSx] I just watched a webinar about this graph database, we should try it
+out.
- Polyglot programming is sold with the promise that letting developers
- choose their own tools with complete freedom will make them more
- effective at solving problems. This is a naive definition of the
- problems at best, and motivated reasoning at worst. The weight of
- day-to-day operational [21]toil this creates crushes you to death.
+It can be amazing how far a small set of technology choices can go. The answer
+to this question in practice is almost never “we can’t do it,” it’s usually
+just somewhere on the spectrum of “well, we could do it, but it would be too
+hard” [19][4]. If you think you can’t accomplish your goals with what you’ve
+got now, you are probably just not thinking creatively enough.
- Mindful choice of technology gives engineering minds real freedom: the
- freedom to [22]contemplate bigger questions. Technology for its own
- sake is snake oil.
+It’s helpful to write down exactly what it is about the current stack that
+makes solving the problem prohibitively expensive and difficult. This is
+related to the previous exercise, but it’s subtly different.
- Update, July 27th 2015: I wrote a talk based on this article. You can
- see it [23]here.
- __________________________________________________________________
+New technology choices might be purely additive (for example: “we don’t have
+caching yet, so let’s add memcached”). But they might also overlap or replace
+things you are already using. If that’s the case, you should set clear
+expectations about migrating old functionality to the new system. The policy
+should typically be “we’re committed to migrating,” with a proposed timeline.
+The intention of this step is to keep wreckage at manageable levels, and to
+avoid proliferating locally-optimal solutions.
- 1. Etsy in its early years suffered from this pretty badly. We hired a
- bunch of Python programmers and decided that we needed to find
- something for them to do in Python, and the only thing that came to
- mind was creating a pointless middle layer that [24]required years
- of effort to amputate. Meanwhile, the 90th percentile search
- latency was about two minutes. [25]Etsy didn't fail, but it went
- several years without shipping anything at all. So it took longer
- to succeed than it needed to.
- 2. We often casually refer to the boring/bad intersection of doom as
- “enterprise software,” but that terminology may be imprecise.
- 3. In saying this Rumsfeld was either intentionally or unintentionally
- alluding to [26]the Socratic Paradox. Socrates was by all accounts
- a thoughtful individual in a number of ways that Rumsfeld is not.
- 4. A good example of this from my experience is [27]Etsy’s activity
- feeds. When we built this feature, we were working pretty hard to
- consolidate most of Etsy onto PHP, MySQL, Memcached, and Gearman (a
- PHP job server). It was much more complicated to implement the
- feature on that stack than it might have been with something like
- Redis (or [28]maybe not). But it is absolutely possible to build
- activity feeds on that stack.
- An amazing thing happened with that project: our attention turned
- elsewhere for several years. During that time, activity feeds
- scaled up 20x while nobody was watching it at all. We made no
- changes whatsoever specifically targeted at activity feeds, but
- everything worked out fine as usage exploded because we were using
- a shared platform. This is the long-term benefit of restraint in
- technology choices in a nutshell.
- This isn’t an absolutist position--while activity feeds stored in
- memcached was judged to be practical, implementing full text search
- with faceting in raw PHP wasn't. So Etsy used Solr.
+This process is not daunting, and it’s not much of a hassle. It’s a handful of
+questions to fill out as homework, followed by a meeting to talk about it. I
+think that if a new technology (or a new service to be created on your
+infrastructure) can pass through this gauntlet unscathed, adding it is fine.
- [29]Back home
+Just Ship.
- [30]Tweet [31]Follow @mcfunley
+Polyglot programming is sold with the promise that letting developers choose
+their own tools with complete freedom will make them more effective at solving
+problems. This is a naive definition of the problems at best, and motivated
+reasoning at worst. The weight of day-to-day operational [20]toil this creates
+crushes you to death.
- * [32]GitHub
- * [33]LinkedIn
+Mindful choice of technology gives engineering minds real freedom: the freedom
+to [21]contemplate bigger questions. Technology for its own sake is snake oil.
- [34]Feed | Copyright © 2004-2023 Dan McKinley.
+Update, July 27th 2015: I wrote a talk based on this article. You can see it
+[22]here.
-References
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 1. https://mcfunley.com/feed.xml
- 2. https://mcfunley.com/
- 3. https://twitter.com/intent/tweet
- 4. https://twitter.com/mcfunley
- 5. https://mcfunley.com/choose-boring-technology
- 6. http://laughingmeme.org/
- 7. https://mcfunley.com/data-driven-products-lean-startup-2014
- 8. http://rc3.org/2015/03/24/the-pleasure-of-building-big-things/
- 9. https://mcfunley.com/why-mongodb-never-worked-out-at-etsy
- 10. https://consul.io/
- 11. https://www.etsy.com/
- 12. https://stripe.com/
- 13. https://mcfunley.com/choose-boring-technology#f1
- 14. https://mcfunley.com/choose-boring-technology#f2
- 15. https://mcfunley.com/choose-boring-technology#f3
- 16. http://www.evanjones.ca/jvm-mmap-pause.html
- 17. http://martinfowler.com/bliki/PolyglotPersistence.html
- 18. https://twitter.com/coda/status/580531932393504768
- 19. https://twitter.com/mcfunley/status/578603932949164032
- 20. https://mcfunley.com/choose-boring-technology#f4
- 21. https://twitter.com/handler
- 22. https://mcfunley.com/effective-web-experimentation-as-a-homo-narrans
- 23. http://boringtechnology.club/
- 24. https://www.youtube.com/watch?v=eenrfm50mXw
- 25. http://www.sec.gov/Archives/edgar/data/1370637/000119312515077045/d806992ds1.htm
- 26. http://en.wikipedia.org/wiki/I_know_that_I_know_nothing
- 27. https://speakerdeck.com/mcfunley/etsy-activity-feed-architecture
- 28. https://aphyr.com/posts/283-call-me-maybe-redis
- 29. https://mcfunley.com/
- 30. https://twitter.com/intent/tweet
- 31. https://twitter.com/mcfunley
- 32. https://github.com/mcfunley
- 33. https://www.linkedin.com/in/mcfunley
- 34. https://mcfunley.com/feed.xml
+ 1. Etsy in its early years suffered from this pretty badly. We hired a bunch
+ of Python programmers and decided that we needed to find something for them
+ to do in Python, and the only thing that came to mind was creating a
+ pointless middle layer that [23]required years of effort to amputate.
+ Meanwhile, the 90th percentile search latency was about two minutes. [24]
+ Etsy didn't fail, but it went several years without shipping anything at
+ all. So it took longer to succeed than it needed to.
+ 2. We often casually refer to the boring/bad intersection of doom as
+ “enterprise software,” but that terminology may be imprecise.
+ 3. In saying this Rumsfeld was either intentionally or unintentionally
+ alluding to [25]the Socratic Paradox. Socrates was by all accounts a
+ thoughtful individual in a number of ways that Rumsfeld is not.
+ 4. A good example of this from my experience is [26]Etsy’s activity feeds.
+ When we built this feature, we were working pretty hard to consolidate most
+ of Etsy onto PHP, MySQL, Memcached, and Gearman (a PHP job server). It was
+ much more complicated to implement the feature on that stack than it might
+ have been with something like Redis (or [27]maybe not). But it is
+ absolutely possible to build activity feeds on that stack.
+
+ An amazing thing happened with that project: our attention turned elsewhere
+ for several years. During that time, activity feeds scaled up 20x while
+ nobody was watching it at all. We made no changes whatsoever specifically
+ targeted at activity feeds, but everything worked out fine as usage
+ exploded because we were using a shared platform. This is the long-term
+ benefit of restraint in technology choices in a nutshell.
+
+ This isn’t an absolutist position--while activity feeds stored in memcached
+ was judged to be practical, implementing full text search with faceting in
+ raw PHP wasn't. So Etsy used Solr.
+
+[28]Back home
+[29] Tweet [30] Follow @mcfunley
+
+ • [31]GitHub
+ • [32]LinkedIn
+
+[33]Feed | Copyright © 2004-2023 Dan McKinley.
+
+References:
+
+[1] https://mcfunley.com/
+[2] https://twitter.com/intent/tweet
+[3] https://twitter.com/mcfunley
+[4] https://mcfunley.com/choose-boring-technology
+[5] http://laughingmeme.org/
+[6] https://mcfunley.com/data-driven-products-lean-startup-2014
+[7] http://rc3.org/2015/03/24/the-pleasure-of-building-big-things/
+[8] https://mcfunley.com/why-mongodb-never-worked-out-at-etsy
+[9] https://consul.io/
+[10] https://www.etsy.com/
+[11] https://stripe.com/
+[12] https://mcfunley.com/choose-boring-technology#f1
+[13] https://mcfunley.com/choose-boring-technology#f2
+[14] https://mcfunley.com/choose-boring-technology#f3
+[15] http://www.evanjones.ca/jvm-mmap-pause.html
+[16] http://martinfowler.com/bliki/PolyglotPersistence.html
+[17] https://twitter.com/coda/status/580531932393504768
+[18] https://twitter.com/mcfunley/status/578603932949164032
+[19] https://mcfunley.com/choose-boring-technology#f4
+[20] https://twitter.com/handler
+[21] https://mcfunley.com/effective-web-experimentation-as-a-homo-narrans
+[22] http://boringtechnology.club/
+[23] https://www.youtube.com/watch?v=eenrfm50mXw
+[24] http://www.sec.gov/Archives/edgar/data/1370637/000119312515077045/d806992ds1.htm
+[25] http://en.wikipedia.org/wiki/I_know_that_I_know_nothing
+[26] https://speakerdeck.com/mcfunley/etsy-activity-feed-architecture
+[27] https://aphyr.com/posts/283-call-me-maybe-redis
+[28] https://mcfunley.com/
+[29] https://twitter.com/intent/tweet
+[30] https://twitter.com/mcfunley
+[31] https://github.com/mcfunley
+[32] https://www.linkedin.com/in/mcfunley
+[33] https://mcfunley.com/feed.xml
diff --git a/static/archive/medium-com-efpmux.txt b/static/archive/medium-com-efpmux.txt
index d0e5467..0f4004b 100644
--- a/static/archive/medium-com-efpmux.txt
+++ b/static/archive/medium-com-efpmux.txt
@@ -1,297 +1,301 @@
- #[1]Medium [2]alternate
+[1]Open in app
- [3]Open in app
+Sign up
- (BUTTON) Sign up
+[3]Sign in
- [4]Sign in
- ____________________
- Write
+[4]
+[5][ ]
+[6]
+Write
+[7]
- (BUTTON) Sign up
+Sign up
- [5]Sign in
- (BUTTON)
+[9]Sign in
+
+[1]
Go Project Layout
- Kyle C. Quest (Q)
- golang-learn
+[11]
+Kyle C. Quest (Q)
+[12]
+golang-learn
- [6]Kyle C. Quest (Q)
- ·
+[13]Kyle C. Quest (Q)
- [7]Follow
- Published in
- [8]
+·
- golang-learn
- ·
- 5 min read
- ·
- Sep 11, 2017
+[14]Follow
- --
- (BUTTON)
+Published in
+[15]
- 11
- (BUTTON)
+golang-learn
- Listen
- (BUTTON)
+·
+5 min read
+·
+Sep 11, 2017
- Share
+--
- You went through the ‘[9]Tour of Go’, played with
- [10]https://play.golang.org/ and you feel you are ready to write some
- code. Great! However, you are not sure how to structure your projects.
- Can you put your code anywhere you want? Is there a standard way to
- organize your code? What if you need to have multiple application
- binaries? What does it mean to be ‘go gettable’? These are some of the
- questions you’ll be asking yourself.
+11
- First, you have to understand Go workspaces. ‘[11]How to Write Go Code’
- is a good place to start. By default, Go keeps and expects all code in
- a single workspace. This place is identified by the GOPATH environment
- variable. What does it mean for you? It means you have to put your code
- in the default workspace or you have to change the GOPATH variable to
- point to your own location. Either way the actual source code for your
- project needs to be placed in the src subdirectory (e.g.,
- $GOPATH/src/your_project or
- $GOPATH/src/github.com/your_github_username/your_project). Technically
- your project doesn’t have to be in a workspace if you don’t import
- external packages and you use relative imports for your own code, but
- it’s not recommended. It’s fine for a toy project or a PoC though. Go
- v1.11 does introduce the concept of [12]modules that allows you to have
- your project code outside of your GOPATHwithout the import restrictions
- mentioned above, but it’s still an experimental feature at this point
- in time.
+Listen
- You have your project directory in the right place. What’s next?
+Share
- For a PoC or a very small project where you are the only one writing
- the code using a single main.go file in the root directory for your
- project is enough. If you know your project will be large enough or
- it’ll go into production and others will be contributing to it you
- should consider adopting, at least, some of the project layout patterns
- outlined here.
+You went through the ‘[19]Tour of Go’, played with [20]https://play.golang.org/
+and you feel you are ready to write some code. Great! However, you are not sure
+how to structure your projects. Can you put your code anywhere you want? Is
+there a standard way to organize your code? What if you need to have multiple
+application binaries? What does it mean to be ‘go gettable’? These are some of
+the questions you’ll be asking yourself.
- There are a number of project layout patterns emerging in the Go
- ecosystem. The two most common patterns are the cmd and pkg
- directories. You should adopt these patterns unless you have a tiny
- project.
+First, you have to understand Go workspaces. ‘[21]How to Write Go Code’ is a
+good place to start. By default, Go keeps and expects all code in a single
+workspace. This place is identified by the GOPATH environment variable. What
+does it mean for you? It means you have to put your code in the default
+workspace or you have to change the GOPATH variable to point to your own
+location. Either way the actual source code for your project needs to be placed
+in the src subdirectory (e.g., $GOPATH/src/your_project or $GOPATH/src/
+github.com/your_github_username/your_project). Technically your project doesn’t
+have to be in a workspace if you don’t import external packages and you use
+relative imports for your own code, but it’s not recommended. It’s fine for a
+toy project or a PoC though. Go v1.11 does introduce the concept of [22]modules
+that allows you to have your project code outside of your GOPATHwithout the
+import restrictions mentioned above, but it’s still an experimental feature at
+this point in time.
- The cmd layout pattern is very useful when you need to have more than
- one application binary. Each binary gets a subdirectory (e.g.,
- your_project/cmd/your_app). This patterns also helps you keep your
- project/package ‘go gettable’. What does it mean? It means you can use
- the go get command to fetch (and install) your project, its
- applications and its libraries (e.g., go get
- github.com/your_github_username/your_project/cmd/appxg). You don’t have
- to separate the application files. You’ll be able to build each
- application with the right set of go build flags, but go get will no
- longer work because it will not know which application code to build.
- The official [13]Go tools is one example of the cmd layout patter. A
- number of other well known projects use the same pattern:
- [14]Kubernetes, [15]Docker, [16]Prometheus, [17]Influxdb.
+You have your project directory in the right place. What’s next?
- The pkg layout pattern is also pretty popular. For new Go developers
- it’s one of the most confusing package structure concepts because Go
- workspaces have a directory with the same name and that directory has a
- different purpose (it’s used to store object files for the packages the
- Go compiler builds). The pkg directory is where you put your public
- libraries. They can be used internally by your application. They can
- also be used by external projects. This is an informal contract between
- you and other external users of your code. Other projects will import
- these libraries expecting them to work, so think twice before you put
- something here. Many well known projects use this pattern:
- [18]Kubernetes, [19]Docker, [20]Grafana, [21]Influxdb, [22]Etcd.
+For a PoC or a very small project where you are the only one writing the code
+using a single main.go file in the root directory for your project is enough.
+If you know your project will be large enough or it’ll go into production and
+others will be contributing to it you should consider adopting, at least, some
+of the project layout patterns outlined here.
- Some of the libraries in the pkg directory are not always for public
- use. Why is that? It happens because many existing Go projects predate
- the ability to hide internal packages. Some projects put those internal
- libraries in the pkg directory to be consistent with the rest of their
- code structure. Other projects put their internal libraries into
- separate directories outside of the pkg directory. [23]Go 1.4 introduce
- an ability to hide code using internal directories. What does it mean?
- If you put your code in an ‘internal’ directory no external project
- will be able to import that code. Even other code in your project won’t
- be able to access this internal code if it lives outside of its parent
- directory. This feature is not widely used yet because it’s relatively
- new; however, it’s extremely valuable as an additional layer of control
- (in addition to the lowercase and uppercase function visibility rules
- in Go). A number of new and well known projects use this pattern:
- [24]Dep, [25]Docker, [26]Nsq, [27]Go Ethereal, [28]Contour.
+There are a number of project layout patterns emerging in the Go ecosystem. The
+two most common patterns are the cmd and pkg directories. You should adopt
+these patterns unless you have a tiny project.
- The internal directory is the place to put your private packages. You
- can optionally add additional structure by separating your internally
- shared libraries (e.g., your_project/internal/pkg/your_private_lib) and
- the application code you don’t want others to import (e.g.,
- your_project/internal/app/your_app). When you put all of you private
- code in the ‘internal’ directory the application code in the cmd
- directory will be limited to small files that define the ‘main’
- function for the corresponding application binaries. Everything else
- will be imported from the internal or pkg directories ([29]ark, from
- Heptio, and [30]loki, from Grafana, are good examples of this tiny main
- package pattern).
+The cmd layout pattern is very useful when you need to have more than one
+application binary. Each binary gets a subdirectory (e.g., your_project/cmd/
+your_app). This patterns also helps you keep your project/package ‘go
+gettable’. What does it mean? It means you can use the go get command to fetch
+(and install) your project, its applications and its libraries (e.g., go get
+github.com/your_github_username/your_project/cmd/appxg). You don’t have to
+separate the application files. You’ll be able to build each application with
+the right set of go build flags, but go get will no longer work because it will
+not know which application code to build. The official [23]Go tools is one
+example of the cmd layout patter. A number of other well known projects use the
+same pattern: [24]Kubernetes, [25]Docker, [26]Prometheus, [27]Influxdb.
- What if you forked and modified a piece of an external project? Some
- projects put that code in the pkg directory, but it’s better to put it
- in the third_party top level directory to keep your code separate from
- the code you borrowed from others.
+The pkg layout pattern is also pretty popular. For new Go developers it’s one
+of the most confusing package structure concepts because Go workspaces have a
+directory with the same name and that directory has a different purpose (it’s
+used to store object files for the packages the Go compiler builds). The pkg
+directory is where you put your public libraries. They can be used internally
+by your application. They can also be used by external projects. This is an
+informal contract between you and other external users of your code. Other
+projects will import these libraries expecting them to work, so think twice
+before you put something here. Many well known projects use this pattern: [28]
+Kubernetes, [29]Docker, [30]Grafana, [31]Influxdb, [32]Etcd.
- What about the external packages you import in your projects? Where do
- they go? You have several options. You can keep them outside of your
- project. The packages you install with go get will be saved in your Go
- workspace. It works most of the times, but depending on the package it
- might be brittle and unpredictable because when somebody else tries to
- build your project they might get a backward incompatible version of
- that package. The solution is ‘vendoring’. With ‘vendoring’ you freeze
- your dependencies by committing them with your project. [31]Go 1.6
- introduced a standard way to ‘vendor’ external packages (it was an
- experimental feature in Go 1.5). Put your external package in the
- vendor directory. How is this different from the third_party directory?
- If you import and use external code as-is then it should go into the
- vendor directory. If you are using a modified version of an external
- project then put it in the third_party directory.
+Some of the libraries in the pkg directory are not always for public use. Why
+is that? It happens because many existing Go projects predate the ability to
+hide internal packages. Some projects put those internal libraries in the pkg
+directory to be consistent with the rest of their code structure. Other
+projects put their internal libraries into separate directories outside of the
+pkg directory. [33]Go 1.4 introduce an ability to hide code using internal
+directories. What does it mean? If you put your code in an ‘internal’ directory
+no external project will be able to import that code. Even other code in your
+project won’t be able to access this internal code if it lives outside of its
+parent directory. This feature is not widely used yet because it’s relatively
+new; however, it’s extremely valuable as an additional layer of control (in
+addition to the lowercase and uppercase function visibility rules in Go). A
+number of new and well known projects use this pattern: [34]Dep, [35]Docker,
+[36]Nsq, [37]Go Ethereal, [38]Contour.
- If you want to learn more about the project structure used by other Go
- projects read the ‘[32]Analysis of the Top 1000 Go Repositories’. It’s
- a little dated, but it’s still useful.
+The internal directory is the place to put your private packages. You can
+optionally add additional structure by separating your internally shared
+libraries (e.g., your_project/internal/pkg/your_private_lib) and the
+application code you don’t want others to import (e.g., your_project/internal/
+app/your_app). When you put all of you private code in the ‘internal’ directory
+the application code in the cmd directory will be limited to small files that
+define the ‘main’ function for the corresponding application binaries.
+Everything else will be imported from the internal or pkg directories ([39]ark,
+from Heptio, and [40]loki, from Grafana, are good examples of this tiny main
+package pattern).
- A real project will have additional directories too. You can use this
- layout template as a starting point for your Go projects:
- [33]https://github.com/golang-standards/project-layout. It covers the
- Go project layout patterns described in this blog post and it includes
- a number of supporting directories you’ll need to have.
+What if you forked and modified a piece of an external project? Some projects
+put that code in the pkg directory, but it’s better to put it in the
+third_party top level directory to keep your code separate from the code you
+borrowed from others.
- Now it’s time to write some code! If you don’t have Go installed take a
- look at this [34]quick setup guide for Mac OS X (setup on other
- platforms is similar). Go through the ‘[35]Tour of Go’ if you haven’t
- done it yet and then read ’[36]50 Shades of Go’ to learn about the most
- common gotchas in Go, which will save you quite a bit of time when you
- start writing and debugging code.
- Golang
- Go
- Standards
- Project Structure
+What about the external packages you import in your projects? Where do they go?
+You have several options. You can keep them outside of your project. The
+packages you install with go get will be saved in your Go workspace. It works
+most of the times, but depending on the package it might be brittle and
+unpredictable because when somebody else tries to build your project they might
+get a backward incompatible version of that package. The solution is
+‘vendoring’. With ‘vendoring’ you freeze your dependencies by committing them
+with your project. [41]Go 1.6 introduced a standard way to ‘vendor’ external
+packages (it was an experimental feature in Go 1.5). Put your external package
+in the vendor directory. How is this different from the third_party directory?
+If you import and use external code as-is then it should go into the vendor
+directory. If you are using a modified version of an external project then put
+it in the third_party directory.
- --
+If you want to learn more about the project structure used by other Go projects
+read the ‘[42]Analysis of the Top 1000 Go Repositories’. It’s a little dated,
+but it’s still useful.
- --
- (BUTTON)
+A real project will have additional directories too. You can use this layout
+template as a starting point for your Go projects: [43]https://github.com/
+golang-standards/project-layout. It covers the Go project layout patterns
+described in this blog post and it includes a number of supporting directories
+you’ll need to have.
- 11
- (BUTTON)
- Kyle C. Quest (Q)
- golang-learn
- (BUTTON) Follow
- [37](BUTTON)
- [38]
+Now it’s time to write some code! If you don’t have Go installed take a look at
+this [44]quick setup guide for Mac OS X (setup on other platforms is similar).
+Go through the ‘[45]Tour of Go’ if you haven’t done it yet and then read ’[46]
+50 Shades of Go’ to learn about the most common gotchas in Go, which will save
+you quite a bit of time when you start writing and debugging code.
+
+[47]
+Golang
+[48]
+Go
+[49]
+Standards
+[50]
+Project Structure
+
+--
+
+--
+
+11
+
+[53]
+Kyle C. Quest (Q)
+[54]
+golang-learn
+Follow
+[56]
+[58]
Written by Kyle C. Quest (Q)
- [39]358 Followers
- ·Editor for
- [40]
+[59]358 Followers
+·Editor for
+[60]
- golang-learn
+golang-learn
- CTO / Redefining DevOps * Hacker @DockerSlim * @Golang50Shades * Cloud
- Native * Data * Security
- (BUTTON) Follow
- [41](BUTTON)
- [42]
+CTO / Redefining DevOps * Hacker @DockerSlim * @Golang50Shades * Cloud Native *
+Data * Security
- Help
- [43]
+Follow
+[62]
+[64]
- Status
- [44]
+Help
- About
- [45]
+[65]
- Careers
- [46]
+Status
- Blog
- [47]
+[66]
- Privacy
- [48]
+About
- Terms
- [49]
+[67]
- Text to speech
- [50]
+Careers
- Teams
+[68]
-References
+Blog
- Visible links:
- 1. https://medium.com/osd.xml
- 2. android-app://com.medium.reader/https/medium.com/p/e5213cdcfaa2
- 3. https://rsci.app.link/?$canonical_url=https://medium.com/p/e5213cdcfaa2&~feature=LoOpenInAppButton&~channel=ShowPostUnderCollection&source=---two_column_layout_nav----------------------------------
- 4. https://medium.com/m/signin?operation=login&redirect=https://medium.com/golang-learn/go-project-layout-e5213cdcfaa2&source=post_page---two_column_layout_nav-----------------------global_nav-----------
- 5. https://medium.com/m/signin?operation=login&redirect=https://medium.com/golang-learn/go-project-layout-e5213cdcfaa2&source=post_page---two_column_layout_nav-----------------------global_nav-----------
- 6. https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
- 7. https://medium.com/m/signin?actionUrl=https://medium.com/_/subscribe/user/6aac7a58837&operation=register&redirect=https://medium.com/golang-learn/go-project-layout-e5213cdcfaa2&user=Kyle+C.+Quest+(Q)&userId=6aac7a58837&source=post_page-6aac7a58837----e5213cdcfaa2---------------------post_header-----------
- 8. https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
- 9. https://tour.golang.org/
- 10. https://play.golang.org/
- 11. https://golang.org/doc/code.html
- 12. https://github.com/golang/go/wiki/Modules
- 13. https://github.com/golang/tools/tree/master/cmd
- 14. https://github.com/kubernetes/kubernetes/tree/master/cmd
- 15. https://github.com/moby/moby/tree/master/cmd
- 16. https://github.com/prometheus/prometheus/tree/master/cmd
- 17. https://github.com/influxdata/influxdb/tree/master/cmd
- 18. https://github.com/kubernetes/kubernetes/tree/master/pkg
- 19. https://github.com/moby/moby/tree/master/pkg
- 20. https://github.com/grafana/grafana/tree/master/pkg
- 21. https://github.com/influxdata/influxdb/tree/master/pkg
- 22. https://github.com/coreos/etcd/tree/master/pkg
- 23. https://golang.org/doc/go1.4#internalpackages
- 24. https://github.com/golang/dep/tree/master/internal
- 25. https://github.com/moby/moby/tree/master/internal
- 26. https://github.com/nsqio/nsq/tree/master/internal
- 27. https://github.com/ethereum/go-ethereum/tree/master/internal
- 28. https://github.com/heptio/contour/tree/master/internal
- 29. https://github.com/heptio/ark/blob/master/cmd/ark/main.go
- 30. https://github.com/grafana/loki/blob/master/cmd/loki/main.go
- 31. https://golang.org/doc/go1.6#go_command
- 32. http://blog.sgmansfield.com/2016/01/an-analysis-of-the-top-1000-go-repositories/
- 33. https://github.com/golang-standards/project-layout
- 34. https://medium.com/golang-learn/quick-go-setup-guide-on-mac-os-x-956b327222b8
- 35. https://tour.golang.org/
- 36. http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/
- 37. https://medium.com/m/signin?actionUrl=/_/api/subscriptions/newsletters/997b4efe98f9&operation=register&redirect=https://medium.com/golang-learn/go-project-layout-e5213cdcfaa2&newsletterV3=6aac7a58837&newsletterV3Id=997b4efe98f9&user=Kyle+C.+Quest+(Q)&userId=6aac7a58837&source=-----e5213cdcfaa2---------------------subscribe_user-----------
- 38. https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
- 39. https://medium.com/@kcq/followers?source=post_page-----e5213cdcfaa2--------------------------------
- 40. https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
- 41. https://medium.com/m/signin?actionUrl=/_/api/subscriptions/newsletters/997b4efe98f9&operation=register&redirect=https://medium.com/golang-learn/go-project-layout-e5213cdcfaa2&newsletterV3=6aac7a58837&newsletterV3Id=997b4efe98f9&user=Kyle+C.+Quest+(Q)&userId=6aac7a58837&source=-----e5213cdcfaa2---------------------subscribe_user-----------
- 42. https://help.medium.com/hc/en-us?source=post_page-----e5213cdcfaa2--------------------------------
- 43. https://medium.statuspage.io/?source=post_page-----e5213cdcfaa2--------------------------------
- 44. https://medium.com/about?autoplay=1&source=post_page-----e5213cdcfaa2--------------------------------
- 45. https://medium.com/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----e5213cdcfaa2--------------------------------
- 46. https://blog.medium.com/?source=post_page-----e5213cdcfaa2--------------------------------
- 47. https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----e5213cdcfaa2--------------------------------
- 48. https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----e5213cdcfaa2--------------------------------
- 49. https://speechify.com/medium?source=post_page-----e5213cdcfaa2--------------------------------
- 50. https://medium.com/business?source=post_page-----e5213cdcfaa2--------------------------------
+[69]
- Hidden links:
- 52. https://medium.com/?source=---two_column_layout_nav----------------------------------
- 53. https://medium.com/m/signin?operation=register&redirect=https%3A%2F%2Fmedium.com%2Fnew-story&source=---two_column_layout_nav-----------------------new_post_topnav-----------
- 54. https://medium.com/search?source=---two_column_layout_nav----------------------------------
- 55. https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
- 56. https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
- 57. https://medium.com/tag/golang?source=post_page-----e5213cdcfaa2---------------golang-----------------
- 58. https://medium.com/tag/go?source=post_page-----e5213cdcfaa2---------------go-----------------
- 59. https://medium.com/tag/standards?source=post_page-----e5213cdcfaa2---------------standards-----------------
- 60. https://medium.com/tag/project-structure?source=post_page-----e5213cdcfaa2---------------project_structure-----------------
- 61. https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
- 62. https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
+Privacy
+
+[70]
+
+Terms
+
+[71]
+
+Text to speech
+
+[72]
+
+Teams
+
+
+References:
+
+[1] https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2Fe5213cdcfaa2&%7Efeature=LoOpenInAppButton&%7Echannel=ShowPostUnderCollection&source=---two_column_layout_nav----------------------------------
+[3] https://medium.com/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Fgolang-learn%2Fgo-project-layout-e5213cdcfaa2&source=post_page---two_column_layout_nav-----------------------global_nav-----------
+[4] https://medium.com/?source=---two_column_layout_nav----------------------------------
+[6] https://medium.com/m/signin?operation=register&redirect=https%3A%2F%2Fmedium.com%2Fnew-story&source=---two_column_layout_nav-----------------------new_post_topnav-----------
+[7] https://medium.com/search?source=---two_column_layout_nav----------------------------------
+[9] https://medium.com/m/signin?operation=login&redirect=https%3A%2F%2Fmedium.com%2Fgolang-learn%2Fgo-project-layout-e5213cdcfaa2&source=post_page---two_column_layout_nav-----------------------global_nav-----------
+[11] https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
+[12] https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
+[13] https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
+[14] https://medium.com/m/signin?actionUrl=https%3A%2F%2Fmedium.com%2F_%2Fsubscribe%2Fuser%2F6aac7a58837&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgolang-learn%2Fgo-project-layout-e5213cdcfaa2&user=Kyle+C.+Quest+%28Q%29&userId=6aac7a58837&source=post_page-6aac7a58837----e5213cdcfaa2---------------------post_header-----------
+[15] https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
+[19] https://tour.golang.org/
+[20] https://play.golang.org/
+[21] https://golang.org/doc/code.html
+[22] https://github.com/golang/go/wiki/Modules
+[23] https://github.com/golang/tools/tree/master/cmd
+[24] https://github.com/kubernetes/kubernetes/tree/master/cmd
+[25] https://github.com/moby/moby/tree/master/cmd
+[26] https://github.com/prometheus/prometheus/tree/master/cmd
+[27] https://github.com/influxdata/influxdb/tree/master/cmd
+[28] https://github.com/kubernetes/kubernetes/tree/master/pkg
+[29] https://github.com/moby/moby/tree/master/pkg
+[30] https://github.com/grafana/grafana/tree/master/pkg
+[31] https://github.com/influxdata/influxdb/tree/master/pkg
+[32] https://github.com/coreos/etcd/tree/master/pkg
+[33] https://golang.org/doc/go1.4#internalpackages
+[34] https://github.com/golang/dep/tree/master/internal
+[35] https://github.com/moby/moby/tree/master/internal
+[36] https://github.com/nsqio/nsq/tree/master/internal
+[37] https://github.com/ethereum/go-ethereum/tree/master/internal
+[38] https://github.com/heptio/contour/tree/master/internal
+[39] https://github.com/heptio/ark/blob/master/cmd/ark/main.go
+[40] https://github.com/grafana/loki/blob/master/cmd/loki/main.go
+[41] https://golang.org/doc/go1.6#go_command
+[42] http://blog.sgmansfield.com/2016/01/an-analysis-of-the-top-1000-go-repositories/
+[43] https://github.com/golang-standards/project-layout
+[44] https://medium.com/golang-learn/quick-go-setup-guide-on-mac-os-x-956b327222b8
+[45] https://tour.golang.org/
+[46] http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/
+[47] https://medium.com/tag/golang?source=post_page-----e5213cdcfaa2---------------golang-----------------
+[48] https://medium.com/tag/go?source=post_page-----e5213cdcfaa2---------------go-----------------
+[49] https://medium.com/tag/standards?source=post_page-----e5213cdcfaa2---------------standards-----------------
+[50] https://medium.com/tag/project-structure?source=post_page-----e5213cdcfaa2---------------project_structure-----------------
+[53] https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
+[54] https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
+[56] https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2F997b4efe98f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgolang-learn%2Fgo-project-layout-e5213cdcfaa2&newsletterV3=6aac7a58837&newsletterV3Id=997b4efe98f9&user=Kyle+C.+Quest+%28Q%29&userId=6aac7a58837&source=-----e5213cdcfaa2---------------------subscribe_user-----------
+[58] https://medium.com/@kcq?source=post_page-----e5213cdcfaa2--------------------------------
+[59] https://medium.com/@kcq/followers?source=post_page-----e5213cdcfaa2--------------------------------
+[60] https://medium.com/golang-learn?source=post_page-----e5213cdcfaa2--------------------------------
+[62] https://medium.com/m/signin?actionUrl=%2F_%2Fapi%2Fsubscriptions%2Fnewsletters%2F997b4efe98f9&operation=register&redirect=https%3A%2F%2Fmedium.com%2Fgolang-learn%2Fgo-project-layout-e5213cdcfaa2&newsletterV3=6aac7a58837&newsletterV3Id=997b4efe98f9&user=Kyle+C.+Quest+%28Q%29&userId=6aac7a58837&source=-----e5213cdcfaa2---------------------subscribe_user-----------
+[64] https://help.medium.com/hc/en-us?source=post_page-----e5213cdcfaa2--------------------------------
+[65] https://medium.statuspage.io/?source=post_page-----e5213cdcfaa2--------------------------------
+[66] https://medium.com/about?autoplay=1&source=post_page-----e5213cdcfaa2--------------------------------
+[67] https://medium.com/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----e5213cdcfaa2--------------------------------
+[68] https://blog.medium.com/?source=post_page-----e5213cdcfaa2--------------------------------
+[69] https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----e5213cdcfaa2--------------------------------
+[70] https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----e5213cdcfaa2--------------------------------
+[71] https://speechify.com/medium?source=post_page-----e5213cdcfaa2--------------------------------
+[72] https://medium.com/business?source=post_page-----e5213cdcfaa2--------------------------------
diff --git a/static/archive/mike-puddingtime-org-svf0ua.txt b/static/archive/mike-puddingtime-org-svf0ua.txt
index 14541ef..cb0feb8 100644
--- a/static/archive/mike-puddingtime-org-svf0ua.txt
+++ b/static/archive/mike-puddingtime-org-svf0ua.txt
@@ -1,183 +1,169 @@
- [1]←Home [2]Archive [3]Tags [4]About
+[1] ←Home [2]Archive [3]Tags [4]About
- Daily notes for 2023-07-17
+Daily notes for 2023-07-17
- Jul 17, 2023 · 1447 words · 7 minute read
+Jul 17, 2023 · 1447 words · 7 minute read
+Table of Contents
- Table of Contents
-
- * [5]Notes on conflict
- * [6]The INT650
+ • [5]Notes on conflict
+ • [6]The INT650
Notes on conflict [7]🔗
- When my master and I were walking in the rain, he would say, “Do not
- walk so fast, the rain is everywhere.”
- —Shunryu Suzuki
+ When my master and I were walking in the rain, he would say, “Do not walk
+ so fast, the rain is everywhere.”
+ —Shunryu Suzuki
- For a very long time — too much of my life — I thought conflict was a
- sign that there was a problem. I didn’t like disagreeing with people
- about much of anything. I’m using “conflict” in a broad sense: Over
- resources, points of view, vision, beliefs, tastes.
+For a very long time — too much of my life — I thought conflict was a sign that
+there was a problem. I didn’t like disagreeing with people about much of
+anything. I’m using “conflict” in a broad sense: Over resources, points of
+view, vision, beliefs, tastes.
- Over time I shifted on the matter a little, but when I look back on it
- I realize I wasn’t really evolving my attitude toward conflict, I was
- just evolving my response to its existence, while still believing that
- being in a state of conflict is a problem. I just got better at keeping
- my blood pressure low and gritting through it. I think I was looking at
- conflict as a thing that you have to acknowledge exists, but that you
- need to get through as quickly as possible, because it’s a bad place to
- be.
+Over time I shifted on the matter a little, but when I look back on it I
+realize I wasn’t really evolving my attitude toward conflict, I was just
+evolving my response to its existence, while still believing that being in a
+state of conflict is a problem. I just got better at keeping my blood pressure
+low and gritting through it. I think I was looking at conflict as a thing that
+you have to acknowledge exists, but that you need to get through as quickly as
+possible, because it’s a bad place to be.
- That attitude created some problems:
- * When you’re bad at being in conflict, you’re at a disadvantage with
- people who are good at it and mean you harm; and you’re annoying
- people who are good at it and mean you no harm.
- * When you look at conflict as a thing to grit through and end
- quickly it’s hard to maintain your integrity. (See above: The
- people who don’t want what’s best for you (or the business, or the
- world, or etc.) understand this, and the ones who are really good
- at it and a little indifferent toward what’s best for you are
- counting on you to do all the work to get out of conflict.)
- * When you’d rather do anything than admit that you’re in a state of
- conflict, you will eventually do something about your problem that
- is less skillful for having waited than if you’d admitted it to
- yourself (and whoever you’re in conflict with) sooner. Or, as one
- of my past managers put it to me, “don’t be that guy who
- hockey-sticks.” (I nodded then kind of hockey-sticked.)
- * When you’re bad at being in conflict, and you’re willing to be set
- aside your integrity or do other things to get out of it quickly,
- you’ll eventually get tired of “losing” and figure out ways to
- “win” that cause others to see you as, at best, baffling and
- frustrating, and at worst Machiavellian and treacherous.
+That attitude created some problems:
- That, anyhow, is a rough categorization of my many hundreds of
- mishandlings of conflict. Maybe the most interesting thing to me about
- all those mishandlings is that over time I managed to convince myself
- that failing to be in conflict well was a sign of virtue. Moral
- sophistication. “Taking the high road.” “Not worth the stress.”
- “Learning how to play the game.” “Protecting the team.”
+ • When you’re bad at being in conflict, you’re at a disadvantage with people
+ who are good at it and mean you harm; and you’re annoying people who are
+ good at it and mean you no harm.
+ • When you look at conflict as a thing to grit through and end quickly it’s
+ hard to maintain your integrity. (See above: The people who don’t want
+ what’s best for you (or the business, or the world, or etc.) understand
+ this, and the ones who are really good at it and a little indifferent
+ toward what’s best for you are counting on you to do all the work to get
+ out of conflict.)
+ • When you’d rather do anything than admit that you’re in a state of
+ conflict, you will eventually do something about your problem that is less
+ skillful for having waited than if you’d admitted it to yourself (and
+ whoever you’re in conflict with) sooner. Or, as one of my past managers put
+ it to me, “don’t be that guy who hockey-sticks.” (I nodded then kind of
+ hockey-sticked.)
+ • When you’re bad at being in conflict, and you’re willing to be set aside
+ your integrity or do other things to get out of it quickly, you’ll
+ eventually get tired of “losing” and figure out ways to “win” that cause
+ others to see you as, at best, baffling and frustrating, and at worst
+ Machiavellian and treacherous.
- Over the past few years, I’ve changed on the matter: On balance, I
- definitely don’t think its existence is a sign there’s a problem. It’s
- just a sign that there’s a conflict.
+That, anyhow, is a rough categorization of my many hundreds of mishandlings of
+conflict. Maybe the most interesting thing to me about all those mishandlings
+is that over time I managed to convince myself that failing to be in conflict
+well was a sign of virtue. Moral sophistication. “Taking the high road.” “Not
+worth the stress.” “Learning how to play the game.” “Protecting the team.”
- I still feel a little cautious about conflict when I don’t know the
- person I’m in conflict with very well. Caution is useful, because
- people who are bad at being in conflict but mean well — people who are
- “good eggs” — can still sort of mess things up, because if I have to
- bet on whether someone hates “losing” or just grinning and bearing it
- more, my money is on them hating losing more. When things get to a
- place where it feels existential to them, even good eggs can act sort
- of rotten. So you have to take time and attend to the interaction so
- they can be in conflict and feel safe about it.
+Over the past few years, I’ve changed on the matter: On balance, I definitely
+don’t think its existence is a sign there’s a problem. It’s just a sign that
+there’s a conflict.
- I still think I have a responsibility to introduce the existence of
- conflict with kindness, or receive the news that I’ve entered into a
- state of conflict in a manner that invites a full airing. “Relaxed and
- possibly delighted curiosity,” I suppose I’d call it, rather than a
- furrowing of the brow and assurances that I want to restore harmony at
- once. Because I don’t want to restore harmony at once. I want to
- understand why we want different things, then figure out how we can
- both behave with integrity while we sort that out.
+I still feel a little cautious about conflict when I don’t know the person I’m
+in conflict with very well. Caution is useful, because people who are bad at
+being in conflict but mean well — people who are “good eggs” — can still sort
+of mess things up, because if I have to bet on whether someone hates “losing”
+or just grinning and bearing it more, my money is on them hating losing more.
+When things get to a place where it feels existential to them, even good eggs
+can act sort of rotten. So you have to take time and attend to the interaction
+so they can be in conflict and feel safe about it.
+
+I still think I have a responsibility to introduce the existence of conflict
+with kindness, or receive the news that I’ve entered into a state of conflict
+in a manner that invites a full airing. “Relaxed and possibly delighted
+curiosity,” I suppose I’d call it, rather than a furrowing of the brow and
+assurances that I want to restore harmony at once. Because I don’t want to
+restore harmony at once. I want to understand why we want different things,
+then figure out how we can both behave with integrity while we sort that out.
The INT650 [8]🔗
- I finally quit waffling on what to do with the Royal Enfield Himalayan.
- I took it up to [9]Sabatino Moto in St. Johns and traded it in for
- another Royal Enfield: An INT650 (“Interceptor” everywhere else in the
- world, but not in North America where Honda owns the rights to the
- name.)
+[f4d4087a00284d89b3cedd2720a3b117]
- It’s a pretty night and day difference. The Himalayan is a mountain
- goat, and the INT650 is … something a little prettier and a little less
- rough. I was never going to ride the Himalayan the way it was meant to
- be ridden — fire roads, gravel, dirt — and I didn’t have the patience
- for the very “work in progress” attitude Royal Enfield took toward it.
- One thing you learn from all the Himalayan videos on YouTube is that
- the people who love them best don’t mind fiddling, tweaking, and
- wrenching. After reading hundreds of owners talk about their
- experiences, I have come to realize I lost the factory QA lottery on
- mine, and that engendered a lack of confidence in it that I never
- recovered from.
+I finally quit waffling on what to do with the Royal Enfield Himalayan. I took
+it up to [9]Sabatino Moto in St. Johns and traded it in for another Royal
+Enfield: An INT650 (“Interceptor” everywhere else in the world, but not in
+North America where Honda owns the rights to the name.)
- Also turns out, I think, that I had a bad dealer:
+It’s a pretty night and day difference. The Himalayan is a mountain goat, and
+the INT650 is … something a little prettier and a little less rough. I was
+never going to ride the Himalayan the way it was meant to be ridden — fire
+roads, gravel, dirt — and I didn’t have the patience for the very “work in
+progress” attitude Royal Enfield took toward it. One thing you learn from all
+the Himalayan videos on YouTube is that the people who love them best don’t
+mind fiddling, tweaking, and wrenching. After reading hundreds of owners talk
+about their experiences, I have come to realize I lost the factory QA lottery
+on mine, and that engendered a lack of confidence in it that I never recovered
+from.
- The first RE dealer in the Portland area doesn’t really want to sell
- them, and it really does not want to do anything other than the most
- basic service. I think I’ve documented that elsewhere, so I won’t go
- into it more here, but I’ll just offer the observation that RE’s
- strategy of linking up with Harley dealers to build out its US
- distribution network did its customers no favors.
+Also turns out, I think, that I had a bad dealer:
- The folks at Sabatino, on the other hand, seem to have a genuine
- appreciation for the bikes, that extends all the way to acknowledging
- that RE has some QA challenges. Sabatino addresses that by doing their
- own QA when they uncrate a new bike. And they’re willing to talk about
- the ups and downs of each model. My head was briefly turned by another
- model, and I got a reasoned, balanced, discussion of why maybe that one
- wouldn’t work for me.
+The first RE dealer in the Portland area doesn’t really want to sell them, and
+it really does not want to do anything other than the most basic service. I
+think I’ve documented that elsewhere, so I won’t go into it more here, but I’ll
+just offer the observation that RE’s strategy of linking up with Harley dealers
+to build out its US distribution network did its customers no favors.
- They also offer test rides. I can name one dealership that grudgingly
- made me sign a waiver and write a check for the full amount to test
- ride a Grom for five laps around their parking lot, and they only did
- that because it was a two-year-old model and they’d sold the newer one
- they promised me out from under me. Sabatino made me do the waiver,
- share my insurance information, and hand over my license, but then they
- tossed me the keys and told me they’d see me when they saw me.
+The folks at Sabatino, on the other hand, seem to have a genuine appreciation
+for the bikes, that extends all the way to acknowledging that RE has some QA
+challenges. Sabatino addresses that by doing their own QA when they uncrate a
+new bike. And they’re willing to talk about the ups and downs of each model. My
+head was briefly turned by another model, and I got a reasoned, balanced,
+discussion of why maybe that one wouldn’t work for me.
- Anyhow, the test ride sold me. I’ve been through several configurations
- of motorcycle and scooter since getting my motorcycle endorsement —
- maxiscoots, normal scoots, mini-moto, cruiser, trail bike, dual-sport —
- and none of them have been the thing I first imagined myself riding
- when I finally decided to learn how to ride. Well, learn how to ride as
- an adult, anyhow. The twin 650 runs and sounds nice, the bike handles
- more comfortably than the Himalayan despite there being 40 pounds more
- of it, and the super-simple analog speedo and tach are just sort of
- pleasant. I ran it around St. Johns for a while, was struck by how
- immediately comfortable it was (and how confident I felt on it), and
- that was that.
+They also offer test rides. I can name one dealership that grudgingly made me
+sign a waiver and write a check for the full amount to test ride a Grom for
+five laps around their parking lot, and they only did that because it was a
+two-year-old model and they’d sold the newer one they promised me out from
+under me. Sabatino made me do the waiver, share my insurance information, and
+hand over my license, but then they tossed me the keys and told me they’d see
+me when they saw me.
- Yesterday I took it on a ride out Foster Road toward Damascus. There’s
- a side road I head out onto that eventually rejoins on the other side
- of Damascus, close to a back road that joins the highway down to
- Estacada. So I headed out past Estacada, to see how it did on a small
- back highway. There was a little bit of buffeting — no fairings — but
- it ran and handled well. I felt more confident on the little back roads
- coming back than I did heading out as I got to know the bike better. I
- did decide to detract from its vintage purity a little by ordering a
- Dart flyscreen when I got back: People say it helps clean up the
- turbulence at highway speeds, and keeps the bugs off the pretty silver
- cans.
+Anyhow, the test ride sold me. I’ve been through several configurations of
+motorcycle and scooter since getting my motorcycle endorsement — maxiscoots,
+normal scoots, mini-moto, cruiser, trail bike, dual-sport — and none of them
+have been the thing I first imagined myself riding when I finally decided to
+learn how to ride. Well, learn how to ride as an adult, anyhow. The twin 650
+runs and sounds nice, the bike handles more comfortably than the Himalayan
+despite there being 40 pounds more of it, and the super-simple analog speedo
+and tach are just sort of pleasant. I ran it around St. Johns for a while, was
+struck by how immediately comfortable it was (and how confident I felt on it),
+and that was that.
- Anyhow, glad I’ve got it in the driveway with so much of the riding
- season left, and I can wholeheartedly recommend Sabatino Moto if you’re
- looking to buy one for yourself.
+Yesterday I took it on a ride out Foster Road toward Damascus. There’s a side
+road I head out onto that eventually rejoins on the other side of Damascus,
+close to a back road that joins the highway down to Estacada. So I headed out
+past Estacada, to see how it did on a small back highway. There was a little
+bit of buffeting — no fairings — but it ran and handled well. I felt more
+confident on the little back roads coming back than I did heading out as I got
+to know the bike better. I did decide to detract from its vintage purity a
+little by ordering a Dart flyscreen when I got back: People say it helps clean
+up the turbulence at highway speeds, and keeps the bugs off the pretty silver
+cans.
- [10]journal [11]conflict
+Anyhow, glad I’ve got it in the driveway with so much of the riding season
+left, and I can wholeheartedly recommend Sabatino Moto if you’re looking to buy
+one for yourself.
- Created with Sketch.
+[10]journal [11]conflict
+[12] Created with Sketch.
+© Copyright 2024 mph
+Powered by [13]Hugo Theme By [14]nodejh
- © Copyright 2024 mph
+References:
- Powered by [12]Hugo Theme By [13]nodejh
-
-References
-
- Visible links:
- 1. https://mike.puddingtime.org/
- 2. https://mike.puddingtime.org/posts
- 3. https://mike.puddingtime.org/tags
- 4. https://mike.puddingtime.org/about
- 5. https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#notes-on-conflict
- 6. https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#the-int650
- 7. https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#notes-on-conflict
- 8. https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#the-int650
- 9. https://www.sabatinomoto.com/
- 10. https://mike.puddingtime.org/tags/journal
- 11. https://mike.puddingtime.org/tags/conflict
- 12. http://www.gohugo.io/
- 13. https://github.com/nodejh/hugo-theme-mini
-
- Hidden links:
- 15. https://github.com/pdxmph
+[1] https://mike.puddingtime.org/
+[2] https://mike.puddingtime.org/posts
+[3] https://mike.puddingtime.org/tags
+[4] https://mike.puddingtime.org/about
+[5] https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#notes-on-conflict
+[6] https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#the-int650
+[7] https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#notes-on-conflict
+[8] https://mike.puddingtime.org/posts/2023-07-17-daily-notes/#the-int650
+[9] https://www.sabatinomoto.com/
+[10] https://mike.puddingtime.org/tags/journal
+[11] https://mike.puddingtime.org/tags/conflict
+[12] https://github.com/pdxmph
+[13] http://www.gohugo.io/
+[14] https://github.com/nodejh/hugo-theme-mini
diff --git a/static/archive/samkriss-substack-com-5indyq.txt b/static/archive/samkriss-substack-com-5indyq.txt
index 05235de..f5df513 100644
--- a/static/archive/samkriss-substack-com-5indyq.txt
+++ b/static/archive/samkriss-substack-com-5indyq.txt
@@ -1,761 +1,701 @@
- #[1]Numb at the Lodge
+[1][https]
- [2][https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.ama
- zonaws.com%2Fpublic%2Fimages%2F75fb5a16-c295-4898-b7e3-9ab295cd3530_378
- x378.png]
+[2]Numb at the Lodge
-[3]Numb at the Lodge
-
- (BUTTON)
- Subscribe
- (BUTTON) Sign in
-
- (BUTTON)
- Share this post
+Subscribe
+Sign in
+Share this post
+[https]
The internet is already over
- samkriss.substack.com
- (BUTTON)
- Copy link
- (BUTTON)
- Facebook
- (BUTTON)
- Email
- (BUTTON)
- Note
- (BUTTON)
- Other
+samkriss.substack.com
+Copy link
+Facebook
+Email
+Note
+Other
The internet is already over
Our God is a devourer, who makes things only for the swallowing.
- [4]Sam Kriss
- Sep 18, 2022
- (BUTTON)
- Share this post
-
-The internet is already over
-
- samkriss.substack.com
- (BUTTON)
- Copy link
- (BUTTON)
- Facebook
- (BUTTON)
- Email
- (BUTTON)
- Note
- (BUTTON)
- Other
+[12][https]
+[13]Sam Kriss
+Sep 18, 2022
+[14]
+Share
A sort of preface
- There’s a phrase that’s been living inside my head lately, a brain
- parasite, some burrowing larva covered in thorns and barbs of words.
- When it moves around in there it churns at the soft tissues like
- someone’s stuck a very small hand blender in my skull. It repeats
- itself inside the wormy cave system that used to be my thoughts. It
- says you will not survive. You will not survive. You will not survive.
+[15]
+[https]
- Earlier this year, an article in the Cut reported that the cool thing
- now is to have messy hair and smoke cigarettes again. You might
- remember it; the piece was widely mocked for a day or two, and then it
- vanished without a trace, which is how these things tend to go. But the
- headline was incredible, and it stuck with me. [5]A Vibe Shift Is
- Coming. Will Any Of Us Survive It? Everyone else seemed to focus on the
- ‘vibe shift’ stuff, but the second part was much more interesting. To
- talk about survival—what extraordinary stakes, for a piece that was, in
- essence, about how young people are wearing different types of shoes
- from the shoes that you, as a slightly older person who still wants to
- think of themselves as young, wear. Everything is stripped back to the
- rawest truth: that you are a fragile creature perishing in time. And
- all you need to do is apply Betteridge’s Law for the real content to
- shine through. No. None of you will survive.
+There’s a phrase that’s been living inside my head lately, a brain parasite,
+some burrowing larva covered in thorns and barbs of words. When it moves around
+in there it churns at the soft tissues like someone’s stuck a very small hand
+blender in my skull. It repeats itself inside the wormy cave system that used
+to be my thoughts. It says you will not survive. You will not survive. You will
+not survive.
- There was an ancient thought: that Zeus feeds on the world. ‘The
- universe is cyclically consumed by the fire that engendered it.’ Our
- God is a devourer, who makes things only for the swallowing. As it
- happens, this was the first thought, the first ever written down in a
- book of philosophy, the first to survive: that nothing survives, and
- the blankness that birthed you will be the same hole you crawl into
- again. Anaximander: ‘Whence things have their origin, thence also their
- destruction lies…’ In the Polynesian version, Maui tried to achieve
- immortality by taking the form of a worm and slithering into the vagina
- of Hine-nui-te-po, goddess of night and death.[6]1 He failed.
- Hine-nui-te-po’s pussy is full of obsidian teeth; when she stirred in
- the night those teeth sliced clean through his body. He dribbled out
- again, a loose mulch of the hero who conquered the Sun.
+Earlier this year, an article in the Cut reported that the cool thing now is to
+have messy hair and smoke cigarettes again. You might remember it; the piece
+was widely mocked for a day or two, and then it vanished without a trace, which
+is how these things tend to go. But the headline was incredible, and it stuck
+with me. [16]A Vibe Shift Is Coming. Will Any Of Us Survive It? Everyone else
+seemed to focus on the ‘vibe shift’ stuff, but the second part was much more
+interesting. To talk about survival—what extraordinary stakes, for a piece that
+was, in essence, about how young people are wearing different types of shoes
+from the shoes that you, as a slightly older person who still wants to think of
+themselves as young, wear. Everything is stripped back to the rawest truth:
+that you are a fragile creature perishing in time. And all you need to do is
+apply Betteridge’s Law for the real content to shine through. No. None of you
+will survive.
- You will not survive is not only a frightening idea. The things I hope
- for are doomed, and everything I try to create will be a failure, but
- so will everything I despise.[7]2 These days, it repeats itself
- whenever I see something that’s trying its hardest to make me angry and
- upset. There’s a whole class of these objects: they’re never
- particularly interesting or important; they just exist to jab you into
- thinking that the world is going in a particular direction, away from
- wherever you are. One-Third Of Newborn Infants Now Describe Themselves
- As Polyamorous—Here’s Why That’s A Good Thing. Should I get upset about
- this? Should I be concerned? Why bother? It will not survive.[8]3 Meet
- The Edgy Influencers Making Holocaust Denial Hip Again. Are we in
- trouble? Maybe, but even trouble is ending. Everyone That Matters Has
- Started Wearing Jeans Over Their Heads With Their Arms Down The Leg
- Holes And Their Faces All Cramped Up In The Sweaty Groin Region, And
- They Walk Down The Street Like This, Bumping Into Things, And When They
- Sit Down To Eat They Just Pour Their Subscription-Service
- Meal-Replacement Slurry Over The Crotch Of Their Jeans And Lick At The
- Dribblings From The Inside, And They’re Covered In Flies And Smell Bad
- And Also They’re Naked From The Waist Down Because Their Trousers Are
- On Their Heads, That’s Part Of It Too—We Show You How To Get The Look!
- How proud they are of their new thing. ‘The strong iron-hearted
- man-slaying Achilles, who would not live long.’
+There was an ancient thought: that Zeus feeds on the world. ‘The universe is
+cyclically consumed by the fire that engendered it.’ Our God is a devourer, who
+makes things only for the swallowing. As it happens, this was the first
+thought, the first ever written down in a book of philosophy, the first to
+survive: that nothing survives, and the blankness that birthed you will be the
+same hole you crawl into again. Anaximander: ‘Whence things have their origin,
+thence also their destruction lies…’ In the Polynesian version, Maui tried to
+achieve immortality by taking the form of a worm and slithering into the vagina
+of Hine-nui-te-po, goddess of night and death.[17]1 He failed. Hine-nui-te-po’s
+pussy is full of obsidian teeth; when she stirred in the night those teeth
+sliced clean through his body. He dribbled out again, a loose mulch of the hero
+who conquered the Sun.
- In fact, one of the things that will not survive is novelty itself:
- trends, fads, fashions, scenes, vibes. We are thrown back into cyclical
- time; what’s growing old is the cruel demand to make things new. It’s
- already trite to notice that all our films are franchises now, all our
- bestselling novelists have the same mass-produced non-style, and all
- our pop music sounds like a tribute act.[9]4 But consider that the
- cultural shift that had all those thirtysomething Cut writers so
- worried about their survival is simply the return of a vague Y2K
- sensibility, which was itself just an echo of the early 1980s. Angular
- guitar music again, flash photography, plaid. We’re on a twenty-year
- loop: the time it takes for a new generation to be born, kick around
- for a while, and then settle into the rhythm of the spheres.
+You will not survive is not only a frightening idea. The things I hope for are
+doomed, and everything I try to create will be a failure, but so will
+everything I despise.[18]2 These days, it repeats itself whenever I see
+something that’s trying its hardest to make me angry and upset. There’s a whole
+class of these objects: they’re never particularly interesting or important;
+they just exist to jab you into thinking that the world is going in a
+particular direction, away from wherever you are. One-Third Of Newborn Infants
+Now Describe Themselves As Polyamorous—Here’s Why That’s A Good Thing. Should I
+get upset about this? Should I be concerned? Why bother? It will not survive.
+[19]3 Meet The Edgy Influencers Making Holocaust Denial Hip Again. Are we in
+trouble? Maybe, but even trouble is ending. Everyone That Matters Has Started
+Wearing Jeans Over Their Heads With Their Arms Down The Leg Holes And Their
+Faces All Cramped Up In The Sweaty Groin Region, And They Walk Down The Street
+Like This, Bumping Into Things, And When They Sit Down To Eat They Just Pour
+Their Subscription-Service Meal-Replacement Slurry Over The Crotch Of Their
+Jeans And Lick At The Dribblings From The Inside, And They’re Covered In Flies
+And Smell Bad And Also They’re Naked From The Waist Down Because Their Trousers
+Are On Their Heads, That’s Part Of It Too—We Show You How To Get The Look! How
+proud they are of their new thing. ‘The strong iron-hearted man-slaying
+Achilles, who would not live long.’
- Every time this happens, it coincides with a synodic conjunction of
- Jupiter and Saturn. Jupiter, the triumphant present; Saturn,
- senescence, decline. The son who castrates his father, the father who
- devours his sons: once every twenty years, they are indistinguishable
- in the sky. Astrologers call this the Great Chronocrator. The last one
- was at the end of 2020, and it’ll occur twice more in my lifetime: when
- these witless trendwatchers finally shuffle off, they’ll be tended on
- their deathbeds by a nurse with messy black eyeshadow and low-rise
- scrubs. Jupiter and Saturn will burn above you as a single point, and
- with your last rattling breaths you’ll still be asking if she thinks
- you’re cool. You don’t get it. ‘For oute of olde feldes, as men seith,
- cometh al this newe corn fro yeer to yere.’ We are entering a blissful
- new Middle Ages, where you simply soak in a static world until the
- waters finally close in over your head.
+In fact, one of the things that will not survive is novelty itself: trends,
+fads, fashions, scenes, vibes. We are thrown back into cyclical time; what’s
+growing old is the cruel demand to make things new. It’s already trite to
+notice that all our films are franchises now, all our bestselling novelists
+have the same mass-produced non-style, and all our pop music sounds like a
+tribute act.[20]4 But consider that the cultural shift that had all those
+thirtysomething Cut writers so worried about their survival is simply the
+return of a vague Y2K sensibility, which was itself just an echo of the early
+1980s. Angular guitar music again, flash photography, plaid. We’re on a
+twenty-year loop: the time it takes for a new generation to be born, kick
+around for a while, and then settle into the rhythm of the spheres.
- The things that will survive are the things that are already in some
- sense endless. The sea; the night; the word. Things with deep fathoms
- of darkness in them.
+Every time this happens, it coincides with a synodic conjunction of Jupiter and
+Saturn. Jupiter, the triumphant present; Saturn, senescence, decline. The son
+who castrates his father, the father who devours his sons: once every twenty
+years, they are indistinguishable in the sky. Astrologers call this the Great
+Chronocrator. The last one was at the end of 2020, and it’ll occur twice more
+in my lifetime: when these witless trendwatchers finally shuffle off, they’ll
+be tended on their deathbeds by a nurse with messy black eyeshadow and low-rise
+scrubs. Jupiter and Saturn will burn above you as a single point, and with your
+last rattling breaths you’ll still be asking if she thinks you’re cool. You
+don’t get it. ‘For oute of olde feldes, as men seith, cometh al this newe corn
+fro yeer to yere.’ We are entering a blissful new Middle Ages, where you simply
+soak in a static world until the waters finally close in over your head.
- The internet will not survive.
+The things that will survive are the things that are already in some sense
+endless. The sea; the night; the word. Things with deep fathoms of darkness in
+them.
+
+The internet will not survive.
The argument
+[21]
+[https]
+
1. That it’s easier to imagine the end of the world than the end of the
internet
- In 1977, Ken Olsen declared that ‘there is no reason for any individual
- to have a computer in his home.’ In 1995, Robert Metcalfe predicted in
- InfoWorld that the internet would go ‘spectacularly supernova’ and then
- collapse within a year. In 2000, the Daily Mail reported that the
- ‘Internet may be just a passing fad,’ adding that ‘predictions that the
- Internet would revolutionise the way society works have proved wildly
- inaccurate.’ Any day now, the millions of internet users would simply
- stop, either bored or frustrated, and rejoin the real world.
+In 1977, Ken Olsen declared that ‘there is no reason for any individual to have
+a computer in his home.’ In 1995, Robert Metcalfe predicted in InfoWorld that
+the internet would go ‘spectacularly supernova’ and then collapse within a
+year. In 2000, the Daily Mail reported that the ‘Internet may be just a passing
+fad,’ adding that ‘predictions that the Internet would revolutionise the way
+society works have proved wildly inaccurate.’ Any day now, the millions of
+internet users would simply stop, either bored or frustrated, and rejoin the
+real world.
- Funny, isn’t it? You can laugh at these people now, from your high
- perch one quarter of the way into the twenty-first century. Look at
- these morons, stuck in their grubby little past, who couldn’t even
- correctly identify the shape of the year 2022. You can see it
- perfectly, because you’re smart. You know that the internet has changed
- everything, forever.
+Funny, isn’t it? You can laugh at these people now, from your high perch one
+quarter of the way into the twenty-first century. Look at these morons, stuck
+in their grubby little past, who couldn’t even correctly identify the shape of
+the year 2022. You can see it perfectly, because you’re smart. You know that
+the internet has changed everything, forever.
- If you like the internet, you’ll point out that it’s given us all of
- human knowledge and art and music, instantly accessible from anywhere
- in the world; that you can arrive in a foreign city and immediately
- guide yourself to a restaurant and translate the menu and also find out
- about the interesting historical massacres that took place nearby, all
- with a few lazy swipes of your finger. So many interesting little
- blogs! So many bizarre subcultures! It’s opened up our experience of
- the world: now, nothing is out of reach.
+If you like the internet, you’ll point out that it’s given us all of human
+knowledge and art and music, instantly accessible from anywhere in the world;
+that you can arrive in a foreign city and immediately guide yourself to a
+restaurant and translate the menu and also find out about the interesting
+historical massacres that took place nearby, all with a few lazy swipes of your
+finger. So many interesting little blogs! So many bizarre subcultures! It’s
+opened up our experience of the world: now, nothing is out of reach.
- To be honest, it’s difficult to reconstruct what the unbridled
- techno-optimists think; there’s so few of them left. Still, those who
- don’t like the internet usually agree with them on all the basics—they
- just argue that we’re now in touch with the wrong sort of thing: bad
- kids’ cartoons, bad political opinions, bad ways of relating to your
- own body and others. Which is why it’s so important to get all this
- unpleasant stuff off the system, and turn the algorithm towards what is
- good and true.
+To be honest, it’s difficult to reconstruct what the unbridled techno-optimists
+think; there’s so few of them left. Still, those who don’t like the internet
+usually agree with them on all the basics—they just argue that we’re now in
+touch with the wrong sort of thing: bad kids’ cartoons, bad political opinions,
+bad ways of relating to your own body and others. Which is why it’s so
+important to get all this unpleasant stuff off the system, and turn the
+algorithm towards what is good and true.
- They might be right, but you could go deeper. The internet has enabled
- us to live, for the first time, entirely apart from other people. It
- replaces everything good in life with a low-resolution [10]simulation.
- A handful of sugar instead of a meal: addictive but empty, just enough
- to keep you alive. It even seems to be killing off sex, replacing it
- with more cheap, synthetic [11]ersatz. Our most basic biological drives
- simply wither in its cold blue light. People will cheerfully admit that
- the internet has destroyed their attention spans, but what it’s really
- done away with is your ability to think. Usually, when I’m doing
- something boring but necessary—the washing up, or walking to the post
- office—I’ll constantly interrupt myself; there’s a little Joycean
- warbling from the back of my brain. ‘Boredom is the dream bird that
- broods the egg of experience.’ But when I’m listlessly killing time on
- the internet, there is nothing. The mind does not wander. I am not
- there. That rectangular hole spews out war crimes and cutesy comedies
- and affirmations and porn, all of it mixed together into one
- general-purpose informational goo, and I remain in its trance, the
- lifeless scroll, twitching against the screen until the sky goes dark
- and I’m one day closer to the end. You lose hours to—what? An endless
- slideshow of barely interesting images and actively unpleasant text.
- Oh, cool—more memes! You know it’s all very boring, brooding nothing,
- but the internet addicts you to your own boredom. I’ve tried heroin:
- this is worse. More numb, more blank, more nowhere. A portable suicide
- booth; a device for turning off your entire existence. Death is no
- longer waiting for you at the far end of life. It eats away at your
- short span from the inside out.
+They might be right, but you could go deeper. The internet has enabled us to
+live, for the first time, entirely apart from other people. It replaces
+everything good in life with a low-resolution [22]simulation. A handful of
+sugar instead of a meal: addictive but empty, just enough to keep you alive. It
+even seems to be killing off sex, replacing it with more cheap, synthetic [23]
+ersatz. Our most basic biological drives simply wither in its cold blue light.
+People will cheerfully admit that the internet has destroyed their attention
+spans, but what it’s really done away with is your ability to think. Usually,
+when I’m doing something boring but necessary—the washing up, or walking to the
+post office—I’ll constantly interrupt myself; there’s a little Joycean warbling
+from the back of my brain. ‘Boredom is the dream bird that broods the egg of
+experience.’ But when I’m listlessly killing time on the internet, there is
+nothing. The mind does not wander. I am not there. That rectangular hole spews
+out war crimes and cutesy comedies and affirmations and porn, all of it mixed
+together into one general-purpose informational goo, and I remain in its
+trance, the lifeless scroll, twitching against the screen until the sky goes
+dark and I’m one day closer to the end. You lose hours to—what? An endless
+slideshow of barely interesting images and actively unpleasant text. Oh,
+cool—more memes! You know it’s all very boring, brooding nothing, but the
+internet addicts you to your own boredom. I’ve tried heroin: this is worse.
+More numb, more blank, more nowhere. A portable suicide booth; a device for
+turning off your entire existence. Death is no longer waiting for you at the
+far end of life. It eats away at your short span from the inside out.
- But lately I’m starting to think that the last thing the internet
- destroys might be itself. I think they might be vindicated, Ken Olson
- and Robert Metcalfe and even, God forgive me, the Daily Mail.
+But lately I’m starting to think that the last thing the internet destroys
+might be itself. I think they might be vindicated, Ken Olson and Robert
+Metcalfe and even, God forgive me, the Daily Mail.
- In the future—not the distant future, but ten years, five—people will
- remember the internet as a brief dumb enthusiasm, like phrenology or
- the dirigible. They might still use computer networks to send an email
- or manage their bank accounts, but those networks will not be where
- culture or politics happens. The idea of spending all day online will
- seem as ridiculous as sitting down in front of a nice fire to read the
- phone book. Soon, people will find it incredible that for several
- decades all our art was obsessed with digital computers: all those
- novels and films and exhibitions about tin cans that make beeping
- noises, handy if you need to multiply two big numbers together, but so
- lifeless, so sexless, so grey synthetic glassy bugeyed spreadsheet
- plastic drab. And all your smug chortling over the people who failed to
- predict our internetty present—if anyone remembers it, it’ll be with
- exactly the same laugh.[12]5
+In the future—not the distant future, but ten years, five—people will remember
+the internet as a brief dumb enthusiasm, like phrenology or the dirigible. They
+might still use computer networks to send an email or manage their bank
+accounts, but those networks will not be where culture or politics happens. The
+idea of spending all day online will seem as ridiculous as sitting down in
+front of a nice fire to read the phone book. Soon, people will find it
+incredible that for several decades all our art was obsessed with digital
+computers: all those novels and films and exhibitions about tin cans that make
+beeping noises, handy if you need to multiply two big numbers together, but so
+lifeless, so sexless, so grey synthetic glassy bugeyed spreadsheet plastic
+drab. And all your smug chortling over the people who failed to predict our
+internetty present—if anyone remembers it, it’ll be with exactly the same
+laugh.[24]5
2. That exhausted is a whole lot more than tired
- You know, secretly, even if you’re pretending not to, that this thing
- is nearing exhaustion. There is simply nothing there online. All
- language has become rote, a halfarsed performance: even the outraged
- mobs are screaming on autopilot. Even genuine crises can’t interrupt
- the tedium of it all, the bad jokes and predictable thinkpieces,
- spat-out enzymes to digest the world. ‘Leopards break into the temple
- and drink all the sacrificial vessels dry; it keeps happening; in the
- end, it can be calculated in advance and is incorporated into the
- ritual.’ Online is not where people meaningfully express themselves;
- that still happens in the remaining scraps of the nonnetworked world.
- It’s a parcel of time you give over to the machine. Make the motions,
- chant its dusty liturgy. The newest apps even [13]literalise this:
- everyone has to post a selfie at exactly the same time, an inaudible
- call to prayer ringing out across the world. Recently, at a bar, I saw
- the room go bright as half the patrons suddenly started posing with
- their negronis. This is called being real.
+You know, secretly, even if you’re pretending not to, that this thing is
+nearing exhaustion. There is simply nothing there online. All language has
+become rote, a halfarsed performance: even the outraged mobs are screaming on
+autopilot. Even genuine crises can’t interrupt the tedium of it all, the bad
+jokes and predictable thinkpieces, spat-out enzymes to digest the world.
+‘Leopards break into the temple and drink all the sacrificial vessels dry; it
+keeps happening; in the end, it can be calculated in advance and is
+incorporated into the ritual.’ Online is not where people meaningfully express
+themselves; that still happens in the remaining scraps of the nonnetworked
+world. It’s a parcel of time you give over to the machine. Make the motions,
+chant its dusty liturgy. The newest apps even [25]literalise this: everyone has
+to post a selfie at exactly the same time, an inaudible call to prayer ringing
+out across the world. Recently, at a bar, I saw the room go bright as half the
+patrons suddenly started posing with their negronis. This is called being real.
- Whoever you are, a role is already waiting for you. All those pouty
- nineteen-year-old lowercase nymphets, so fluent in their borrowed
- boredom, flatly reciting don’t just choke me i want someone to cut off
- my entire head. All those wide-eyed video creeps, their inhuman
- enthusiasm, hi guys! hi guys!! so today we’re going to talk about—don’t
- forget to like and subscribe!! hi guys!!! Even on the deranged fringes,
- a dead grammar has set in. The people who fake Tourette’s for TikTok
- and the people who fake schizophrenia for no reason at all. VOICES HAVE
- REVEALED TO ME THAT YOUR MAILMAN IS A DEMONIC ARCHON SPAT FROM
- BABYLON’S SPINNING PIGMOUTH, GOD WANTS YOU TO KILL HIM WITH A ROCKET
- LAUNCHER. Without even passing out of date, every mode of
- internet-speak already sounds antiquated. Aren’t you embarrassed? Can’t
- you hear, under the chatter of these empty forms, a long low ancient
- whine, the last mewl of that cat who wants to haz cheezburger?
+Whoever you are, a role is already waiting for you. All those pouty
+nineteen-year-old lowercase nymphets, so fluent in their borrowed boredom,
+flatly reciting don’t just choke me i want someone to cut off my entire head.
+All those wide-eyed video creeps, their inhuman enthusiasm, hi guys! hi guys!!
+so today we’re going to talk about—don’t forget to like and subscribe!! hi
+guys!!! Even on the deranged fringes, a dead grammar has set in. The people who
+fake Tourette’s for TikTok and the people who fake schizophrenia for no reason
+at all. VOICES HAVE REVEALED TO ME THAT YOUR MAILMAN IS A DEMONIC ARCHON SPAT
+FROM BABYLON’S SPINNING PIGMOUTH, GOD WANTS YOU TO KILL HIM WITH A ROCKET
+LAUNCHER. Without even passing out of date, every mode of internet-speak
+already sounds antiquated. Aren’t you embarrassed? Can’t you hear, under the
+chatter of these empty forms, a long low ancient whine, the last mewl of that
+cat who wants to haz cheezburger?
- When I say the internet is running dry, I am not just basing this off
- vibes. The exhaustion is measurable and real. 2020 saw a grand, mostly
- unnoticed shift in online behaviour: the [14]clickhogs all went
- catatonic, thick tongues lolling in the muck. On Facebook, the average
- engagement rate—the number of likes, comments, and shares per
- follower—fell by 34%, from 0.086 to 0.057. Well, everyone knows that
- the mushrooms are spreading over Facebook, hundreds of thousands of
- users [15]liquefying out of its corpse every year. But the same pattern
- is everywhere. Engagement fell 28% on Instagram and 15% on Twitter.
- (It’s [16]kept falling since.) Even on TikTok, the terrifying brainhole
- of tomorrow, the walls are closing in. Until 2020, the average daily
- time spent on the app kept rising in line with its growing user base;
- since then the number of users has kept growing, but the thing is
- capturing [17]less and less of their lives.
+When I say the internet is running dry, I am not just basing this off vibes.
+The exhaustion is measurable and real. 2020 saw a grand, mostly unnoticed shift
+in online behaviour: the [26]clickhogs all went catatonic, thick tongues
+lolling in the muck. On Facebook, the average engagement rate—the number of
+likes, comments, and shares per follower—fell by 34%, from 0.086 to 0.057.
+Well, everyone knows that the mushrooms are spreading over Facebook, hundreds
+of thousands of users [27]liquefying out of its corpse every year. But the same
+pattern is everywhere. Engagement fell 28% on Instagram and 15% on Twitter.
+(It’s [28]kept falling since.) Even on TikTok, the terrifying brainhole of
+tomorrow, the walls are closing in. Until 2020, the average daily time spent on
+the app kept rising in line with its growing user base; since then the number
+of users has kept growing, but the thing is capturing [29]less and less of
+their lives.
- And this was, remember, a year in which millions of people had nothing
- to do except engage with great content online—and in which, for a few
- months, liking and sharing the right content became an urgent moral
- duty. Back then, I thought the pandemic and the protests had
- permanently hauled our collective human semi-consciousness over to the
- machine. Like most of us, I couldn’t see what was really happening, but
- there were some people who could. Around the same time, strange new
- conspiracy theories started doing the rounds: that [18]the internet is
- empty, that all the human beings you used to talk to have been replaced
- by bots and drones. ‘The internet of today is entirely sterile… the
- internet may seem gigantic, but it’s like a hot air balloon with
- nothing inside.’ They weren’t wrong.
+And this was, remember, a year in which millions of people had nothing to do
+except engage with great content online—and in which, for a few months, liking
+and sharing the right content became an urgent moral duty. Back then, I thought
+the pandemic and the protests had permanently hauled our collective human
+semi-consciousness over to the machine. Like most of us, I couldn’t see what
+was really happening, but there were some people who could. Around the same
+time, strange new conspiracy theories started doing the rounds: that [30]the
+internet is empty, that all the human beings you used to talk to have been
+replaced by bots and drones. ‘The internet of today is entirely sterile… the
+internet may seem gigantic, but it’s like a hot air balloon with nothing
+inside.’ They weren’t wrong.
- What’s happening?[19]6 Here’s a story from the very early days of the
- internet. In the 90s, someone I know started a collaborative online
- zine, a mishmash text file of barely lucid thoughts and theories. It
- was deeply weird and, in some strange corners, very popular. Years
- passed and technology improved: soon, they could break the text file
- into different posts, and see exactly how many people were reading each
- one. They started optimising their output: the most popular posts
- became the model for everything else; they found a style and voice that
- worked. The result, of course, was that the entire thing became rote
- and lifeless and rapidly collapsed. Much of the media is currently
- going down the same path, refining itself out of existence. Aside from
- the New Yorker’s fussy umlauts, there’s simply nothing to distinguish
- any one publication from any other. (And platforms like this one are
- not an alternative to the crisis-stricken media, just a further
- acceleration in the process.) The same thing is happening everywhere,
- to everyone. The more you relentlessly optimise your network-facing
- self, the more you chase the last globs of loose attention, the more
- frazzled we all become, and the less anyone will be able to sustain any
- interest at all.[20]7
+What’s happening?[31]6 Here’s a story from the very early days of the internet.
+In the 90s, someone I know started a collaborative online zine, a mishmash text
+file of barely lucid thoughts and theories. It was deeply weird and, in some
+strange corners, very popular. Years passed and technology improved: soon, they
+could break the text file into different posts, and see exactly how many people
+were reading each one. They started optimising their output: the most popular
+posts became the model for everything else; they found a style and voice that
+worked. The result, of course, was that the entire thing became rote and
+lifeless and rapidly collapsed. Much of the media is currently going down the
+same path, refining itself out of existence. Aside from the New Yorker’s fussy
+umlauts, there’s simply nothing to distinguish any one publication from any
+other. (And platforms like this one are not an alternative to the
+crisis-stricken media, just a further acceleration in the process.) The same
+thing is happening everywhere, to everyone. The more you relentlessly optimise
+your network-facing self, the more you chase the last globs of loose attention,
+the more frazzled we all become, and the less anyone will be able to sustain
+any interest at all.[32]7
- Everything that depends on the internet for its propagation will die.
- What survives will survive in conditions of low transparency, in the
- sensuous murk proper to human life.
+Everything that depends on the internet for its propagation will die. What
+survives will survive in conditions of low transparency, in the sensuous murk
+proper to human life.
3. That you have been plugged into a grave
- For a while, it was possible to live your entire life online. The world
- teemed with new services: simply dab at an app, and the machine would
- summon some other slumping creature with a skin condition to deliver
- your groceries, or drive you in pointless circles around town, or meet
- you for overpriced drinks and awkward sex and vanish. Like everyone, I
- thought this was the inevitable shape of the future. ‘You’ll own
- nothing, and you’ll be happy.’ We’d all be reduced to a life spent
- swapping small services for the last linty coins in our pockets. It’s
- Uber for dogs! It’s Uber for dogshit! It’s picking up a fresh, creamy
- pile of dogshit with your bare hands—on your phone! But this was not a
- necessary result of new technologies. The internet was not
- subordinating every aspect of our lives by itself, under its own power.
- The online economy is an energy sink; it’s only survived this far as a
- parasite, in the bowels of something else.
+For a while, it was possible to live your entire life online. The world teemed
+with new services: simply dab at an app, and the machine would summon some
+other slumping creature with a skin condition to deliver your groceries, or
+drive you in pointless circles around town, or meet you for overpriced drinks
+and awkward sex and vanish. Like everyone, I thought this was the inevitable
+shape of the future. ‘You’ll own nothing, and you’ll be happy.’ We’d all be
+reduced to a life spent swapping small services for the last linty coins in our
+pockets. It’s Uber for dogs! It’s Uber for dogshit! It’s picking up a fresh,
+creamy pile of dogshit with your bare hands—on your phone! But this was not a
+necessary result of new technologies. The internet was not subordinating every
+aspect of our lives by itself, under its own power. The online economy is an
+energy sink; it’s only survived this far as a parasite, in the bowels of
+something else.
- That something else is a vast underground cavern of the dead, billions
- of years old.
+That something else is a vast underground cavern of the dead, billions of years
+old.
- The Vision Fund is an investment vehicle headquartered in London and
- founded by Japan’s SoftBank to manage some $150 billion, mostly from
- the sovereign wealth funds of Saudi Arabia and the UAE, which it’s
- poured into Uber and DoorDash and WeWork and Klarna and Slack. It
- provides the money that [21]effectively subsidises your autistic
- digital life. These firms could take over the market because they were
- so much cheaper than the traditional competitors—but most of them were
- never profitable; they survived on Saudi largesse.
+The Vision Fund is an investment vehicle headquartered in London and founded by
+Japan’s SoftBank to manage some $150 billion, mostly from the sovereign wealth
+funds of Saudi Arabia and the UAE, which it’s poured into Uber and DoorDash and
+WeWork and Klarna and Slack. It provides the money that [33]effectively
+subsidises your autistic digital life. These firms could take over the market
+because they were so much cheaper than the traditional competitors—but most of
+them were never profitable; they survived on Saudi largesse.
- Investors were willing to sit on these losses; it’s not as if there
- were many alternatives. Capital is no longer capable of effectively
- reproducing itself in the usual way, through the production of
- commodities. Twenty-five years ago manufacturing represented a
- [22]fifth of global GDP; in 2020 it was down to 16%. Interest rates
- have hovered near zero for well over a decade as economies struggle to
- grow. Until this year, governments were still issuing negative-yield
- bonds, and [23]people were buying them—a predictable loss looked like
- the least bad option. The only reliable source of profits is in the
- extraction of raw materials: chiefly, pulling the black corpses of
- trillions of prehistoric organisms out of the ground so they can be set
- on fire. Which means that the feudal rulers of those corpselands—men
- like King Salman, Custodian of the Two Holy Mosques—ended up sitting on
- a vast reservoir of capital without many productive industries through
- which it could be valorised. So, as a temporary solution, they stuck it
- in the tech sector.
+Investors were willing to sit on these losses; it’s not as if there were many
+alternatives. Capital is no longer capable of effectively reproducing itself in
+the usual way, through the production of commodities. Twenty-five years ago
+manufacturing represented a [34]fifth of global GDP; in 2020 it was down to
+16%. Interest rates have hovered near zero for well over a decade as economies
+struggle to grow. Until this year, governments were still issuing
+negative-yield bonds, and [35]people were buying them—a predictable loss looked
+like the least bad option. The only reliable source of profits is in the
+extraction of raw materials: chiefly, pulling the black corpses of trillions of
+prehistoric organisms out of the ground so they can be set on fire. Which means
+that the feudal rulers of those corpselands—men like King Salman, Custodian of
+the Two Holy Mosques—ended up sitting on a vast reservoir of capital without
+many productive industries through which it could be valorised. So, as a
+temporary solution, they stuck it in the tech sector.
- It didn’t matter that these firms couldn’t turn a profit. The real
- function was not to make money in the short term; it was to suck up
- vast quantities of user data. Where you go, what you buy; a perfect
- snapshot of millions of ordinary lives. They were betting that this
- would be the currency of the future, as fundamental as oil: the stuff
- that rules the world.[24]8
+It didn’t matter that these firms couldn’t turn a profit. The real function was
+not to make money in the short term; it was to suck up vast quantities of user
+data. Where you go, what you buy; a perfect snapshot of millions of ordinary
+lives. They were betting that this would be the currency of the future, as
+fundamental as oil: the stuff that rules the world.[36]8
- They were wrong, but in the process of being wrong, they created a
- monster. Your frictionless digital future, your very important culture
- wars, your entire sense of self—it’s just a waste byproduct of the
- perfectly ordinary, centuries-old global circulation of fuel, capital,
- and Islam. It turns out that if these three elements are arranged in
- one particular way, people will start behaving strangely. They’ll
- pretend that by spending all day on the computer they’re actually
- fighting fascism, or standing up for women’s sex-based rights, as if
- the entire terrain of combat wasn’t provided by a nightmare
- head-chopping theocratic state.[25]9 They’ll pretend that it’s normal
- to dance alone in silence for a front-facing camera, or that the
- intersection of art and technology is somehow an interesting place to
- be. For a brief minute, you’ll get the sociocultural Boltzmann entity
- we call the internet. ‘But nevertheless, it was only a minute. After
- nature had drawn a few breaths, the star cooled and congealed, and the
- clever beasts had to die.’
+They were wrong, but in the process of being wrong, they created a monster.
+Your frictionless digital future, your very important culture wars, your entire
+sense of self—it’s just a waste byproduct of the perfectly ordinary,
+centuries-old global circulation of fuel, capital, and Islam. It turns out that
+if these three elements are arranged in one particular way, people will start
+behaving strangely. They’ll pretend that by spending all day on the computer
+they’re actually fighting fascism, or standing up for women’s sex-based rights,
+as if the entire terrain of combat wasn’t provided by a nightmare head-chopping
+theocratic state.[37]9 They’ll pretend that it’s normal to dance alone in
+silence for a front-facing camera, or that the intersection of art and
+technology is somehow an interesting place to be. For a brief minute, you’ll
+get the sociocultural Boltzmann entity we call the internet. ‘But nevertheless,
+it was only a minute. After nature had drawn a few breaths, the star cooled and
+congealed, and the clever beasts had to die.’
- The tables are already being cleared at the great tech-sector
- chow-down.[26]10 Online services are reverting to market prices. The
- Vision Fund is the worst performing fund in SoftBank’s history; in the
- last quarter alone it’s [27]lost over $20 billion. Most of all, it’s
- now impossible to ignore that the promise propping up the entire
- networked economy—that user data could power a system of terrifyingly
- precise targeted advertising—was a lie. It simply does not work. ‘It
- sees that you bought a [28]ticket to Budapest, so you get more tickets
- to Budapest…All they really know about you is your shopping.’ Now,
- large companies are cutting out their online advertising budgets
- entirely, and seeing [29]no change whatsoever to their bottom line. One
- study found that algorithmically targeted advertising performed worse
- than ads [30]selected at random. This is what [31]sustains the entire
- media, provides 80% of Google’s income and 99% of Facebook’s, and it’s
- made of magic beans.
+The tables are already being cleared at the great tech-sector chow-down.[38]10
+Online services are reverting to market prices. The Vision Fund is the worst
+performing fund in SoftBank’s history; in the last quarter alone it’s [39]lost
+over $20 billion. Most of all, it’s now impossible to ignore that the promise
+propping up the entire networked economy—that user data could power a system of
+terrifyingly precise targeted advertising—was a lie. It simply does not work.
+‘It sees that you bought a [40]ticket to Budapest, so you get more tickets to
+Budapest…All they really know about you is your shopping.’ Now, large companies
+are cutting out their online advertising budgets entirely, and seeing [41]no
+change whatsoever to their bottom line. One study found that algorithmically
+targeted advertising performed worse than ads [42]selected at random. This is
+what [43]sustains the entire media, provides 80% of Google’s income and 99% of
+Facebook’s, and it’s made of magic beans.
- A dying animal still makes its last few spastic kicks: hence the recent
- flurry of strange and stillborn ideas. Remember the Internet of Things?
- Your own lightbulbs blinking out ads in seizure-inducing Morse code,
- your own coffee machine calling the police if you try to feed it some
- unlicensed beans. Remember the Metaverse? The grisly pink avatar of
- Mark Zuckerberg, bobbing around like the ghost of someone’s foreskin
- through the scene of the recent genocides. Wow! It’s so cool to
- immersively experience these bloodmires in VR! More recent attempts to
- squeeze some kind of profit out of this carcass are, somehow, worse.
- Here’s how web3 is about to disrupt the meat industry. Every time you
- buy a pound of tripe, your physical offal will be bundled with a
- dedicated TripeToken, which maintains its value and rarity even after
- the tripe has been eaten, thanks to a unique blockchain signature
- indexed to the intestinal microbiome of the slaughtered cattle! By
- eating large amounts of undercooked offal while trading TripeTokens on
- secondary markets, you can incentivise the spread of your favourite
- cattle diseases—and if one of the pathogens you own jumps the species
- barrier to start infecting humans, you’ve successfully monetised the
- next pandemic! Once you get sick, you can rent out portions of your own
- intestinal tract to an industrial meat DAO in exchange for
- SlaughterCoins. Because SlaughterCoins are linked via blockchain to the
- progressive disintegration of your body, they’re guaranteed to increase
- in value! And when your suffering becomes unbearable, local abattoirs
- will bid to buy up your SlaughterCoin wallet in exchange for putting
- you out of your misery with a bolt gun to the head! Yes, the future is
- always capable of getting worse. But this future is simply never going
- to happen. Not the next generation of anything, just a short-term
- grift: the ship’s rats stripping the galley of all its silverware on
- their way out.
+A dying animal still makes its last few spastic kicks: hence the recent flurry
+of strange and stillborn ideas. Remember the Internet of Things? Your own
+lightbulbs blinking out ads in seizure-inducing Morse code, your own coffee
+machine calling the police if you try to feed it some unlicensed beans.
+Remember the Metaverse? The grisly pink avatar of Mark Zuckerberg, bobbing
+around like the ghost of someone’s foreskin through the scene of the recent
+genocides. Wow! It’s so cool to immersively experience these bloodmires in VR!
+More recent attempts to squeeze some kind of profit out of this carcass are,
+somehow, worse. Here’s how web3 is about to disrupt the meat industry. Every
+time you buy a pound of tripe, your physical offal will be bundled with a
+dedicated TripeToken, which maintains its value and rarity even after the tripe
+has been eaten, thanks to a unique blockchain signature indexed to the
+intestinal microbiome of the slaughtered cattle! By eating large amounts of
+undercooked offal while trading TripeTokens on secondary markets, you can
+incentivise the spread of your favourite cattle diseases—and if one of the
+pathogens you own jumps the species barrier to start infecting humans, you’ve
+successfully monetised the next pandemic! Once you get sick, you can rent out
+portions of your own intestinal tract to an industrial meat DAO in exchange for
+SlaughterCoins. Because SlaughterCoins are linked via blockchain to the
+progressive disintegration of your body, they’re guaranteed to increase in
+value! And when your suffering becomes unbearable, local abattoirs will bid to
+buy up your SlaughterCoin wallet in exchange for putting you out of your misery
+with a bolt gun to the head! Yes, the future is always capable of getting
+worse. But this future is simply never going to happen. Not the next generation
+of anything, just a short-term grift: the ship’s rats stripping the galley of
+all its silverware on their way out.
4. That the revolution can not be digitised
- If you really want to see how impotent the internet is, though, you
- only have to look at politics.
+If you really want to see how impotent the internet is, though, you only have
+to look at politics.
- Everyone agrees that the internet has [32]swallowed our entire
- political discourse whole. When politicians debate, they trade crap
- one-liners to be turned into gifs. Their strategists seem to think
- elections are won or lost [33]on memes. Entire movements emerge out of
- flatulent little echo chambers; elected representatives giddy over the
- evils of seed oils or babbling about how it’s not their job to educate
- you. And it’s true that the internet has changed some things: mostly,
- it’s helped break apart the cohesive working-class communities that
- produce a strong left, and turned them into vague swarms of monads. But
- as a political instrument, all it can do is destroy anyone who tries to
- pick it up—because everything that reproduces itself through the
- internet is doomed.
+Everyone agrees that the internet has [44]swallowed our entire political
+discourse whole. When politicians debate, they trade crap one-liners to be
+turned into gifs. Their strategists seem to think elections are won or lost
+[45]on memes. Entire movements emerge out of flatulent little echo chambers;
+elected representatives giddy over the evils of seed oils or babbling about how
+it’s not their job to educate you. And it’s true that the internet has changed
+some things: mostly, it’s helped break apart the cohesive working-class
+communities that produce a strong left, and turned them into vague swarms of
+monads. But as a political instrument, all it can do is destroy anyone who
+tries to pick it up—because everything that reproduces itself through the
+internet is doomed.
- Occasionally, online social movements do make something happen. A hand
- emerges from out of the cloud to squish some minor individual. Let’s
- get her friends to denounce her! Let’s find out where she lives! You
- can have your sadistic fun and your righteous justice at the same time:
- doesn’t it feel good to be good? But these movements build no
- institutions, create no collective subjects, and produce no meaningful
- change. Their only power is punishment—and this game only works within
- the internet, and only when everyone involved agrees to play by the
- internet’s rules.[34]11 As soon as they run up against anything with a
- separate set of values—say, a Republican Party that wants to put its
- guy on the Supreme Court, #MeToo or no #MeToo—they instantly crumble.
- And if, like much of the contemporary left, you're left with nothing on
- which to build your political movement except a hodgepodge of online
- frenzies, you will crumble too.
+Occasionally, online social movements do make something happen. A hand emerges
+from out of the cloud to squish some minor individual. Let’s get her friends to
+denounce her! Let’s find out where she lives! You can have your sadistic fun
+and your righteous justice at the same time: doesn’t it feel good to be good?
+But these movements build no institutions, create no collective subjects, and
+produce no meaningful change. Their only power is punishment—and this game only
+works within the internet, and only when everyone involved agrees to play by
+the internet’s rules.[46]11 As soon as they run up against anything with a
+separate set of values—say, a Republican Party that wants to put its guy on the
+Supreme Court, #MeToo or no #MeToo—they instantly crumble. And if, like much of
+the contemporary left, you're left with nothing on which to build your
+political movement except a hodgepodge of online frenzies, you will crumble
+too.
- The post-George Floyd demonstrations might be our era’s greatest
- tragedy: tens of millions of people mobilised in (possibly) the largest
- protest movement in human history, all for an urgent and necessary
- cause—and achieving precisely nothing. [35]At the time, I worried that
- the mass street movement risked being consumed by the sterile politics
- of online; this is exactly what happened. Now, even that vague cultural
- halo is spent. Whatever wokeness was, as of 2022 it’s so utterly burned
- out as a cultural force that anyone still grousing about it 24/7 is a
- guaranteed hack. More recently, there’s been worry about the rise of
- the ‘[36]new right’—a oozingly digitised political current whose
- effective proposition is that people should welcome a total
- dictatorship to prevent corporations posting rainbow flags on the
- internet. You can guess what I think of its prospects.
+The post-George Floyd demonstrations might be our era’s greatest tragedy: tens
+of millions of people mobilised in (possibly) the largest protest movement in
+human history, all for an urgent and necessary cause—and achieving precisely
+nothing. [47]At the time, I worried that the mass street movement risked being
+consumed by the sterile politics of online; this is exactly what happened. Now,
+even that vague cultural halo is spent. Whatever wokeness was, as of 2022 it’s
+so utterly burned out as a cultural force that anyone still grousing about it
+24/7 is a guaranteed hack. More recently, there’s been worry about the rise of
+the ‘[48]new right’—a oozingly digitised political current whose effective
+proposition is that people should welcome a total dictatorship to prevent
+corporations posting rainbow flags on the internet. You can guess what I think
+of its prospects.
5. That this is the word
- Things will survive in proportion to how well they’ve managed to
- insulate themselves from the internet and its demands. The Financial
- Times will outlive the Guardian. Paintings will outlive NFTs. Print
- magazines will outlive Substack. You will, if you play your cards
- right, outlive me. If anything interesting ever happens again, it will
- not be online. You will not get it delivered to your inbox. It will not
- have a podcast. This machine has never produced anything of note, and
- it never will.
+Things will survive in proportion to how well they’ve managed to insulate
+themselves from the internet and its demands. The Financial Times will outlive
+the Guardian. Paintings will outlive NFTs. Print magazines will outlive
+Substack. You will, if you play your cards right, outlive me. If anything
+interesting ever happens again, it will not be online. You will not get it
+delivered to your inbox. It will not have a podcast. This machine has never
+produced anything of note, and it never will.
- A sword is against the internet, against those who live online, and
- against its officials and wise men. A sword is against its false
- prophets, and they will become fools. A sword is against its
- commentators, and they will be filled with exhaustion. A sword is
- against its trends and fashions and against all the posturers in its
- midst, and they will become out of touch. A sword is against its
- cryptocoins, and they will be worthless. A drought is upon its waters,
- and they will be dried up. For it is a place of graven images, and the
- people go mad over idols. So the desert creatures and hyenas will live
- there and ostriches will dwell there. The bots will chatter at its
- threshold, and dead links will litter the river bed. It will never
- again be inhabited or lived in from generation to generation.
+A sword is against the internet, against those who live online, and against its
+officials and wise men. A sword is against its false prophets, and they will
+become fools. A sword is against its commentators, and they will be filled with
+exhaustion. A sword is against its trends and fashions and against all the
+posturers in its midst, and they will become out of touch. A sword is against
+its cryptocoins, and they will be worthless. A drought is upon its waters, and
+they will be dried up. For it is a place of graven images, and the people go
+mad over idols. So the desert creatures and hyenas will live there and
+ostriches will dwell there. The bots will chatter at its threshold, and dead
+links will litter the river bed. It will never again be inhabited or lived in
+from generation to generation.
A conclusion, or, where I’m going with all this
- I am aware that I’m writing this on the internet.
+[49]
+[https]
- Whatever it is I’m doing here, you should not be part of it. Do not
- click the button below this paragraph, do not type in your email
- address to receive new posts straight to your inbox, and for the love
- of God, if you have any self-respect, do not even think about giving me
- any money. There is still time for you to do something else. You can
- still unchain yourself from this world that will soon, very soon, mean
- absolutely nothing.
- ____________________
- (BUTTON) Subscribe
+I am aware that I’m writing this on the internet.
- As far as I can tell, Substack mostly functions as a kind of
- meta-discourse for Twitter. (At least, this is the part I’ve seen—there
- are also, apparently, recipes.) Graham Linehan posts fifty times a day
- on this platform, and all of it is just replying to tweets. This does
- not strike me as particularly sustainable. I have no idea what kind of
- demented pervert is actually reading this stuff, when you could be
- lying in a meadow by a glassy stream, rien faire comme une bête, eyes
- melting into the sky. According to the very helpful Substack employees
- I’ve spoken to, there are a set of handy best practices for this
- particular region of the machine: have regular open threads, chitchat
- with your subscribers, post humanising updates about your life. Form a
- community. I’m told that the most successful writing on here is
- friendly, frequent, and fast. Apparently, readers should know exactly
- what you’re getting at within the first three sentences. I do not plan
- on doing any of these things.
+Whatever it is I’m doing here, you should not be part of it. Do not click the
+button below this paragraph, do not type in your email address to receive new
+posts straight to your inbox, and for the love of God, if you have any
+self-respect, do not even think about giving me any money. There is still time
+for you to do something else. You can still unchain yourself from this world
+that will soon, very soon, mean absolutely nothing.
- This is what I would like to do. I would like to see if, in the belly
- of the dying internet, it’s possible to create something that is not
- like the internet. I want to see if I can poke at the outlines of
- whatever is coming next. In a previous life, I was a sort of mildly
- infamous online opinion gremlin, best known for being extravagantly
- mean about other opinion writers whose writing or whose opinions I
- didn’t like. These days, I find most of that stuff very, very dull. I
- wonder if it’s possible to talk about things differently. Not
- rationally or calmly, away from the cheap point-scoring of online
- discourse—that would also be boring—but with a better, less sterile
- kind of derangement. I’m interested in the forms of writing that were
- here long before the internet, and which will be here long after it’s
- gone. Not thinkpieces or blogs, but the essay, the manifesto, the
- satyr, and the screed. Ludibria, pseudepigrapha, quodlibets. Or
- folktales. Prophecy. Dreams.
- [37]1
+[58][ ]
+Subscribe
+As far as I can tell, Substack mostly functions as a kind of meta-discourse for
+Twitter. (At least, this is the part I’ve seen—there are also, apparently,
+recipes.) Graham Linehan posts fifty times a day on this platform, and all of
+it is just replying to tweets. This does not strike me as particularly
+sustainable. I have no idea what kind of demented pervert is actually reading
+this stuff, when you could be lying in a meadow by a glassy stream, rien faire
+comme une bête, eyes melting into the sky. According to the very helpful
+Substack employees I’ve spoken to, there are a set of handy best practices for
+this particular region of the machine: have regular open threads, chitchat with
+your subscribers, post humanising updates about your life. Form a community.
+I’m told that the most successful writing on here is friendly, frequent, and
+fast. Apparently, readers should know exactly what you’re getting at within the
+first three sentences. I do not plan on doing any of these things.
- I am very disappointed that this scene never appears in Disney’s Moana.
- [38]2
+This is what I would like to do. I would like to see if, in the belly of the
+dying internet, it’s possible to create something that is not like the
+internet. I want to see if I can poke at the outlines of whatever is coming
+next. In a previous life, I was a sort of mildly infamous online opinion
+gremlin, best known for being extravagantly mean about other opinion writers
+whose writing or whose opinions I didn’t like. These days, I find most of that
+stuff very, very dull. I wonder if it’s possible to talk about things
+differently. Not rationally or calmly, away from the cheap point-scoring of
+online discourse—that would also be boring—but with a better, less sterile kind
+of derangement. I’m interested in the forms of writing that were here long
+before the internet, and which will be here long after it’s gone. Not
+thinkpieces or blogs, but the essay, the manifesto, the satyr, and the screed.
+Ludibria, pseudepigrapha, quodlibets. Or folktales. Prophecy. Dreams.
- It’s the same thought that, in Marx’s 1873 postface to Capital, Volume
- I, ‘includes in its positive understanding of what exists a
- simultaneous recognition of its negation, its inevitable destruction.’
- Or Hegel’s famous line on the flight habits of nocturnal birds. Or
- Baudrillard after the orgy, sticky and spent, announcing that the
- revolution has already happened and the Messiah has already been and
- gone.
- [39]3
+[60]1
- As a general rule: by the time you hear about any of this stuff, by the
- time it’s in general discursive circulation, whatever was motive and
- real in the phenomenon has already died. Every culture warrior spends
- their life raging at the light of a very distant, long-exploded star.
- [40]4
+I am very disappointed that this scene never appears in Disney’s Moana.
- Every few weeks, there are ads for some new band plastered over the
- Tube. The acid, whipsmart voice of twenty-first century youth! Then you
- listen, and they’re just ripping off the Fall again. ‘You think your
- haircut is distinguished, when it’s a blot on the English landscape.’
- [41]5
+[61]2
- Chances are, though, that it won’t be remembered at all. Gregory of
- Tours was a Roman aristocrat, the son of a Senator, raised on Virgil
- and Sallust, but in his dense ten-volume History he never bothers to
- even mention the collapse of the Western Roman Empire. The old imperial
- world had ended so decisively that its passing wasn’t even considered
- particularly important; the new world of barbarian kings (governing
- through a system of ecclesiastical administration inherited from the
- empire, and that still functioned, if haphazardly, with only the most
- nominal connections to central authority in Italy or the Bosporus) had
- become the only possible world order, even as the cities shrank and
- Mediterranean trade vanished. Syagrius, magister militum in the Roman
- rump state around Noviodunum, becomes the King of the Romans; his
- imperial holdout becomes the Kingdom of Soissons. It took several
- centuries for people to decide that anything particularly significant
- had happened when Odoacer overthrew the teenaged Romulus Augustulus in
- 476 AD. This is why the internet has not been a true revolution:
- everyone online is still obsessing over how much has changed, and
- fondly remembering the time before we all spent all our waking hours
- staring at phones.
- [42]6
+It’s the same thought that, in Marx’s 1873 postface to Capital, Volume I,
+‘includes in its positive understanding of what exists a simultaneous
+recognition of its negation, its inevitable destruction.’ Or Hegel’s famous
+line on the flight habits of nocturnal birds. Or Baudrillard after the orgy,
+sticky and spent, announcing that the revolution has already happened and the
+Messiah has already been and gone.
- Actually, I have two slightly overlapping theories on what might be
- happening. The main one is above; the second, which is weirder and
- makes less sense, has been shoved down here. Samuel Beckett describes a
- version of the internet and its exhaustion, one made of small pebbles.
- Here is Molloy on the beach, this limping old bird in his shabby
- overcoat, rolling in the sand. ‘Much of my life has ebbed away before
- this shivering expanse, to the sound of waves in storm and calm, and
- the claws of the surf.’ He has sixteen stones in his pocket, and every
- so often he puts one in his mouth to suck on it for a while. ‘A little
- pebble in your mouth, round and smooth, appeases, soothes, makes you
- forget your hunger, forget your thirst.’ The problem: how to make sure
- that when he next reaches into his pocket, he doesn’t take out the
- stone he’s just sucked? How to make sure he’s getting the full
- enjoyment out of each of his sixteen stones? Novelty is mysteriously
- important, even though ‘deep down it was all the same to me whether I
- sucked a different stone each time or always the same stone, until the
- end of time. For they all tasted exactly the same.’ For a while, his
- coat and his trousers and his mouth are turned into a series of
- machines for creating sequences of stones. Supply pockets and store
- pockets, modes of circulation: curated algorithms, organising the world
- and its information. Beckett spends half a dozen pages (in my edition)
- describing these systems, as each of them arrives in a flash of divine
- inspiration and fails in turn. Eventually, Molloy has exhausted every
- possible arrangement of atoms and voids. ‘The solution to which I
- rallied in the end was to throw away all the stones but one, which I
- kept now in one pocket, now in another, and which of course I soon
- lost, or threw away, or gave away, or swallowed. It was a wild part of
- the coast.’ In The Exhausted, his grand study of Beckett, Deleuze
- comments on the distinction between the exhausted and the merely tired.
- ‘The tired has only exhausted realisation, while the exhausted exhausts
- all of the possible.’ To exhaust the world as it is you only need to
- experience it: wander through reality, and get bored. But for true
- exhaustion, you need to know that everything that could be is as empty
- as everything that is. To reach exhaustion, you need some kind of
- device, made of ‘tables and programmes,’ a technics. Something like
- Molloy’s overcoat. ‘The combinatorial is the art or science of
- exhausting the possible, through inclusive disjunctions.’ The ars
- combinatoria is also the system of formal logic, revealed in holy
- visions to Ramon Llull in his cave on Puig de Ronda in 1274, eventually
- refined by Gottfried Leibniz, that powers the device you’re using to
- read this now. Exhaustion is the mode of life integral to a
- computerised society; the internet comes to us already long worn out,
- combining and recombining stale elements, shambling through the dead
- zones of itself.
- [43]7
+[62]3
- You could compare this process to Marx’s law of the tendency of the
- rate of profit to fall: as each individual actor, follows its
- incentives and inflates the organic composition, the entire system ends
- up stumbling into crisis.
- [44]8
+As a general rule: by the time you hear about any of this stuff, by the time
+it’s in general discursive circulation, whatever was motive and real in the
+phenomenon has already died. Every culture warrior spends their life raging at
+the light of a very distant, long-exploded star.
- People claim to be deeply worried by this stuff, but I think you
- secretly like it. You like the idea that your attention is what creates
- the world. You like the idea that the entire global economy is
- predicated on getting to know you, finding out what you like and
- dislike, your taste in music and your frankly insane political opinions
- and the gooey little treats you buy. Global capitalism as one vast
- Buzzfeed personality quiz. The faceless empire of yourself.
- [45]9
+[63]4
- One of the largest shareholders in Twitter is the Kingdom Holding
- Company, chaired by Prince al-Waleed bin Talal bin Abdulaziz al-Saud.
- For some reason, people seemed to think that replacing him with Elon
- Musk would shift the tenor of the site to the right.
- [46]10
+Every few weeks, there are ads for some new band plastered over the Tube. The
+acid, whipsmart voice of twenty-first century youth! Then you listen, and
+they’re just ripping off the Fall again. ‘You think your haircut is
+distinguished, when it’s a blot on the English landscape.’
- When I was younger, my brother and I had a running joke about a lemon
- that could connect to the internet. Not for any particular reason: a
- light would blink just below the lemon’s skin, and it would do nothing,
- just slowly rot in your fruitbowl. A few years ago, that lemon would
- have immediately secured half a billion dollars in first-round funding.
- Now, not so much.
- [47]11
+[64]5
- The ‘cancelled’ always participate in the theatre of their own
- cancellation. In Greco-Roman sacrifices, the animal was expected to nod
- before being led to the altar; the victim had to consent to its
- slaughter. And that nod always happened, even if a priest had to induce
- it by pouring a vase of water over the animal’s head.
- Share
- Next
- Top
- New
+Chances are, though, that it won’t be remembered at all. Gregory of Tours was a
+Roman aristocrat, the son of a Senator, raised on Virgil and Sallust, but in
+his dense ten-volume History he never bothers to even mention the collapse of
+the Western Roman Empire. The old imperial world had ended so decisively that
+its passing wasn’t even considered particularly important; the new world of
+barbarian kings (governing through a system of ecclesiastical administration
+inherited from the empire, and that still functioned, if haphazardly, with only
+the most nominal connections to central authority in Italy or the Bosporus) had
+become the only possible world order, even as the cities shrank and
+Mediterranean trade vanished. Syagrius, magister militum in the Roman rump
+state around Noviodunum, becomes the King of the Romans; his imperial holdout
+becomes the Kingdom of Soissons. It took several centuries for people to decide
+that anything particularly significant had happened when Odoacer overthrew the
+teenaged Romulus Augustulus in 476 AD. This is why the internet has not been a
+true revolution: everyone online is still obsessing over how much has changed,
+and fondly remembering the time before we all spent all our waking hours
+staring at phones.
- No posts
+[65]6
- Ready for more?
- ____________________
- (BUTTON) Subscribe
+Actually, I have two slightly overlapping theories on what might be happening.
+The main one is above; the second, which is weirder and makes less sense, has
+been shoved down here. Samuel Beckett describes a version of the internet and
+its exhaustion, one made of small pebbles. Here is Molloy on the beach, this
+limping old bird in his shabby overcoat, rolling in the sand. ‘Much of my life
+has ebbed away before this shivering expanse, to the sound of waves in storm
+and calm, and the claws of the surf.’ He has sixteen stones in his pocket, and
+every so often he puts one in his mouth to suck on it for a while. ‘A little
+pebble in your mouth, round and smooth, appeases, soothes, makes you forget
+your hunger, forget your thirst.’ The problem: how to make sure that when he
+next reaches into his pocket, he doesn’t take out the stone he’s just sucked?
+How to make sure he’s getting the full enjoyment out of each of his sixteen
+stones? Novelty is mysteriously important, even though ‘deep down it was all
+the same to me whether I sucked a different stone each time or always the same
+stone, until the end of time. For they all tasted exactly the same.’ For a
+while, his coat and his trousers and his mouth are turned into a series of
+machines for creating sequences of stones. Supply pockets and store pockets,
+modes of circulation: curated algorithms, organising the world and its
+information. Beckett spends half a dozen pages (in my edition) describing these
+systems, as each of them arrives in a flash of divine inspiration and fails in
+turn. Eventually, Molloy has exhausted every possible arrangement of atoms and
+voids. ‘The solution to which I rallied in the end was to throw away all the
+stones but one, which I kept now in one pocket, now in another, and which of
+course I soon lost, or threw away, or gave away, or swallowed. It was a wild
+part of the coast.’ In The Exhausted, his grand study of Beckett, Deleuze
+comments on the distinction between the exhausted and the merely tired. ‘The
+tired has only exhausted realisation, while the exhausted exhausts all of the
+possible.’ To exhaust the world as it is you only need to experience it: wander
+through reality, and get bored. But for true exhaustion, you need to know that
+everything that could be is as empty as everything that is. To reach
+exhaustion, you need some kind of device, made of ‘tables and programmes,’ a
+technics. Something like Molloy’s overcoat. ‘The combinatorial is the art or
+science of exhausting the possible, through inclusive disjunctions.’ The ars
+combinatoria is also the system of formal logic, revealed in holy visions to
+Ramon Llull in his cave on Puig de Ronda in 1274, eventually refined by
+Gottfried Leibniz, that powers the device you’re using to read this now.
+Exhaustion is the mode of life integral to a computerised society; the internet
+comes to us already long worn out, combining and recombining stale elements,
+shambling through the dead zones of itself.
- © 2024 Sam Kriss
- [48]Privacy ∙ [49]Terms ∙ [50]Collection notice
- Start Writing[51]Get the app
- [52]Substack is the home for great writing
+[66]7
- This site requires JavaScript to run correctly. Please [53]turn on
- JavaScript or unblock scripts
+You could compare this process to Marx’s law of the tendency of the rate of
+profit to fall: as each individual actor, follows its incentives and inflates
+the organic composition, the entire system ends up stumbling into crisis.
-References
+[67]8
- Visible links:
- 1. https://samkriss.substack.com/feed
- 2. https://samkriss.substack.com/
- 3. https://samkriss.substack.com/
- 4. https://substack.com/@samkriss
- 5. https://www.thecut.com/2022/02/a-vibe-shift-is-coming.html
- 6. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-1-71503638
- 7. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-2-71503638
- 8. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-3-71503638
- 9. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-4-71503638
- 10. https://damagemag.com/2022/04/21/the-internet-is-made-of-demons/
- 11. https://onlyfans.com/
- 12. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-5-71503638
- 13. https://www.theguardian.com/media/2022/aug/21/its-a-modern-day-facebook-how-bereal-became-gen-zs-favourite-app
- 14. https://www.rivaliq.com/blog/social-engagement-benchmark-trends-2020/
- 15. https://www.vox.com/recode/2022/2/2/22915110/facebook-meta-user-growth-decline-first-time-metaverse-mark-zuckerberg-tiktok-competition-earnings
- 16. https://www.digitalinformationworld.com/2022/03/this-new-report-reveals-surprising.html
- 17. https://www.insiderintelligence.com/content/time-spent-tiktok-decline
- 18. https://forum.agoraroad.com/index.php?threads/dead-internet-theory-most-of-the-internet-is-fake.3011/
- 19. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-6-71503638
- 20. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-7-71503638
- 21. https://www.theatlantic.com/ideas/archive/2019/10/say-goodbye-millennial-urban-lifestyle/599839/
- 22. https://data.worldbank.org/indicator/NV.IND.MANF.ZS
- 23. https://www.bloomberg.com/news/articles/2021-08-01/trillions-of-negative-yielding-debt-redeem-europe-s-bond-bulls
- 24. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-8-71503638
- 25. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-9-71503638
- 26. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-10-71503638
- 27. https://www.bloomberg.com/news/articles/2022-05-12/softbank-vision-fund-posts-a-record-loss-as-son-s-bets-fail
- 28. https://www.idler.co.uk/article/adam-curtis-social-media-is-a-scam/
- 29. https://marketinginsidergroup.com/marketing-strategy/digital-ads-dont-work-and-everyone-knows-it/
- 30. https://pubsonline.informs.org/doi/pdf/10.1287/mksc.2019.1188
- 31. https://www.lrb.co.uk/the-paper/v44/n09/donald-mackenzie/blink-bid-buy
- 32. https://www.theatlantic.com/magazine/archive/2022/05/social-media-democracy-trust-babel/629369/
- 33. https://thehill.com/opinion/white-house/3632191-the-dark-brandon-rises/
- 34. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-11-71503638
- 35. https://samkriss.com/2020/06/10/white-skin-black-squares/
- 36. https://www.vanityfair.com/news/2022/04/inside-the-new-right-where-peter-thiel-is-placing-his-biggest-bets
- 37. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-1-71503638
- 38. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-2-71503638
- 39. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-3-71503638
- 40. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-4-71503638
- 41. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-5-71503638
- 42. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-6-71503638
- 43. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-7-71503638
- 44. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-8-71503638
- 45. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-9-71503638
- 46. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-10-71503638
- 47. https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-11-71503638
- 48. https://substack.com/privacy
- 49. https://substack.com/tos
- 50. https://substack.com/ccpa#personal-data-collected
- 51. https://substack.com/app/app-store-redirect?utm_campaign=app-marketing&utm_content=web-footer-button
- 52. https://substack.com/
- 53. https://enable-javascript.com/
+People claim to be deeply worried by this stuff, but I think you secretly like
+it. You like the idea that your attention is what creates the world. You like
+the idea that the entire global economy is predicated on getting to know you,
+finding out what you like and dislike, your taste in music and your frankly
+insane political opinions and the gooey little treats you buy. Global
+capitalism as one vast Buzzfeed personality quiz. The faceless empire of
+yourself.
- Hidden links:
- 55. https://substack.com/profile/14289667-sam-kriss
- 56. javascript:void(0)
- 57. https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F19221e8d-a9aa-4143-b9a6-1e6f951faa44_1368x1156.png
- 58. https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa51b61a9-059d-45ed-8104-eaa81b678cd5_1536x1099.jpeg
- 59. https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3debefc-91c1-4a45-8509-fa16b752a687_1100x781.jpeg
- 60. javascript:void(0)
- 61. https://substack.com/signup?utm_source=substack&utm_medium=web&utm_content=footer
+[68]9
+
+One of the largest shareholders in Twitter is the Kingdom Holding Company,
+chaired by Prince al-Waleed bin Talal bin Abdulaziz al-Saud. For some reason,
+people seemed to think that replacing him with Elon Musk would shift the tenor
+of the site to the right.
+
+[69]10
+
+When I was younger, my brother and I had a running joke about a lemon that
+could connect to the internet. Not for any particular reason: a light would
+blink just below the lemon’s skin, and it would do nothing, just slowly rot in
+your fruitbowl. A few years ago, that lemon would have immediately secured half
+a billion dollars in first-round funding. Now, not so much.
+
+[70]11
+
+The ‘cancelled’ always participate in the theatre of their own cancellation. In
+Greco-Roman sacrifices, the animal was expected to nod before being led to the
+altar; the victim had to consent to its slaughter. And that nod always
+happened, even if a priest had to induce it by pouring a vase of water over the
+animal’s head.
+
+[71]
+Share
+Next
+Top
+New
+
+No posts
+
+Ready for more?
+
+[80][ ]
+Subscribe
+© 2024 Sam Kriss
+[82]Privacy ∙ [83]Terms ∙ [84]Collection notice
+[85] Start Writing[86]Get the app
+[87]Substack is the home for great writing
+This site requires JavaScript to run correctly. Please [88]turn on JavaScript
+or unblock scripts
+
+References:
+
+[1] https://samkriss.substack.com/
+[2] https://samkriss.substack.com/
+[12] https://substack.com/profile/14289667-sam-kriss
+[13] https://substack.com/@samkriss
+[14] javascript:void(0)
+[15] https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F19221e8d-a9aa-4143-b9a6-1e6f951faa44_1368x1156.png
+[16] https://www.thecut.com/2022/02/a-vibe-shift-is-coming.html
+[17] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-1-71503638
+[18] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-2-71503638
+[19] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-3-71503638
+[20] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-4-71503638
+[21] https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa51b61a9-059d-45ed-8104-eaa81b678cd5_1536x1099.jpeg
+[22] https://damagemag.com/2022/04/21/the-internet-is-made-of-demons/
+[23] https://onlyfans.com/
+[24] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-5-71503638
+[25] https://www.theguardian.com/media/2022/aug/21/its-a-modern-day-facebook-how-bereal-became-gen-zs-favourite-app
+[26] https://www.rivaliq.com/blog/social-engagement-benchmark-trends-2020/
+[27] https://www.vox.com/recode/2022/2/2/22915110/facebook-meta-user-growth-decline-first-time-metaverse-mark-zuckerberg-tiktok-competition-earnings
+[28] https://www.digitalinformationworld.com/2022/03/this-new-report-reveals-surprising.html
+[29] https://www.insiderintelligence.com/content/time-spent-tiktok-decline
+[30] https://forum.agoraroad.com/index.php?threads/dead-internet-theory-most-of-the-internet-is-fake.3011/
+[31] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-6-71503638
+[32] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-7-71503638
+[33] https://www.theatlantic.com/ideas/archive/2019/10/say-goodbye-millennial-urban-lifestyle/599839/
+[34] https://data.worldbank.org/indicator/NV.IND.MANF.ZS
+[35] https://www.bloomberg.com/news/articles/2021-08-01/trillions-of-negative-yielding-debt-redeem-europe-s-bond-bulls
+[36] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-8-71503638
+[37] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-9-71503638
+[38] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-10-71503638
+[39] https://www.bloomberg.com/news/articles/2022-05-12/softbank-vision-fund-posts-a-record-loss-as-son-s-bets-fail
+[40] https://www.idler.co.uk/article/adam-curtis-social-media-is-a-scam/
+[41] https://marketinginsidergroup.com/marketing-strategy/digital-ads-dont-work-and-everyone-knows-it/
+[42] https://pubsonline.informs.org/doi/pdf/10.1287/mksc.2019.1188
+[43] https://www.lrb.co.uk/the-paper/v44/n09/donald-mackenzie/blink-bid-buy
+[44] https://www.theatlantic.com/magazine/archive/2022/05/social-media-democracy-trust-babel/629369/
+[45] https://thehill.com/opinion/white-house/3632191-the-dark-brandon-rises/
+[46] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-11-71503638
+[47] https://samkriss.com/2020/06/10/white-skin-black-squares/
+[48] https://www.vanityfair.com/news/2022/04/inside-the-new-right-where-peter-thiel-is-placing-his-biggest-bets
+[49] https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3debefc-91c1-4a45-8509-fa16b752a687_1100x781.jpeg
+[60] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-1-71503638
+[61] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-2-71503638
+[62] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-3-71503638
+[63] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-4-71503638
+[64] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-5-71503638
+[65] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-6-71503638
+[66] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-7-71503638
+[67] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-8-71503638
+[68] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-9-71503638
+[69] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-10-71503638
+[70] https://samkriss.substack.com/p/the-internet-is-already-over#footnote-anchor-11-71503638
+[71] javascript:void(0)
+[82] https://substack.com/privacy
+[83] https://substack.com/tos
+[84] https://substack.com/ccpa#personal-data-collected
+[85] https://substack.com/signup?utm_source=substack&utm_medium=web&utm_content=footer
+[86] https://substack.com/app/app-store-redirect?utm_campaign=app-marketing&utm_content=web-footer-button
+[87] https://substack.com/
+[88] https://enable-javascript.com/
diff --git a/static/archive/sive-rs-ssi9lg.txt b/static/archive/sive-rs-ssi9lg.txt
index fffaa2b..6981fc6 100644
--- a/static/archive/sive-rs-ssi9lg.txt
+++ b/static/archive/sive-rs-ssi9lg.txt
@@ -1,703 +1,677 @@
- #[1]alternate
+[1]Derek Sivers
- [2]Derek Sivers
-
- Tech Independence
+Tech Independence
Contents:
- 0. [3]What?
- 1. [4]Register a domain
- 2. [5]Change DNS nameservers
- 3. [6]Create storage
- 4. [7]Create an SSH key
- 5. [8]Create your server
- 6. [9]SSH into root
- 7. [10]Customize these instructions
- 8. [11]Use your storage
- 9. [12]Contacts and Calendar
- 10. [13]Email sending
- 11. [14]Email settings
- 12. [15]Simple website
- 13. [16]File sharing in /pub/
- 14. [17]More indie tips
- 15. [18]More storage?
- 16. [19]Mutt = email in terminal
- 17. [20]Upkeep
- 18. [21]Certificate expired?
- 19. [22]Trouble? Start over
- 20. [23]Questions? Additions?
- __________________________________________________________________
+ 0. [2]What?
+ 1. [3]Register a domain
+ 2. [4]Change DNS nameservers
+ 3. [5]Create storage
+ 4. [6]Create an SSH key
+ 5. [7]Create your server
+ 6. [8]SSH into root
+ 7. [9]Customize these instructions
+ 8. [10]Use your storage
+ 9. [11]Contacts and Calendar
+10. [12]Email sending
+11. [13]Email settings
+12. [14]Simple website
+13. [15]File sharing in /pub/
+14. [16]More indie tips
+15. [17]More storage?
+16. [18]Mutt = email in terminal
+17. [19]Upkeep
+18. [20]Certificate expired?
+19. [21]Trouble? Start over
+20. [22]Questions? Additions?
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
What?
- Tech independence is not depending on any particular company or
- software.
-
- The only tools you need are the common open source basics built into
- any Linux or BSD operating system — free public-domain tools that are
- not owned by anyone, and can run on any computer.
-
- Learn a few of these basic tools, and you can run your own private
- server on any computer forever, for the rest of your life. Host your
- own website and email. Keep your own contacts and calendars synced with
- your phone. Back up and sync your photos, movies, and music to your own
- private storage. No more subscriptions needed.
-
- You can ignore all the companies offering “solutions”, even if they are
- free, because they take away self-reliance. The point is to know how to
- do it yourself, not to have somebody do it for you. It’s worth a little
- up-front work, like learning how to drive.
-
- Below are simple step-by-step instructions that work. Instead of
- drowning you in options, it uses an operating system called [24]OpenBSD
- and a hosting company called [25]Vultr because I’ve used them for years
- and I know they are good and trustworthy. But you could do this same
- setup with any free Linux or BSD operating system, with any hosting
- company that gives you “root” access to your own private server. You
- could even do it on an old laptop in your closet.
-
- So if a company turns evil or goes out of business, no problem! You can
- set up a new server anywhere else in an hour, point your domain name to
- the new IP address, and it’s done. That’s tech independence — never
- dependent on any particular provider or software. It’s very empowering.
- The instructions below will show you how.
-
- Register a domain
-
- 1. Go to [26]Porkbun.com.
- 2. Search for a domain name you like until you find one that’s
- available.
- 3. Create a new account, and pay.
- 4. Congratulations. You’ll use this domain name in many of the steps
- below.
-
- Change DNS nameservers to vultr
-
- 1. Wherever you registered your domain name, log in there to change
- your domain’s DNS nameservers.
- 2. It’s usually set by default to the company where you registered. So
- for example a domain registered at GoDaddy will have default
- nameservers of something.godaddy.com.
- 3. Replace those defaults with these two:
- + ns1.vultr.com
- + ns2.vultr.com
-
- Create storage
-
- 1. Go to [27]Vultr.com.
- 2. Create an account and give it your credit card.
- 3. [28]Click here for the “[29]Add Block Storage” page.
- 4. Click “Block Storage (HDD)”, which says “Globally Available”
- 5. Below that, a list of cities. Click the one closest to you.
- 6. Below that, a slider lets you choose how much storage you need. If
- not sure, just leave it as $1 for 40 GB.
- 7. Below that, in a subtle box that says “label” type the word
- encrypted.
- 8. Below that, click the “Add Block Storage” button.
-
- Create an SSH key
-
- 1. Open a terminal.
- + Windows? Start → Windows PowerShell → Windows PowerShell
- + Mac? Applications → Utilities → Terminal
- 2. Type ssh-keygen -t ed25519 and hit [enter] or [return].
- 3. When it says, “Enter file in which to save the key
- (/Users/yourname/.ssh/id_ed25519):”, hit [enter] or [return].
- 4. When it says, “Enter passphrase (empty for no passphrase):”, hit
- [enter] or [return].
- 5. When it says, “Enter same passphrase again:”, hit [enter] or
- [return].
- 6. See the line that starts, “Your public key has been saved in” and
- ends in “id_ed25519.pub”? That’s the file you need for the next
- step.
- 7. In a text editor, open “id_ed25519.pub”.
- + Windows? Type notepad .ssh/id_ed25519.pub
- + Mac? Type open -e .ssh/id_ed25519.pub
- 8. It should be a single line like this:
- ssh-ed25519 AAAAC3Nz5AAAAIPIXO5icj4LUpqa2baqYQRmCZ1+NV4sBDr you@com
- puter
- 9. You’ll use this in the next step: “[30]Create your server”.
-
- Create your server
-
- 1. In your [31]Vultr.com account:
- 2. [32]Click here for the “[33]Deploy New Instance” page.
- 3. Click “Cloud Compute” (NOT “Optimized Cloud Compute”)
- 4. Below that, click “Intel Regular Performance”
- 5. Below that, IMPORTANT: click the same city you chose for your
- encrypted storage in the previous step.
- 6. Below that, click “OpenBSD” (the yellow blowfish) then inside its
- box, click “7.4 x64”
- 7. Below that, under Server Size, click “25 GB SSD $5/month”
- 8. A blue pop-up appears underneath, up-selling “For only $1.00 more
- you can...”. Click “No thanks”.
- 9. Scroll down to “SSH Keys”, click “Add New”, then under “Name” type
- mykey.
- 10. From [34]the previous section, step 3, copy (⌘-C or Ctrl-C) the
- contents of “id_ed25519.pub” and paste it into this box called “SSH
- Key”. It should be a single line like this:
- ssh-ed25519 AAAAC3NzaC1XO5iclCcrHbGRPoj4LUpqa2baqYQRmCZ1+NV4sBDr
- you@computer
- 11. After pasting it into the box, click [Add SSH Key].
- 12. Under SSH Keys, click the box with the picture of the key called
- “mykey” to give it a tick mark in the top-right corner.
- 13. Scroll up to “Enable Auto Backups”, click the “on” toggle button to
- turn it OFF.
- 14. A scary pop-up says “Are you sure....”. Tick the box next to “I
- understand the risks”, then click the red button “Disable Auto
- Backups”.
- 15. Under “Additional Features”, untick the box next to “Enable IPv6”,
- to disable it.
- 16. Under “Server Hostname & Label”, type your domain name in both
- “server hostname” and “server label”.
- 17. At the bottom, click the big blue button [“Deploy Now”].
- 18. Stretch your legs for a minute while waiting for your server status
- to change from “Installing” to “Running”.
- 19. Copy and save its IP Address on your computer.
-
- SSH into root, and get my script
-
- 1. Copy (⌘-C or Ctrl-C) the IP Address from the last step of
- [35]Create Your Server.
- 2. Open your terminal from the [36]Create an SSH key section.
- 3. Whenever I say to type something into the terminal, hit your
- [return] or [enter] key afterwards.
- 4. Type into the terminal: ssh root@YOUR-IP-ADDRESS. So for example:
- ssh root@123.45.67.89
- 5. It should say something like:
-The authenticity of host '123.45.67.78 (123.45.67.89)' can’t be established.
-ED25519 key fingerprint is SHA256:OyiqVsjRX8U2f0UTUY4D0erdl6855YNRXyQk2D.
-This key is not known by any other names
-Are you sure you want to continue connecting (yes/no/[fingerprint])?
- 6. Type yes
- 7. It should say something like:
-Warning: Permanently added '123.45.67.89' (ED25519) to the list of known hosts.
-OpenBSD 7.4 (GENERIC.MP) #1396: Sun Oct 8 09:20:40 MDT 2023
-Welcome to OpenBSD: The proactively secure Unix-like operating system.
- 8. Congratulations! You’re inside a remote computer!
- 9. Type ftp https://sive.rs/ti.sh
- 10. Type sh ti.sh
- 11. Watch it install, answer its questions, and do what it says.
- 12. Be ready to open a new terminal window, so you can leave this one
- logged-in.
- 13. See below for help with its prompts.
-
- Customize these instructions
-
- Enter your domain name and the username that you create, below, and
- this will customize all following instructions for you.
- Your domain name? ____________________ Your username?
- ____________________ customize
-
- Now when you see this button: (BUTTON) 📋 click it to copy that line so
- you can paste it into your terminal, without error.
-
- Use your encrypted storage
-
- The [37]ti.sh script will eventually prompt you, “Now upload anything
- while I wait...”. Here’s how.
-
- Mac
-
- Type rsync -avz Documents yourusername@yourdomain.name:/mnt/ and you
- will see it uploading your Documents folder to your private encrypted
- storage. Use this same format to upload any other folders, replacing
- “Documents” in the command. If you are happy synchronizing on the
- command line like this, you can skip over the next FreeFileSync
- section.
-
- [38]FreeFileSync
-
- Everyone using Windows should use [39]FreeFileSync. Here’s how:
- 1. [40]Download FreeFileSync and please give an optional donation
- there if you can afford to. Donating also unlocks more features.
- Thanks to Jon Lis for the recommendation.
- 2. Install and open FreeFileSync.
- 3. Top-center: click the grey [Browse] button and find the folder with
- the stuff you want to upload.
- 4. Top-far-right: click the white cloud icon then SFTP at the top.
- 5. Server name or IP address: yourdomain.name
- 6. Left side: click (*) Key File
- 7. Username: yourusername
- 8. Browse to find your private key, called id_ed25519 from the
- “[41]Create an SSH key” section. (Not the file that ends in “.pub”,
- but the one next to it.) NOTE: Because the /Users/yourusername/.ssh
- directory is “hidden” by Windows and Mac by default, I find it
- easier to just type the path directly, like this:
- + The username, for this next line, should be your username on
- your home computer, not your remote server.
- + Windows? Type (BUTTON) 📋C:\Users\yourusername\.ssh\id_ed25519
- + Mac? Type (BUTTON) 📋/Users/yourusername/.ssh/id_ed25519
- 9. Directory on server: /mnt
- 10. Click OK to go back to the main screen.
- 11. Top-right: click the green gear wheel.
- 12. Left button: click “MIRROR →”
- 13. Click OK to go back to the main screen.
- 14. Top-center: click “COMPARE”, and make sure your files are there.
- 15. Top-right: click “SYNCHRONIZE Mirror →” then [Start]
-
- Verify and unmount
-
- 1. When it’s done uploading, log in to your server again, from your
- terminal.
- 2. Type find /mnt
- 3. You should see a long list of the files you uploaded.
- 4. Type m-x to detach your encrypted storage.
- 5. Type find /mnt again, and now you should see nothing there!
- Congratulations! You now see how this will work in the future:
- 1. Log in and type “m” to attach your encrypted storage.
- 2. Upload your files with rsync or FreeFileSync.
- 3. Log in and type “m-x” to detach the storage, for security.
-
- Contacts and Calendar
-
- Your phone currently keeps its contacts and calendars with Google or
- Apple. Now you can get them off the cloud and keep them privately on
- your own server.
-
- My [42]ti.sh setup script installs a [43]CardDAV server for contacts,
- and [44]CalDAV server for calendars.
-
- Here’s how to connect your phone.
-
- Android phone
-
- You need an app called “[45]DAVx⁵”, so [46]install it first. Then…
- 1. Open the DAVx⁵ app
- 2. Click the orange (+) in the bottom-right
- 3. Click (·) “Login with URL and user name”
- 4. Base URL: https://dav.yourdomain.name/
- 5. User name: yourusername
- 6. Password: the “easy to type on your phone” password you made
- 7. Click “LOGIN” in the bottom-right corner.
- 8. It should work and bring you to the “Create account” page, where
- “Account name” will be yourusername. Leave everything as-is and
- click “CREATE ACCOUNT” in the bottom-right corner.
- 9. It brings you to the “CARDDAV” header. Tick the toggle to turn on
- next to your domain name.
- 10. Click the ♻ arrows in the bottom-right corner to synchronize your
- contacts.
- 11. Click the “CALDAV” header up top. Tick the toggle to turn on next
- to your domain name.
- 12. Click the ♻ arrows in the bottom-right corner to synchronize your
- calendar.
- 13. Go to your Calendar app, and in the top-right corner, click the
- round icon there. (Might be your face or a letter.) Then change it
- to the one with yourusername. After changing it, click the X in the
- top-left corner.
- 14. To add a new Event, Click [+] in the bottom-right corner, and
- choose “Event” from the popup menu.
- 15. There might be a warning, “Switch to a Google Account to take
- advantage blah blah…”. Click “dismiss”.
- 16. Title this event something like “Test Delete”, and notice it should
- be saving to the calendar with your domain name and username. Click
- (Save) in the top-right corner.
- 17. Check the terminal window where it should say “Calendar entry
- added!”
- 18. Go to your Contacts app, and in the bottom-right corner, click “Fix
- & manage”.
- 19. Click “Settings”
- 20. Near the bottom, click “Default account for new contacts”, and
- change it to the DAVx⁵ Address book with your domain name.
- 21. Click “< Settings” in the top-left corner.
- 22. In the top-right corner, click the round icon there. (Might be your
- face or a letter.) Then change it to the DAVx⁵ Address book with
- your domain name. Then click X in the top-left corner.
- 23. Click “Contacts” in the bottom-left corner. It should say “No
- contacts in this account”.
- 24. Click + in the bottom-right corner to Create contact. Top of the
- next page should say “Save to” then your domain name.
- 25. Add a New Contact with a name like “Test Delete”. Then click “Save”
- in the top-right corner.
- 26. Check the terminal window where it should say “Contact added! Both
- work. Congratulations.”
-
- Apple iPhone
-
- 1. Settings → Contacts → Accounts → Add Account → Other → (under
- “CONTACTS”:) Add CardDAV Account
- 2. Server: dav.yourdomain.name
- 3. User Name: yourusername
- 4. Password: the “easy to type on your phone” password you made
- 5. Click “next” in the top right corner, and it should bring you to
- your “Accounts” page, where you see it listed, saying “Contacts”
- underneath.
- 6. Click Add Account → Other → (under “CALENDARS”:) Add CalDAV Account
- 7. Server: dav.yourdomain.name
- 8. User Name: yourusername
- 9. Password: the “easy to type on your phone” password you made
- 10. Click “next” in the top right corner, and it should bring you to a
- “CalDAV” page, showing Calendars and Reminders. Un-tick Reminders.
- 11. Click “save” in the top right corner, and it should bring you to
- your “Accounts” page, where you see it listed, saying “Calendars”
- underneath.
- 12. Click “< Contacts” in the top-left corner, to go back to settings
- for your Contacts app.
- 13. At the bottom change Default Account to the one with
- yourdomain.name.
- 14. Click “< Contacts” then “< Settings”, both in the top-left corner,
- then scroll down to Calendar settings and click it.
- 15. In Calendar settings, 2nd from the bottom should say “Default
- Calendar”. Tap to change it to the one with yourdomain.name.
- 16. Go to your Calendar app and click the + in the top-right corner.
- 17. Add a New Event with a Title like “Test Delete”. Then click “Add”
- in the top-right corner.
- 18. Check the terminal window where it should say “Calendar entry
- added!”
- 19. Go to your Contacts app and click the + in the top-right corner.
- 20. Add a New Contact with a name like “Test Delete”. Then click “Done”
- in the top-right corner.
- 21. Check the terminal window where it should say “Contact added! Both
- work. Congratulations.”
-
- Email sending
-
- 1. Go to [47]Mailjet.com and sign up for their free account.
- 2. Go to [48]this page for API keys and [Generate secret key]
- 3. Give the [49]ti.sh script your API key and Secret key, and it will
- do the rest.
-
- Email settings
-
- To do email from your phone, computer, or anywhere else, you now have
- an [50]IMAP server, called [51]Dovecot. So on any device, you can add a
- new IMAP Mail account, with these settings:
- * Account type: IMAP
- * Email address: yourusername@yourdomain.name
- * Username: yourusername
- * Password: the password you made for your username on your server
- * Incoming mail server: yourdomain.name
- * Outgoing mail server: yourdomain.name
- * Connection security: SSL
- * Authentication type: Basic authentication
-
- Simple website
-
- 1. On your home computer, in your main home directory, make a
- directory/folder called “htdocs”
- 2. [52]Download this file called “template.html” and save it in your
- “htdocs” directory.
- 3. [53]Download this file called “style.css” and also save it in your
- “htdocs” directory.
- 4. Make a copy of the “template.html” file, and name the copy
- “index.html”. This will be your home page.
- 5. Edit the index.html file in a text editor (NotePad or TextEdit) and
- change my default text to whatever you want.
- 6. When you need to add a new page, just copy the template again, call
- it “about.html” or whatever, and make a link to it from the home
- page. The header of each page will link back to index.html : your
- home page.
- 7. If you want to change the look of your site, just edit the
- style.css file. [54]Search the web for “CSS tutorial” if needed.
- 8. To upload it to your public server, do one of the next two steps:
- 9. Apple Mac? Open a new terminal window on your computer, type
- rsync -avz htdocs yourusername@yourdomain.name:/var/www/
- 10. Windows? [55]FreeFileSync again, but now change the “Directory on
- server” to /var/www/ (you can find it by clicking [browse] or
- typing it directly) then upload this htdocs directory there.
- 11. Go to https://yourdomain.name in your web browser, refresh the
- page, and you should see your updated website.
- 12. Any trouble, just know that the goal is to get that index.html file
- into this location on your server: /var/www/htdocs/index.html
- because that’s where the web server is expecting it to be. That’s
- where we put the original test file, so your new index.html file
- should replace that one.
- 13. If you want [56]short URLs, without the .html, you can (for
- everything except index.html) because I set the default type to be
- HTML. Just remove the “.html” from your HTML filenames, update your
- links, and voilà!
-
- It’s important to know how to make a simple website by hand, and not
- let people sell you on complex solutions that are the equivalent of
- saying you need a jumbo jet when you really need a bicycle. For real
- tech independence, start by typing your HTML files yourself. Only
- later, after you have many many pages, consider a more complicated
- solution.
-
- File sharing in /pub/
-
- Your website is configured to list all files in the /pub/ directory of
- your website. So basically anything in /var/www/htdocs/pub/ is public.
- Upload any files you want to share.
-
- It replaces Dropbox and similar services for sending big files. Just
- upload the file to /var/www/htdocs/pub/ then find it in your web
- browser, copy its URL, and send someone the URL.
-
- If the files you want to share are already on your computer, then just
- make a pub/ directory inside htdocs/ (so, htdocs/pub/), put your files
- in there, then use FreeFileSync or rsync to upload them as you did in
- the previous section called “[57]Simple website”. Consider them part of
- your website.
-
- Or if you have a URL from somewhere else online that you want to
- download to your server, just do it as we did in the numbered steps
- above. Then use FreeFileSync or rsync to download from your server to
- your computer first, before your next upload sync.
-
- More indie tips
-
- 1. Use [58]Firefox.
- 2. Install [59]uBlock Origin in Firefox and Chrome.
- 3. In Firefox settings, under “Privacy and Security”, choose “[X]
- Delete cookies and site data when Firefox is closed”, then close
- Firefox often to erase all your cookies and logins. Browse the web
- anonymously, not logged-in.
- 4. Replace Google Authenticator with [60]Aegis on Android or [61]Raivo
- on iPhone.
- 5. If you use Windows, replace it with [62]Ubuntu Linux. (Use both at
- first, then slowly transition.)
- 6. Keep your new email address as a [63]private email account that you
- only give to those few people who you really want to hear from.
- Then your old gmail/yahoo/outlook/etc address can be just
- low-priority junk, and your new private email account won’t need
- spam protection.
- 7. Or if you don’t want to run your own email server, use
- [64]Mailbox.org or [65]Fastmail but only by using your own domain
- name. Be yourusername@yourdomain.name from now on. Don’t depend on
- anyone else’s domain for your email or you’ll be stuck with them.
-
- More storage?
-
- If you need hundreds of gigabytes, or even terabytes of storage, I
- recommend Hetzner’s “[66]Storage Box”. It’s the best storage value I’ve
- found. Also consider [67]Backblaze Personal Backup.
-
- I personally use Vultr’s storage (as described above) for sensitive
- information I definitely want completely encrypted. Then I use
- Hetzner’s Storage Box for all my photos, videos, music, and other big
- files that don’t absolutely need to be encrypted.
-
- Mutt = email in the terminal
-
- Unless you want to read email directly on your server, skip this step.
- 1. ssh in to your server, then type mutt
- 2. You should see the subject headers, with the first email
- highlighted. Type j and k a few times to go down and up the list of
- emails.
- 3. To read an email, hit [enter] or [return] when it is highlighted.
- 4. To go back to the list, type i (for “index”)
- 5. To reply, hit r then:
- + It shows “To:” so you can edit or add recipients. Hit [enter]
- or [return] to leave it.
- + It shows “Subject:” so you can edit the subject. Hit [enter]
- or [return] to leave it.
- + It asks “Include message in reply? ([yes]/no/?):”. Hit [enter]
- or [return] for the usual norm of echoing someone’s email back
- at them below your reply. Or n for not.
- + Now you are inside the [68]vi text editor which is not
- self-explanatory, so I’ll walk you through a simple reply:
- + Hit i (no [return] or [enter]) to go into “insert mode” and
- type your message. You’ll notice it’s on the same line as some
- other text, so you might want to start by hitting [return] or
- [enter] a few times, then up-arrow to go back to the first
- line again.
- + When done typing your message, hit your [esc] key in the very
- top-left corner of your keyboard. Nothing will change on the
- screen, yet.
- + Type :wq (the “:” at the beginning is important) then [enter]
- or [return].
- + Then you’ll see the “Compose Menu” which I think of as the
- “last chance before sending” screen. Hit y to send it.
- 6. To send a new email, hit m then repeat those steps like you did for
- a reply, except now the “To:” and “Subject:” are blank and waiting
- for you to create. (For “To:”, type the email address of the person
- you’re emailing.)
- 7. To quit, hit q
-
- [69]Mutt is a great program for reading and sending email on the
- command line. It’s been my email client for 20 years. [70]Read its
- manual here if you want to go deeper. It does everything.
-
- The [71]vi text editor is a useful tool to edit text on a server. It
- takes a few minutes to learn, but it’s worth learning because it’s
- installed by default on every Linux/BSD server.
-
- Upkeep
-
- You honestly don’t have to do anything to maintain your server. It will
- just work as-is for decades! But if you like to keep it up-to-date, it
- only takes a minute, so run these next steps any time.
- 1. Log in to your server, if you are not already.
- 2. Type (BUTTON) 📋doas su
- 3. Type (BUTTON) 📋syspatch
- 4. Type (BUTTON) 📋fw_update
- 5. Type (BUTTON) 📋pkg_add -u
- 6. Type (BUTTON) 📋sysupgrade
- 7. Type exit; exit to log out.
-
- If that last “sysupgrade” step did not give an “Error retrieving … 404
- Not Found” error, that means your OpenBSD operating system is upgrading
- itself. They release an upgrade every 6 months. In that case, [72]go to
- this OpenBSD page and follow the link at the top that says “Upgrading
- to (7.4, etc)” to see if there’s anything else you should know.
-
- If the “sysupgrade” step updated your operating system and your server
- rebooted, then there is just one more step:
- 1. Log in to your server, if you are not already.
- 2. Type (BUTTON) 📋doas su
- 3. Type (BUTTON) 📋sysmerge
- 4. Follow any instructions. Don’t worry about messing up because you
- can always start over, as described below.
- 5. Re-do the syspatch ; fw_update ; pkg_add -u steps, above.
- 6. Type exit; exit to log out.
-
- Secure certificate expired?
-
- 1. Log in to your server, if you are not already.
- 2. Type (BUTTON) 📋doas su
- 3. Type (BUTTON) 📋domain=yourdomain.name
- 4. Type (BUTTON) 📋acme-client -v $domain
- 5. Type (BUTTON) 📋rcctl restart relayd
- 6. That should fix it. Confirm it in your web browser. [73]Let me know
- if not.
- 7. IMPORTANT: Copy-paste this next line to make it renew automatically
- from now on:
- 8. (BUTTON) 📋(crontab -l 2>/dev/null; echo
- "11\t3\t*\t*\t5\tacme-client $domain \&\& rcctl reload relayd") |
- crontab -
- 9. Hit [enter]. Type exit; exit to log out.
- 10. [74]Let me know if it happens again. (It shouldn’t.)
-
- Trouble? Start over
-
- I’ve tested the steps above very carefully and repeatedly. They work.
- So if you hit a major problem, something not happening like it says it
- should, please do this:
- 1. Type “cd ; m-x ; exit” in any terminals you still have open, until
- they are all closed.
- 2. Go to [75]your Vultr account.
- 3. See your server instance? See to the far right, a subtle ···? Click
- that.
- 4. From its pop-up menu, click the last option: “Server Destroy”.
- 5. Tick the box next to “[X] Yes, destroy this server.”
- 6. Click the big red [Destroy Server] button.
- 7. This will not destroy your encrypted storage. That’s another reason
- we kept it separate from the start. So if you already uploaded a
- bunch of your files and want to save them, they should still be
- there.
- 8. On your own computer, in the terminal, type: rm .ssh/known_hosts
- 9. Go back to the section called “[76]Create your server” and try
- again.
-
- Questions? Additions?
-
- To learn more about your new server, just log in and type: [77]help
- It will teach you the basics. Then for each command or file you want to
- know more about, type [78]man followed by the command or filename. So
- for example, log in and type…
- * man [79]adduser
- * man [80]ssh
- * man [81]doas
- * man [82]rcctl
- * man [83]pkg_add
- * man [84]ftp
- * man [85]httpd.conf
-
- Hit your [space] bar to scroll the page, then q to quit.
-
- It’s one of the most wonderful things about OpenBSD: everything you
- need to know is in those man pages! No need for YouTube, Google,
- ChatGPT, or any other advertising-driven sources of information.
-
- I will constantly improve this page, so [86]get on my private email
- list for updates.
-
- Until then, ask any questions. If something went wrong, please give me
- a very specific description of exactly what went wrong at what step,
- what it was supposed to do, and what exactly it actually did. [87]Click
- here to email me.
-
- Requests for what to add? Again, just [88]email me.
-
-References
-
- 1. https://sive.rs/en.atom
- 2. https://sive.rs/
- 3. https://sive.rs/ti#why
- 4. https://sive.rs/ti#register
- 5. https://sive.rs/ti#dns0
- 6. https://sive.rs/ti#storage1
- 7. https://sive.rs/ti#ssh
- 8. https://sive.rs/ti#server1
- 9. https://sive.rs/ti#server2
- 10. https://sive.rs/ti#custom
- 11. https://sive.rs/ti#storage4
- 12. https://sive.rs/ti#radicale
- 13. https://sive.rs/ti#mailjet
- 14. https://sive.rs/ti#mail3
- 15. https://sive.rs/ti#web1
- 16. https://sive.rs/ti#web2
- 17. https://sive.rs/ti#indie
- 18. https://sive.rs/ti#storage5
- 19. https://sive.rs/ti#mutt
- 20. https://sive.rs/ti#upkeep
- 21. https://sive.rs/ti#cert
- 22. https://sive.rs/ti#redo
- 23. https://sive.rs/ti#questions
- 24. https://sive.rs/openbsd
- 25. https://www.vultr.com/?ref=9541378-8H
- 26. https://porkbun.com/
- 27. https://www.vultr.com/?ref=6930328
- 28. https://my.vultr.com/blockstorage/add/
- 29. https://my.vultr.com/blockstorage/add/
- 30. https://sive.rs/ti#server1
- 31. https://www.vultr.com/?ref=6930328
- 32. https://my.vultr.com/deploy/
- 33. https://my.vultr.com/deploy/
- 34. https://sive.rs/ti#ssh
- 35. https://sive.rs/ti#server1
- 36. https://sive.rs/ti#ssh
- 37. https://sive.rs/ti.sh
- 38. https://freefilesync.org/
- 39. https://freefilesync.org/
- 40. https://freefilesync.org/download.php
- 41. https://sive.rs/ti#ssh
- 42. https://sive.rs/ti.sh
- 43. https://en.wikipedia.org/wiki/CardDAV
- 44. https://en.wikipedia.org/wiki/CalDAV
- 45. https://www.davx5.com/
- 46. https://www.davx5.com/download
- 47. https://app.mailjet.com/signup?lang=en_US
- 48. https://app.mailjet.com/account/apikeys
- 49. https://sive.rs/ti.sh
- 50. https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol
- 51. https://www.dovecot.org/
- 52. https://sive.rs/file/template.html
- 53. https://sive.rs/file/style.css
- 54. https://duckduckgo.com/?q=css+tutorial
- 55. https://freefilesync.org/
- 56. https://sive.rs/su
- 57. https://sive.rs/ti#web1
- 58. https://www.mozilla.org/firefox/
- 59. https://ublockorigin.com/
- 60. https://getaegis.app/
- 61. https://raivo-otp.com/
- 62. https://ubuntu.com/desktop
- 63. https://sive.rs/pe
- 64. https://mailbox.org/
- 65. https://www.fastmail.com/
- 66. https://www.hetzner.com/storage/storage-box
- 67. https://www.backblaze.com/cloud-backup/personal
- 68. https://duckduckgo.com/?q=vi+editor
- 69. http://mutt.org/
- 70. http://mutt.org/doc/manual/
- 71. https://duckduckgo.com/?q=vi+editor
- 72. https://www.openbsd.org/faq/
- 73. https://sive.rs/contact
- 74. https://sive.rs/contact
- 75. https://my.vultr.com/
- 76. https://sive.rs/ti#server1
- 77. https://man.openbsd.org/help
- 78. https://man.openbsd.org/man.1
- 79. https://man.openbsd.org/adduser.8
- 80. https://man.openbsd.org/ssh.1
- 81. https://man.openbsd.org/doas.1
- 82. https://man.openbsd.org/rcctl.8
- 83. https://man.openbsd.org/pkg_add.1
- 84. https://man.openbsd.org/ftp.1
- 85. https://man.openbsd.org/httpd.conf.5
- 86. https://sive.rs/contact
- 87. https://sive.rs/contact
- 88. https://sive.rs/contact
+Tech independence is not depending on any particular company or software.
+
+The only tools you need are the common open source basics built into any Linux
+or BSD operating system — free public-domain tools that are not owned by anyone
+, and can run on any computer.
+
+Learn a few of these basic tools, and you can run your own private server on
+any computer forever, for the rest of your life. Host your own website and
+email. Keep your own contacts and calendars synced with your phone. Back up and
+sync your photos, movies, and music to your own private storage. No more
+subscriptions needed.
+
+You can ignore all the companies offering “solutions”, even if they are free,
+because they take away self-reliance. The point is to know how to do it
+yourself, not to have somebody do it for you. It’s worth a little up-front
+work, like learning how to drive.
+
+Below are simple step-by-step instructions that work. Instead of drowning you
+in options, it uses an operating system called [23]OpenBSD and a hosting
+company called [24]Vultr because I’ve used them for years and I know they are
+good and trustworthy. But you could do this same setup with any free Linux or
+BSD operating system, with any hosting company that gives you “root” access to
+your own private server. You could even do it on an old laptop in your closet.
+
+So if a company turns evil or goes out of business, no problem! You can set up
+a new server anywhere else in an hour, point your domain name to the new IP
+address, and it’s done. That’s tech independence — never dependent on any
+particular provider or software. It’s very empowering. The instructions below
+will show you how.
+
+Register a domain
+
+ 1. Go to [25]Porkbun.com.
+ 2. Search for a domain name you like until you find one that’s available.
+ 3. Create a new account, and pay.
+ 4. Congratulations. You’ll use this domain name in many of the steps below.
+
+Change DNS nameservers to vultr
+
+ 1. Wherever you registered your domain name, log in there to change your
+ domain’s DNS nameservers.
+ 2. It’s usually set by default to the company where you registered. So for
+ example a domain registered at GoDaddy will have default nameservers of
+ something.godaddy.com.
+ 3. Replace those defaults with these two:
+ □ ns1.vultr.com
+ □ ns2.vultr.com
+
+Create storage
+
+ 1. Go to [26]Vultr.com.
+ 2. Create an account and give it your credit card.
+ 3. [27]Click here for the “[28]Add Block Storage” page.
+ 4. Click “Block Storage (HDD)”, which says “Globally Available”
+ 5. Below that, a list of cities. Click the one closest to you.
+ 6. Below that, a slider lets you choose how much storage you need. If not
+ sure, just leave it as $1 for 40 GB.
+ 7. Below that, in a subtle box that says “label” type the word encrypted.
+ 8. Below that, click the “Add Block Storage” button.
+
+Create an SSH key
+
+ 1. Open a terminal.
+ □ Windows? Start → Windows PowerShell → Windows PowerShell
+ □ Mac? Applications → Utilities → Terminal
+ 2. Type ssh-keygen -t ed25519 and hit [enter] or [return].
+ 3. When it says, “Enter file in which to save the key (/Users/yourname/.ssh/
+ id_ed25519):”, hit [enter] or [return].
+ 4. When it says, “Enter passphrase (empty for no passphrase):”, hit [enter] or
+ [return].
+ 5. When it says, “Enter same passphrase again:”, hit [enter] or [return].
+ 6. See the line that starts, “Your public key has been saved in” and ends in
+ “id_ed25519.pub”? That’s the file you need for the next step.
+ 7. In a text editor, open “id_ed25519.pub”.
+ □ Windows? Type notepad .ssh/id_ed25519.pub
+ □ Mac? Type open -e .ssh/id_ed25519.pub
+ 8. It should be a single line like this:
+ ssh-ed25519 AAAAC3Nz5AAAAIPIXO5icj4LUpqa2baqYQRmCZ1+NV4sBDr you@computer
+ 9. You’ll use this in the next step: “[29]Create your server”.
+
+Create your server
+
+ 1. In your [30]Vultr.com account:
+ 2. [31]Click here for the “[32]Deploy New Instance” page.
+ 3. Click “Cloud Compute” (NOT “Optimized Cloud Compute”)
+ 4. Below that, click “Intel Regular Performance”
+ 5. Below that, IMPORTANT: click the same city you chose for your encrypted
+ storage in the previous step.
+ 6. Below that, click “OpenBSD” (the yellow blowfish) then inside its box,
+ click “7.4 x64”
+ 7. Below that, under Server Size, click “25 GB SSD $5/month”
+ 8. A blue pop-up appears underneath, up-selling “For only $1.00 more you
+ can...”. Click “No thanks”.
+ 9. Scroll down to “SSH Keys”, click “Add New”, then under “Name” type mykey.
+10. From [33]the previous section, step 3, copy (⌘-C or Ctrl-C) the contents of
+ “id_ed25519.pub” and paste it into this box called “SSH Key”. It should be
+ a single line like this:
+ ssh-ed25519 AAAAC3NzaC1XO5iclCcrHbGRPoj4LUpqa2baqYQRmCZ1+NV4sBDr
+ you@computer
+11. After pasting it into the box, click [Add SSH Key].
+12. Under SSH Keys, click the box with the picture of the key called “mykey” to
+ give it a tick mark in the top-right corner.
+13. Scroll up to “Enable Auto Backups”, click the “on” toggle button to turn it
+ OFF.
+14. A scary pop-up says “Are you sure....”. Tick the box next to “I understand
+ the risks”, then click the red button “Disable Auto Backups”.
+15. Under “Additional Features”, untick the box next to “Enable IPv6”, to
+ disable it.
+16. Under “Server Hostname & Label”, type your domain name in both “server
+ hostname” and “server label”.
+17. At the bottom, click the big blue button [“Deploy Now”].
+18. Stretch your legs for a minute while waiting for your server status to
+ change from “Installing” to “Running”.
+19. Copy and save its IP Address on your computer.
+
+SSH into root, and get my script
+
+ 1. Copy (⌘-C or Ctrl-C) the IP Address from the last step of [34]Create Your
+ Server.
+ 2. Open your terminal from the [35]Create an SSH key section.
+ 3. Whenever I say to type something into the terminal, hit your [return] or
+ [enter] key afterwards.
+ 4. Type into the terminal: ssh root@YOUR-IP-ADDRESS. So for example:
+ ssh root@123.45.67.89
+ 5. It should say something like:
+
+ The authenticity of host '123.45.67.78 (123.45.67.89)' can’t be established.
+ ED25519 key fingerprint is SHA256:OyiqVsjRX8U2f0UTUY4D0erdl6855YNRXyQk2D.
+ This key is not known by any other names
+ Are you sure you want to continue connecting (yes/no/[fingerprint])?
+
+ 6. Type yes
+ 7. It should say something like:
+
+ Warning: Permanently added '123.45.67.89' (ED25519) to the list of known hosts.
+ OpenBSD 7.4 (GENERIC.MP) #1396: Sun Oct 8 09:20:40 MDT 2023
+ Welcome to OpenBSD: The proactively secure Unix-like operating system.
+
+ 8. Congratulations! You’re inside a remote computer!
+ 9. Type ftp https://sive.rs/ti.sh
+10. Type sh ti.sh
+11. Watch it install, answer its questions, and do what it says.
+12. Be ready to open a new terminal window, so you can leave this one
+ logged-in.
+13. See below for help with its prompts.
+
+Customize these instructions
+
+Enter your domain name and the username that you create, below, and this will
+customize all following instructions for you.
+
+Your domain name? [36][ ] Your username?
+[37][ ] [38][customize]
+Now when you see this button: 📋 click it to copy that line so you can paste it
+into your terminal, without error.
+
+Use your encrypted storage
+
+The [40]ti.sh script will eventually prompt you, “Now upload anything while I
+wait...”. Here’s how.
+
+Mac
+
+Type rsync -avz Documents yourusername@yourdomain.name:/mnt/ and you will see
+it uploading your Documents folder to your private encrypted storage. Use this
+same format to upload any other folders, replacing “Documents” in the command.
+If you are happy synchronizing on the command line like this, you can skip over
+the next FreeFileSync section.
+
+[41]FreeFileSync
+
+Everyone using Windows should use [42]FreeFileSync. Here’s how:
+
+ 1. [43]Download FreeFileSync and please give an optional donation there if you
+ can afford to. Donating also unlocks more features. Thanks to Jon Lis for
+ the recommendation.
+ 2. Install and open FreeFileSync.
+ 3. Top-center: click the grey [Browse] button and find the folder with the
+ stuff you want to upload.
+ 4. Top-far-right: click the white cloud icon then SFTP at the top.
+ 5. Server name or IP address: yourdomain.name
+ 6. Left side: click (*) Key File
+ 7. Username: yourusername
+ 8. Browse to find your private key, called id_ed25519 from the “[44]Create an
+ SSH key” section. (Not the file that ends in “.pub”, but the one next to
+ it.) NOTE: Because the /Users/yourusername/.ssh directory is “hidden” by
+ Windows and Mac by default, I find it easier to just type the path
+ directly, like this:
+ □ The username, for this next line, should be your username on your home
+ computer, not your remote server.
+ □ Windows? Type 📋C:\Users\yourusername\.ssh\id_ed25519
+ □ Mac? Type 📋/Users/yourusername/.ssh/id_ed25519
+ 9. Directory on server: /mnt
+10. Click OK to go back to the main screen.
+11. Top-right: click the green gear wheel.
+12. Left button: click “MIRROR →”
+13. Click OK to go back to the main screen.
+14. Top-center: click “COMPARE”, and make sure your files are there.
+15. Top-right: click “SYNCHRONIZE Mirror →” then [Start]
+
+Verify and unmount
+
+ 1. When it’s done uploading, log in to your server again, from your terminal.
+ 2. Type find /mnt
+ 3. You should see a long list of the files you uploaded.
+ 4. Type m-x to detach your encrypted storage.
+ 5. Type find /mnt again, and now you should see nothing there!
+ Congratulations! You now see how this will work in the future:
+ 1. Log in and type “m” to attach your encrypted storage.
+ 2. Upload your files with rsync or FreeFileSync.
+ 3. Log in and type “m-x” to detach the storage, for security.
+
+Contacts and Calendar
+
+Your phone currently keeps its contacts and calendars with Google or Apple. Now
+you can get them off the cloud and keep them privately on your own server.
+
+My [47]ti.sh setup script installs a [48]CardDAV server for contacts, and [49]
+CalDAV server for calendars.
+
+Here’s how to connect your phone.
+
+Android phone
+
+You need an app called “[50]DAVx⁵”, so [51]install it first. Then…
+
+ 1. Open the DAVx⁵ app
+ 2. Click the orange (+) in the bottom-right
+ 3. Click (·) “Login with URL and user name”
+ 4. Base URL: https://dav.yourdomain.name/
+ 5. User name: yourusername
+ 6. Password: the “easy to type on your phone” password you made
+ 7. Click “LOGIN” in the bottom-right corner.
+ 8. It should work and bring you to the “Create account” page, where “Account
+ name” will be yourusername. Leave everything as-is and click “CREATE
+ ACCOUNT” in the bottom-right corner.
+ 9. It brings you to the “CARDDAV” header. Tick the toggle to turn on next to
+ your domain name.
+10. Click the ♻ arrows in the bottom-right corner to synchronize your contacts.
+11. Click the “CALDAV” header up top. Tick the toggle to turn on next to your
+ domain name.
+12. Click the ♻ arrows in the bottom-right corner to synchronize your calendar.
+13. Go to your Calendar app, and in the top-right corner, click the round icon
+ there. (Might be your face or a letter.) Then change it to the one with
+ yourusername. After changing it, click the X in the top-left corner.
+14. To add a new Event, Click [+] in the bottom-right corner, and choose “Event
+ ” from the popup menu.
+15. There might be a warning, “Switch to a Google Account to take advantage
+ blah blah…”. Click “dismiss”.
+16. Title this event something like “Test Delete”, and notice it should be
+ saving to the calendar with your domain name and username. Click (Save) in
+ the top-right corner.
+17. Check the terminal window where it should say “Calendar entry added!”
+18. Go to your Contacts app, and in the bottom-right corner, click “Fix &
+ manage”.
+19. Click “Settings”
+20. Near the bottom, click “Default account for new contacts”, and change it to
+ the DAVx⁵ Address book with your domain name.
+21. Click “< Settings” in the top-left corner.
+22. In the top-right corner, click the round icon there. (Might be your face or
+ a letter.) Then change it to the DAVx⁵ Address book with your domain name.
+ Then click X in the top-left corner.
+23. Click “Contacts” in the bottom-left corner. It should say “No contacts in
+ this account”.
+24. Click + in the bottom-right corner to Create contact. Top of the next page
+ should say “Save to” then your domain name.
+25. Add a New Contact with a name like “Test Delete”. Then click “Save” in the
+ top-right corner.
+26. Check the terminal window where it should say “Contact added! Both work.
+ Congratulations.”
+
+Apple iPhone
+
+ 1. Settings → Contacts → Accounts → Add Account → Other → (under “CONTACTS”:)
+ Add CardDAV Account
+ 2. Server: dav.yourdomain.name
+ 3. User Name: yourusername
+ 4. Password: the “easy to type on your phone” password you made
+ 5. Click “next” in the top right corner, and it should bring you to your
+ “Accounts” page, where you see it listed, saying “Contacts” underneath.
+ 6. Click Add Account → Other → (under “CALENDARS”:) Add CalDAV Account
+ 7. Server: dav.yourdomain.name
+ 8. User Name: yourusername
+ 9. Password: the “easy to type on your phone” password you made
+10. Click “next” in the top right corner, and it should bring you to a “CalDAV”
+ page, showing Calendars and Reminders. Un-tick Reminders.
+11. Click “save” in the top right corner, and it should bring you to your
+ “Accounts” page, where you see it listed, saying “Calendars” underneath.
+12. Click “< Contacts” in the top-left corner, to go back to settings for your
+ Contacts app.
+13. At the bottom change Default Account to the one with yourdomain.name.
+14. Click “< Contacts” then “< Settings”, both in the top-left corner, then
+ scroll down to Calendar settings and click it.
+15. In Calendar settings, 2nd from the bottom should say “Default Calendar”.
+ Tap to change it to the one with yourdomain.name.
+16. Go to your Calendar app and click the + in the top-right corner.
+17. Add a New Event with a Title like “Test Delete”. Then click “Add” in the
+ top-right corner.
+18. Check the terminal window where it should say “Calendar entry added!”
+19. Go to your Contacts app and click the + in the top-right corner.
+20. Add a New Contact with a name like “Test Delete”. Then click “Done” in the
+ top-right corner.
+21. Check the terminal window where it should say “Contact added! Both work.
+ Congratulations.”
+
+Email sending
+
+ 1. Go to [52]Mailjet.com and sign up for their free account.
+ 2. Go to [53]this page for API keys and [Generate secret key]
+ 3. Give the [54]ti.sh script your API key and Secret key, and it will do the
+ rest.
+
+Email settings
+
+To do email from your phone, computer, or anywhere else, you now have an [55]
+IMAP server, called [56]Dovecot. So on any device, you can add a new IMAP Mail
+account, with these settings:
+
+ • Account type: IMAP
+ • Email address: yourusername@yourdomain.name
+ • Username: yourusername
+ • Password: the password you made for your username on your server
+ • Incoming mail server: yourdomain.name
+ • Outgoing mail server: yourdomain.name
+ • Connection security: SSL
+ • Authentication type: Basic authentication
+
+Simple website
+
+ 1. On your home computer, in your main home directory, make a directory/folder
+ called “htdocs”
+ 2. [57]Download this file called “template.html” and save it in your “htdocs”
+ directory.
+ 3. [58]Download this file called “style.css” and also save it in your “htdocs”
+ directory.
+ 4. Make a copy of the “template.html” file, and name the copy “index.html”.
+ This will be your home page.
+ 5. Edit the index.html file in a text editor (NotePad or TextEdit) and change
+ my default text to whatever you want.
+ 6. When you need to add a new page, just copy the template again, call it
+ “about.html” or whatever, and make a link to it from the home page. The
+ header of each page will link back to index.html : your home page.
+ 7. If you want to change the look of your site, just edit the style.css file.
+ [59]Search the web for “CSS tutorial” if needed.
+ 8. To upload it to your public server, do one of the next two steps:
+ 9. Apple Mac? Open a new terminal window on your computer, type
+ rsync -avz htdocs yourusername@yourdomain.name:/var/www/
+10. Windows? [60]FreeFileSync again, but now change the “Directory on server”
+ to /var/www/ (you can find it by clicking [browse] or typing it directly)
+ then upload this htdocs directory there.
+11. Go to https://yourdomain.name in your web browser, refresh the page, and
+ you should see your updated website.
+12. Any trouble, just know that the goal is to get that index.html file into
+ this location on your server: /var/www/htdocs/index.html because that’s
+ where the web server is expecting it to be. That’s where we put the
+ original test file, so your new index.html file should replace that one.
+13. If you want [61]short URLs, without the .html, you can (for everything
+ except index.html) because I set the default type to be HTML. Just remove
+ the “.html” from your HTML filenames, update your links, and voilà!
+
+It’s important to know how to make a simple website by hand, and not let people
+sell you on complex solutions that are the equivalent of saying you need a
+jumbo jet when you really need a bicycle. For real tech independence, start by
+typing your HTML files yourself. Only later, after you have many many pages,
+consider a more complicated solution.
+
+File sharing in /pub/
+
+Your website is configured to list all files in the /pub/ directory of your
+website. So basically anything in /var/www/htdocs/pub/ is public. Upload any
+files you want to share.
+
+It replaces Dropbox and similar services for sending big files. Just upload the
+file to /var/www/htdocs/pub/ then find it in your web browser, copy its URL,
+and send someone the URL.
+
+If the files you want to share are already on your computer, then just make a
+pub/ directory inside htdocs/ (so, htdocs/pub/), put your files in there, then
+use FreeFileSync or rsync to upload them as you did in the previous section
+called “[62]Simple website”. Consider them part of your website.
+
+Or if you have a URL from somewhere else online that you want to download to
+your server, just do it as we did in the numbered steps above. Then use
+FreeFileSync or rsync to download from your server to your computer first,
+before your next upload sync.
+
+More indie tips
+
+ 1. Use [63]Firefox.
+ 2. Install [64]uBlock Origin in Firefox and Chrome.
+ 3. In Firefox settings, under “Privacy and Security”, choose “[X] Delete
+ cookies and site data when Firefox is closed”, then close Firefox often to
+ erase all your cookies and logins. Browse the web anonymously, not
+ logged-in.
+ 4. Replace Google Authenticator with [65]Aegis on Android or [66]Raivo on
+ iPhone.
+ 5. If you use Windows, replace it with [67]Ubuntu Linux. (Use both at first,
+ then slowly transition.)
+ 6. Keep your new email address as a [68]private email account that you only
+ give to those few people who you really want to hear from. Then your old
+ gmail/yahoo/outlook/etc address can be just low-priority junk, and your new
+ private email account won’t need spam protection.
+ 7. Or if you don’t want to run your own email server, use [69]Mailbox.org or
+ [70]Fastmail but only by using your own domain name. Be yourusername@
+ yourdomain.name from now on. Don’t depend on anyone else’s domain for your
+ email or you’ll be stuck with them.
+
+More storage?
+
+If you need hundreds of gigabytes, or even terabytes of storage, I recommend
+Hetzner’s “[71]Storage Box”. It’s the best storage value I’ve found. Also
+consider [72]Backblaze Personal Backup.
+
+I personally use Vultr’s storage (as described above) for sensitive information
+I definitely want completely encrypted. Then I use Hetzner’s Storage Box for
+all my photos, videos, music, and other big files that don’t absolutely need to
+be encrypted.
+
+Mutt = email in the terminal
+
+Unless you want to read email directly on your server, skip this step.
+
+ 1. ssh in to your server, then type mutt
+ 2. You should see the subject headers, with the first email highlighted. Type
+ j and k a few times to go down and up the list of emails.
+ 3. To read an email, hit [enter] or [return] when it is highlighted.
+ 4. To go back to the list, type i (for “index”)
+ 5. To reply, hit r then:
+ □ It shows “To:” so you can edit or add recipients. Hit [enter] or
+ [return] to leave it.
+ □ It shows “Subject:” so you can edit the subject. Hit [enter] or
+ [return] to leave it.
+ □ It asks “Include message in reply? ([yes]/no/?):”. Hit [enter] or
+ [return] for the usual norm of echoing someone’s email back at them
+ below your reply. Or n for not.
+ □ Now you are inside the [73]vi text editor which is not
+ self-explanatory, so I’ll walk you through a simple reply:
+ □ Hit i (no [return] or [enter]) to go into “insert mode” and type your
+ message. You’ll notice it’s on the same line as some other text, so you
+ might want to start by hitting [return] or [enter] a few times, then
+ up-arrow to go back to the first line again.
+ □ When done typing your message, hit your [esc] key in the very top-left
+ corner of your keyboard. Nothing will change on the screen, yet.
+ □ Type :wq (the “:” at the beginning is important) then [enter] or
+ [return].
+ □ Then you’ll see the “Compose Menu” which I think of as the “last chance
+ before sending” screen. Hit y to send it.
+ 6. To send a new email, hit m then repeat those steps like you did for a
+ reply, except now the “To:” and “Subject:” are blank and waiting for you to
+ create. (For “To:”, type the email address of the person you’re emailing.)
+ 7. To quit, hit q
+
+[74]Mutt is a great program for reading and sending email on the command line.
+It’s been my email client for 20 years. [75]Read its manual here if you want to
+go deeper. It does everything.
+
+The [76]vi text editor is a useful tool to edit text on a server. It takes a
+few minutes to learn, but it’s worth learning because it’s installed by default
+on every Linux/BSD server.
+
+Upkeep
+
+You honestly don’t have to do anything to maintain your server. It will just
+work as-is for decades! But if you like to keep it up-to-date, it only takes a
+minute, so run these next steps any time.
+
+ 1. Log in to your server, if you are not already.
+ 2. Type 📋doas su
+ 3. Type 📋syspatch
+ 4. Type 📋fw_update
+ 5. Type 📋pkg_add -u
+ 6. Type 📋sysupgrade
+ 7. Type exit; exit to log out.
+
+If that last “sysupgrade” step did not give an “Error retrieving … 404 Not
+Found” error, that means your OpenBSD operating system is upgrading itself.
+They release an upgrade every 6 months. In that case, [82]go to this OpenBSD
+page and follow the link at the top that says “Upgrading to (7.4, etc)” to see
+if there’s anything else you should know.
+
+If the “sysupgrade” step updated your operating system and your server
+rebooted, then there is just one more step:
+
+ 1. Log in to your server, if you are not already.
+ 2. Type 📋doas su
+ 3. Type 📋sysmerge
+ 4. Follow any instructions. Don’t worry about messing up because you can
+ always start over, as described below.
+ 5. Re-do the syspatch ; fw_update ; pkg_add -u steps, above.
+ 6. Type exit; exit to log out.
+
+Secure certificate expired?
+
+ 1. Log in to your server, if you are not already.
+ 2. Type 📋doas su
+ 3. Type 📋domain=yourdomain.name
+ 4. Type 📋acme-client -v $domain
+ 5. Type 📋rcctl restart relayd
+ 6. That should fix it. Confirm it in your web browser. [89]Let me know if not.
+ 7. IMPORTANT: Copy-paste this next line to make it renew automatically from
+ now on:
+ 8. 📋(crontab -l 2>/dev/null; echo "11\t3\t*\t*\t5\tacme-client $domain \&\&
+ rcctl reload relayd") | crontab -
+ 9. Hit [enter]. Type exit; exit to log out.
+10. [91]Let me know if it happens again. (It shouldn’t.)
+
+Trouble? Start over
+
+I’ve tested the steps above very carefully and repeatedly. They work. So if you
+hit a major problem, something not happening like it says it should, please do
+this:
+
+ 1. Type “cd ; m-x ; exit” in any terminals you still have open, until they are
+ all closed.
+ 2. Go to [92]your Vultr account.
+ 3. See your server instance? See to the far right, a subtle ···? Click that.
+ 4. From its pop-up menu, click the last option: “Server Destroy”.
+ 5. Tick the box next to “[X] Yes, destroy this server.”
+ 6. Click the big red [Destroy Server] button.
+ 7. This will not destroy your encrypted storage. That’s another reason we kept
+ it separate from the start. So if you already uploaded a bunch of your
+ files and want to save them, they should still be there.
+ 8. On your own computer, in the terminal, type: rm .ssh/known_hosts
+ 9. Go back to the section called “[93]Create your server” and try again.
+
+Questions? Additions?
+
+To learn more about your new server, just log in and type: [94]help
+It will teach you the basics. Then for each command or file you want to know
+more about, type [95]man followed by the command or filename. So for example,
+log in and type…
+
+ • man [96]adduser
+ • man [97]ssh
+ • man [98]doas
+ • man [99]rcctl
+ • man [100]pkg_add
+ • man [101]ftp
+ • man [102]httpd.conf
+
+Hit your [space] bar to scroll the page, then q to quit.
+
+It’s one of the most wonderful things about OpenBSD: everything you need to
+know is in those man pages! No need for YouTube, Google, ChatGPT, or any other
+advertising-driven sources of information.
+
+I will constantly improve this page, so [103]get on my private email list for
+updates.
+
+Until then, ask any questions. If something went wrong, please give me a very
+specific description of exactly what went wrong at what step, what it was
+supposed to do, and what exactly it actually did. [104]Click here to email me.
+
+Requests for what to add? Again, just [105]email me.
+
+
+References:
+
+[1] https://sive.rs/
+[2] https://sive.rs/ti#why
+[3] https://sive.rs/ti#register
+[4] https://sive.rs/ti#dns0
+[5] https://sive.rs/ti#storage1
+[6] https://sive.rs/ti#ssh
+[7] https://sive.rs/ti#server1
+[8] https://sive.rs/ti#server2
+[9] https://sive.rs/ti#custom
+[10] https://sive.rs/ti#storage4
+[11] https://sive.rs/ti#radicale
+[12] https://sive.rs/ti#mailjet
+[13] https://sive.rs/ti#mail3
+[14] https://sive.rs/ti#web1
+[15] https://sive.rs/ti#web2
+[16] https://sive.rs/ti#indie
+[17] https://sive.rs/ti#storage5
+[18] https://sive.rs/ti#mutt
+[19] https://sive.rs/ti#upkeep
+[20] https://sive.rs/ti#cert
+[21] https://sive.rs/ti#redo
+[22] https://sive.rs/ti#questions
+[23] https://sive.rs/openbsd
+[24] https://www.vultr.com/?ref=9541378-8H
+[25] https://porkbun.com/
+[26] https://www.vultr.com/?ref=6930328
+[27] https://my.vultr.com/blockstorage/add/
+[28] https://my.vultr.com/blockstorage/add/
+[29] https://sive.rs/ti#server1
+[30] https://www.vultr.com/?ref=6930328
+[31] https://my.vultr.com/deploy/
+[32] https://my.vultr.com/deploy/
+[33] https://sive.rs/ti#ssh
+[34] https://sive.rs/ti#server1
+[35] https://sive.rs/ti#ssh
+[40] https://sive.rs/ti.sh
+[41] https://freefilesync.org/
+[42] https://freefilesync.org/
+[43] https://freefilesync.org/download.php
+[44] https://sive.rs/ti#ssh
+[47] https://sive.rs/ti.sh
+[48] https://en.wikipedia.org/wiki/CardDAV
+[49] https://en.wikipedia.org/wiki/CalDAV
+[50] https://www.davx5.com/
+[51] https://www.davx5.com/download
+[52] https://app.mailjet.com/signup?lang=en_US
+[53] https://app.mailjet.com/account/apikeys
+[54] https://sive.rs/ti.sh
+[55] https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol
+[56] https://www.dovecot.org/
+[57] https://sive.rs/file/template.html
+[58] https://sive.rs/file/style.css
+[59] https://duckduckgo.com/?q=css+tutorial
+[60] https://freefilesync.org/
+[61] https://sive.rs/su
+[62] https://sive.rs/ti#web1
+[63] https://www.mozilla.org/firefox/
+[64] https://ublockorigin.com/
+[65] https://getaegis.app/
+[66] https://raivo-otp.com/
+[67] https://ubuntu.com/desktop
+[68] https://sive.rs/pe
+[69] https://mailbox.org/
+[70] https://www.fastmail.com/
+[71] https://www.hetzner.com/storage/storage-box
+[72] https://www.backblaze.com/cloud-backup/personal
+[73] https://duckduckgo.com/?q=vi+editor
+[74] http://mutt.org/
+[75] http://mutt.org/doc/manual/
+[76] https://duckduckgo.com/?q=vi+editor
+[82] https://www.openbsd.org/faq/
+[89] https://sive.rs/contact
+[91] https://sive.rs/contact
+[92] https://my.vultr.com/
+[93] https://sive.rs/ti#server1
+[94] https://man.openbsd.org/help
+[95] https://man.openbsd.org/man.1
+[96] https://man.openbsd.org/adduser.8
+[97] https://man.openbsd.org/ssh.1
+[98] https://man.openbsd.org/doas.1
+[99] https://man.openbsd.org/rcctl.8
+[100] https://man.openbsd.org/pkg_add.1
+[101] https://man.openbsd.org/ftp.1
+[102] https://man.openbsd.org/httpd.conf.5
+[103] https://sive.rs/contact
+[104] https://sive.rs/contact
+[105] https://sive.rs/contact
diff --git a/static/archive/softwarecrisis-dev-7c7z9g.txt b/static/archive/softwarecrisis-dev-7c7z9g.txt
index a37f57e..d24a8b5 100644
--- a/static/archive/softwarecrisis-dev-7c7z9g.txt
+++ b/static/archive/softwarecrisis-dev-7c7z9g.txt
@@ -1,1068 +1,1022 @@
- #[1]Out of the Software Crisis (Newsletter) [2]Out of the Software
- Crisis (Newsletter)
-
- [3]Out of the Software Crisis
-
- Bird flying logo [4]Newsletter [5]Book [6]AI Book [7]Archive [8]Author
+[1]Out of the Software Crisis Bird flying logo [2]Newsletter [3]Book [4]AI Book
+[5]Archive [6]Author
Modern software quality, or why I think using language models for programming
is a bad idea
- By Baldur Bjarnason,
- May 30th, 2023
+By Baldur Bjarnason,
+May 30th, 2023
- This essay is based on a talk I gave at [9]Hakkavélin, a hackerspace in
- Reykjavík. I had a wonderful time presenting to a lovely crowd, full of
- inquisitive and critically-minded people. Their questions and the
- discussion afterwards led to a number of improvements and
- clarifications as I turned my notes into this letter. This resulted in
- a substantial expansion of this essay. Many of the expanded points,
- such as the ones surrounding language model security, come directly
- from these discussions.
+This essay is based on a talk I gave at [7]Hakkavélin, a hackerspace in
+Reykjavík. I had a wonderful time presenting to a lovely crowd, full of
+inquisitive and critically-minded people. Their questions and the discussion
+afterwards led to a number of improvements and clarifications as I turned my
+notes into this letter. This resulted in a substantial expansion of this essay.
+Many of the expanded points, such as the ones surrounding language model
+security, come directly from these discussions.
- Many thanks to all of those who attended. The references for the
- presentation are also the references for this essay, which you can find
- all the way down in the footnotes section.
+Many thanks to all of those who attended. The references for the presentation
+are also the references for this essay, which you can find all the way down in
+the footnotes section.
- The best way to support this newsletter or my blog is to buy one of my
- books, [10]The Intelligence Illusion: a practical guide to the business
- risks of Generative AI or [11]Out of the Software Crisis. Or, you can
- buy them both [12]as a bundle.
+The best way to support this newsletter or my blog is to buy one of my books,
+[8]The Intelligence Illusion: a practical guide to the business risks of
+Generative AI or [9]Out of the Software Crisis. Or, you can buy them both [10]
+as a bundle.
The software industry is very bad at software
- Here’s a true story. Names withheld to protect the innocent.
+Here’s a true story. Names withheld to protect the innocent.
- A chain of stores here in Iceland recently upgraded their point-of-sale
- terminals to use new software.
+A chain of stores here in Iceland recently upgraded their point-of-sale
+terminals to use new software.
- Disaster, obviously, ensued. The barcode scanner stopped working
- properly, leading customer to be either overcharged or undercharged.
- Everything was extremely slow. The terminals started to lock up
- regularly. The new invoice printer sucked. A process that had been
- working smoothly was now harder and took more time.
+Disaster, obviously, ensued. The barcode scanner stopped working properly,
+leading customer to be either overcharged or undercharged. Everything was
+extremely slow. The terminals started to lock up regularly. The new invoice
+printer sucked. A process that had been working smoothly was now harder and
+took more time.
- The store, where my “informant” is a manager, deals with a lot of
- businesses, many of them stores. When they explain to their customers
- why everything is taking so long, their answer is generally the same:
+The store, where my “informant” is a manager, deals with a lot of businesses,
+many of them stores. When they explain to their customers why everything is
+taking so long, their answer is generally the same:
- “Ah, software upgrade. The same happened to us when we upgraded our
- terminals.”
+“Ah, software upgrade. The same happened to us when we upgraded our terminals.”
- This is the norm.
+This is the norm.
- The new software is worse in every way than what it’s replacing.
- Despite having a more cluttered UI, it seems to have omitted a bunch of
- important features. Despite being new and “optimised”, it’s
- considerably slower than what it’s replacing.
+The new software is worse in every way than what it’s replacing. Despite having
+a more cluttered UI, it seems to have omitted a bunch of important features.
+Despite being new and “optimised”, it’s considerably slower than what it’s
+replacing.
- This is also the norm.
+This is also the norm.
- Switching costs are, more often than not, massive for business
- software, and purchases are not decided by anybody who actually uses
- it. The quality of the software disconnects from sales performance very
- quickly in a growing software company. The company ends up “owning” the
- customer and no longer has any incentive to improve the software. In
- fact, because adding features is a key marketing and sales tactic, the
- software development cycle becomes an act of intentional, controlled
- deterioration.
+Switching costs are, more often than not, massive for business software, and
+purchases are not decided by anybody who actually uses it. The quality of the
+software disconnects from sales performance very quickly in a growing software
+company. The company ends up “owning” the customer and no longer has any
+incentive to improve the software. In fact, because adding features is a key
+marketing and sales tactic, the software development cycle becomes an act of
+intentional, controlled deterioration.
- Enormous engineering resources go into finding new ways to minimise the
- deterioration—witness Microsoft’s “ribbon menu”, a widget invented
- entirely to manage the feature escalation mandated by marketing.
+Enormous engineering resources go into finding new ways to minimise the
+deterioration—witness Microsoft’s “ribbon menu”, a widget invented entirely to
+manage the feature escalation mandated by marketing.
- This is the norm.
+This is the norm.
- This has always been the norm, from the early days of software.
+This has always been the norm, from the early days of software.
- The software industry is bad at software. Great at shipping features
- and selling software. Bad at the software itself.
+The software industry is bad at software. Great at shipping features and
+selling software. Bad at the software itself.
Why I started researching “AI” for programming
- In most sectors of the software industry, sales performance and product
- quality are disconnected.
+In most sectors of the software industry, sales performance and product quality
+are disconnected.
- By its nature software has enormous margins which further cushion it
- from the effect of delivering bad products.
+By its nature software has enormous margins which further cushion it from the
+effect of delivering bad products.
- The objective impact of poor software quality on the bottom lines of
- companies like Microsoft, Google, Apple, Facebook, or the retail side
- of Amazon is a rounding error. The rest only need to deliver usable
- early versions, but once you have an established customer base and an
- experienced sales team, you can coast for a long, long time without
- improving your product in any meaningful way.
+The objective impact of poor software quality on the bottom lines of companies
+like Microsoft, Google, Apple, Facebook, or the retail side of Amazon is a
+rounding error. The rest only need to deliver usable early versions, but once
+you have an established customer base and an experienced sales team, you can
+coast for a long, long time without improving your product in any meaningful
+way.
- You only need to show change. Improvements don’t sell, it’s freshness
- that moves product. It’s like store tomatoes. Needs to look good and be
- fresh. They’re only going to taste it after they’ve paid, so who cares
- about the actual quality.
+You only need to show change. Improvements don’t sell, it’s freshness that
+moves product. It’s like store tomatoes. Needs to look good and be fresh.
+They’re only going to taste it after they’ve paid, so who cares about the
+actual quality.
- Uptime reliability is the only quality measurement with a real impact
- on ad revenue or the success of enterprise contracts, so that’s the
- only quality measurement that ultimately matters to them.
+Uptime reliability is the only quality measurement with a real impact on ad
+revenue or the success of enterprise contracts, so that’s the only quality
+measurement that ultimately matters to them.
- Bugs, shoddy UX, poor accessibility—even when accessibility is required
- by law—are non-factors in modern software management, especially at
- larger software companies.
+Bugs, shoddy UX, poor accessibility—even when accessibility is required by
+law—are non-factors in modern software management, especially at larger
+software companies.
- The rest of us in the industry then copy their practices, and we mostly
- get away with it. Our margins may not be as enormous as Google’s, but
- they are still quite good compared to non-software industries.
+The rest of us in the industry then copy their practices, and we mostly get
+away with it. Our margins may not be as enormous as Google’s, but they are
+still quite good compared to non-software industries.
- We have an industry that’s largely disconnected from the consequences
- of making bad products, which means that we have a lot of successful
- but bad products.
+We have an industry that’s largely disconnected from the consequences of making
+bad products, which means that we have a lot of successful but bad products.
- The software crisis
+The software crisis
- Research bears this out. I pointed out in my 2021 essay [13]Software
- Crisis 2.0 that very few non-trivial software projects are successful,
- even when your benchmarks are fundamentally conservative and short
- term.
+Research bears this out. I pointed out in my 2021 essay [11]Software Crisis 2.0
+that very few non-trivial software projects are successful, even when your
+benchmarks are fundamentally conservative and short term.
- For example, the following table is from [14]a 2015 report by the
- Standish Group on their long term study in software project success:
+For example, the following table is from [12]a 2015 report by the Standish
+Group on their long term study in software project success:
- SUCCESSFUL CHALLENGED FAILED TOTAL
- Grand 6% 51% 43% 100%
- Large 11% 59% 30% 100%
- Medium 12% 62% 26% 100%
- Moderate 24% 64% 12% 100%
- Small 61% 32% 7% 100%
+ SUCCESSFUL CHALLENGED FAILED TOTAL
+ Grand 6% 51% 43% 100%
+ Large 11% 59% 30% 100%
+ Medium 12% 62% 26% 100%
+Moderate 24% 64% 12% 100%
+ Small 61% 32% 7% 100%
- The Chaos Report 2015 resolution by project size
+The Chaos Report 2015 resolution by project size
- This is based on data that’s collected and anonymised from a number of
- organisations in a variety of industries. You’ll note that very few
- projects outright succeed. Most of them go over budget or don’t deliver
- the functionality they were supposed to. A frightening number of large
- projects outright fail to ship anything usable.
+This is based on data that’s collected and anonymised from a number of
+organisations in a variety of industries. You’ll note that very few projects
+outright succeed. Most of them go over budget or don’t deliver the
+functionality they were supposed to. A frightening number of large projects
+outright fail to ship anything usable.
- In my book [15]Out of the Software Crisis, I expanded on this by
- pointing out that there are many classes and types of bugs and defects
- that we don’t measure at all, many of them catastrophic, which means
- that these estimates are conservative. Software project failure is
- substantially higher than commonly estimated, and success if much rarer
- than the numbers would indicate.
+In my book [13]Out of the Software Crisis, I expanded on this by pointing out
+that there are many classes and types of bugs and defects that we don’t measure
+at all, many of them catastrophic, which means that these estimates are
+conservative. Software project failure is substantially higher than commonly
+estimated, and success if much rarer than the numbers would indicate.
- The true percentage of large software projects that are genuinely
- successful in the long term—that don’t have any catastrophic bugs,
- don’t suffer from UX deterioration, don’t end up having core issues
- that degrade their business value—is probably closer to 1–3%.
+The true percentage of large software projects that are genuinely successful in
+the long term—that don’t have any catastrophic bugs, don’t suffer from UX
+deterioration, don’t end up having core issues that degrade their business
+value—is probably closer to 1–3%.
- The management crisis
+The management crisis
- We also have a management crisis.
+We also have a management crisis.
- The methods of top-down-control taught to managers are
- counterproductive for software development.
- * Managers think design is about decoration when it’s the key to
- making software that generates value.
- * Trying to prevent projects that are likely to fail is harmful for
- your career, even if the potential failure is wide-ranging and
- potentially catastrophic.
- * When projects fail, it’s the critics who tried to prevent disaster
- who are blamed, not the people who ran it into the ground.
- * Supporting a project that is guaranteed to fail is likely to
- benefit your career, establish you as a “team player”, and protects
- you from harmful consequences when the project crashes.
- * Teams and staff management in the software industry commonly
- ignores every innovation and discovery in organisational
- psychology, management, and systems-thinking since the early
- sixties and operate mostly on management ideas that Henry Ford
- considered outdated in the 1920s.
+The methods of top-down-control taught to managers are counterproductive for
+software development.
- We are a mismanaged industry that habitually fails to deliver usable
- software that actually solves the problems it’s supposed to.
+ • Managers think design is about decoration when it’s the key to making
+ software that generates value.
+ • Trying to prevent projects that are likely to fail is harmful for your
+ career, even if the potential failure is wide-ranging and potentially
+ catastrophic.
+ • When projects fail, it’s the critics who tried to prevent disaster who are
+ blamed, not the people who ran it into the ground.
+ • Supporting a project that is guaranteed to fail is likely to benefit your
+ career, establish you as a “team player”, and protects you from harmful
+ consequences when the project crashes.
+ • Teams and staff management in the software industry commonly ignores every
+ innovation and discovery in organisational psychology, management, and
+ systems-thinking since the early sixties and operate mostly on management
+ ideas that Henry Ford considered outdated in the 1920s.
- Thus, [16]Weinberg’s Law:
+We are a mismanaged industry that habitually fails to deliver usable software
+that actually solves the problems it’s supposed to.
- If builders built buildings the way programmers wrote programs, then
- the first woodpecker that came along would destroy civilization.
+Thus, [14]Weinberg’s Law:
- It’s into this environment that “AI” software development tools appear.
+ If builders built buildings the way programmers wrote programs, then the
+ first woodpecker that came along would destroy civilization.
- The punditry presented it as a revolutionary improvement in how we make
- software. It’s supposed to fix everything.
+It’s into this environment that “AI” software development tools appear.
- —This time the silver bullet will work!
+The punditry presented it as a revolutionary improvement in how we make
+software. It’s supposed to fix everything.
- Because, of course, we have had such a great track record with
- [17]silver bullets.
+—This time the silver bullet will work!
- So, I had to dive into it, research it, and figure out how it really
- worked. I needed to understand how generative AI works, as a system. I
- haven’t researched any single topic to this degree since I finished my
- PhD in 2006.
+Because, of course, we have had such a great track record with [15]silver
+bullets.
- This research led me to write my book [18]The Intelligence Illusion: a
- practical guide to the business risks of Generative AI. In it, I take a
- broader view and go over the risks I discovered that come with business
- use of generative AI.
+So, I had to dive into it, research it, and figure out how it really worked. I
+needed to understand how generative AI works, as a system. I haven’t researched
+any single topic to this degree since I finished my PhD in 2006.
- But, ultimately, all that work was to answer the one question that I
- was ultimately interested in:
+This research led me to write my book [16]The Intelligence Illusion: a
+practical guide to the business risks of Generative AI. In it, I take a broader
+view and go over the risks I discovered that come with business use of
+generative AI.
- Is generative AI good or bad for software development?
+But, ultimately, all that work was to answer the one question that I was
+ultimately interested in:
- To even have a hope of answering this, we first need to define our
- terms, because the conclusion is likely to vary a lot depending on how
- you define “AI” or even "software development.
+Is generative AI good or bad for software development?
- A theory of software development as an inclusive system
+To even have a hope of answering this, we first need to define our terms,
+because the conclusion is likely to vary a lot depending on how you define “AI”
+or even "software development.
- Software development is the entire system of creating, delivering, and
- using a software project, from idea to end-user.
+A theory of software development as an inclusive system
- That includes the entire process on the development side—the idea,
- planning, management, design, collaboration, programming, testing,
- prototyping—as well as the value created by the system when it has been
- shipped and is being used.
+Software development is the entire system of creating, delivering, and using a
+software project, from idea to end-user.
- My model is that of [19]theory-building. From my essay on
- theory-building, which itself is an excerpt from [20]Out of the
- Software Crisis:
+That includes the entire process on the development side—the idea, planning,
+management, design, collaboration, programming, testing, prototyping—as well as
+the value created by the system when it has been shipped and is being used.
- Beyond that, software is a theory. It’s a theory about a particular
- solution to a problem. Like the proverbial garden, it is composed of
- a microscopic ecosystem of artefacts, each of whom has to be treated
- like a living thing. The gardener develops a sense of how the parts
- connect and affect each other, what makes them thrive, what kills
- them off, and how you prompt them to grow. The software project and
- its programmers are an indivisible and organic entity that our
- industry treats like a toy model made of easily replaceable lego
- blocks. They believe a software project and its developers can be
- broken apart and reassembled without dying.
+My model is that of [17]theory-building. From my essay on theory-building,
+which itself is an excerpt from [18]Out of the Software Crisis:
- What keeps the software alive are the programmers who have an
- accurate mental model (theory) of how it is built and works. That
- mental model can only be learned by having worked on the project
- while it grew or by working alongside somebody who did, who can help
- you absorb the theory. Replace enough of the programmers, and their
- mental models become disconnected from the reality of the code, and
- the code dies. That dead code can only be replaced by new code that
- has been ‘grown’ by the current programmers.
+ Beyond that, software is a theory. It’s a theory about a particular
+ solution to a problem. Like the proverbial garden, it is composed of a
+ microscopic ecosystem of artefacts, each of whom has to be treated like a
+ living thing. The gardener develops a sense of how the parts connect and
+ affect each other, what makes them thrive, what kills them off, and how you
+ prompt them to grow. The software project and its programmers are an
+ indivisible and organic entity that our industry treats like a toy model
+ made of easily replaceable lego blocks. They believe a software project and
+ its developers can be broken apart and reassembled without dying.
- Design and user research is an integral part of the mental model the
- programmer needs to build, because none of the software components
- ultimately make sense without the end-user.
+ What keeps the software alive are the programmers who have an accurate
+ mental model (theory) of how it is built and works. That mental model can
+ only be learned by having worked on the project while it grew or by working
+ alongside somebody who did, who can help you absorb the theory. Replace
+ enough of the programmers, and their mental models become disconnected from
+ the reality of the code, and the code dies. That dead code can only be
+ replaced by new code that has been ‘grown’ by the current programmers.
- But, design is also vital because it is, to reuse Donald G.
- Reinertsen’s definition from Managing the Design Factory (p. 11),
- design is economically useful information that generally only becomes
- useful information through validation of some sort. Otherwise it’s just
- a guess.
+Design and user research is an integral part of the mental model the programmer
+needs to build, because none of the software components ultimately make sense
+without the end-user.
- The economic part usually comes from the end-user in some way.
+But, design is also vital because it is, to reuse Donald G. Reinertsen’s
+definition from Managing the Design Factory (p. 11), design is economically
+useful information that generally only becomes useful information through
+validation of some sort. Otherwise it’s just a guess.
- This systemic view is inclusive by design as you can’t accurately
- measure the productivity or quality of a software project unless you
- look at it end to end, from idea to end-user.
- * If it doesn’t work for the end-user, then it’s a failure.
- * If the management is dysfunctional, then the entire system is
- dysfunctional.
- * If you keep starting projects based on unworkable ideas, then your
- programmer productivity doesn’t matter.
+The economic part usually comes from the end-user in some way.
- Lines of code isn’t software development. Working software,
- productively used, understood by the developers, is software
- development.
+This systemic view is inclusive by design as you can’t accurately measure the
+productivity or quality of a software project unless you look at it end to end,
+from idea to end-user.
+
+ • If it doesn’t work for the end-user, then it’s a failure.
+ • If the management is dysfunctional, then the entire system is
+ dysfunctional.
+ • If you keep starting projects based on unworkable ideas, then your
+ programmer productivity doesn’t matter.
+
+Lines of code isn’t software development. Working software, productively used,
+understood by the developers, is software development.
A high-level crash course in language models
- Language models, small or large, are today either used as autocomplete
- copilots or as chatbots. Some of these language model tools would be
- used by the developer, some by the manager or other staff.
+Language models, small or large, are today either used as autocomplete copilots
+or as chatbots. Some of these language model tools would be used by the
+developer, some by the manager or other staff.
- I’m treating generative media and image models as a separate topic,
- even when they’re used by people in the software industry to generate
- icons, graphics, or even UIs. They matter as well, but don’t have the
- same direct impact on software quality.
+I’m treating generative media and image models as a separate topic, even when
+they’re used by people in the software industry to generate icons, graphics, or
+even UIs. They matter as well, but don’t have the same direct impact on
+software quality.
- To understand the role these systems could play in software
- development, we need a little bit more detail on what language models
- are, how they are made, and how they work.
+To understand the role these systems could play in software development, we
+need a little bit more detail on what language models are, how they are made,
+and how they work.
- Most modern machine learning models are layered networks of parameters,
- each representing its connection to its neighbouring parameters. In a
- modern transformer-based language model most of these parameters are
- floating point numbers—weights—that describe the connection. Positive
- numbers are an excitatory connection. Negative numbers are inhibitory.
+Most modern machine learning models are layered networks of parameters, each
+representing its connection to its neighbouring parameters. In a modern
+transformer-based language model most of these parameters are floating point
+numbers—weights—that describe the connection. Positive numbers are an
+excitatory connection. Negative numbers are inhibitory.
- These models are built by feeding data through a tokeniser that breaks
- text into tokens—often one word per token—that are ultimately fed into
- an algorithm. That algorithm constructs the network, node by node,
- layer by layer, based on the relationships it calculates between the
- tokens/words. This is done in several runs and, usually, the developer
- of the model will evaluate after each run that the model is progressing
- in the right direction, with some doing more thorough evaluation at
- specific checkpoints.
+These models are built by feeding data through a tokeniser that breaks text
+into tokens—often one word per token—that are ultimately fed into an algorithm.
+That algorithm constructs the network, node by node, layer by layer, based on
+the relationships it calculates between the tokens/words. This is done in
+several runs and, usually, the developer of the model will evaluate after each
+run that the model is progressing in the right direction, with some doing more
+thorough evaluation at specific checkpoints.
- The network is, in a very fundamental way, a mathematical derivation of
- the language in the data.
+The network is, in a very fundamental way, a mathematical derivation of the
+language in the data.
- A language model is constructed from the data. The transformer code
- regulates and guides the process, but the distributions within the data
- set are what defines the network.
+A language model is constructed from the data. The transformer code regulates
+and guides the process, but the distributions within the data set are what
+defines the network.
- This process takes time—both collecting and managing the data set and
- the build process itself—which inevitably introduces a cut-off point
- for the data set. For OpenAI and Anthropic, that cut-off point is in
- 2021. For Google’s PaLM2 it’s early 2023.
- __________________________________________________________________
+This process takes time—both collecting and managing the data set and the build
+process itself—which inevitably introduces a cut-off point for the data set.
+For OpenAI and Anthropic, that cut-off point is in 2021. For Google’s PaLM2
+it’s early 2023.
- Aside: not a brain
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- This is very, very different from how a biological neural network
- interacts with data. A biological brain is modified by input and
- data—its environment—but its construction is derived from nutrition,
- its chemical environment, and genetics.
+Aside: not a brain
- The data set, conversely, is a deep and fundamental part of the
- language model. The algorithm’s code provides the process while the
- weights themselves are derived from the data, and the model itself is
- dead and static during input and output.
+This is very, very different from how a biological neural network interacts
+with data. A biological brain is modified by input and data—its environment—but
+its construction is derived from nutrition, its chemical environment, and
+genetics.
- The construction process of a neural network is called “training”,
- which is yet another incredibly inaccurate term used by the industry.
- * A pregnant mother isn’t “training” the fetus.
- * A language model isn’t “trained” from the data, but constructed.
+The data set, conversely, is a deep and fundamental part of the language model.
+The algorithm’s code provides the process while the weights themselves are
+derived from the data, and the model itself is dead and static during input and
+output.
- This is nonsense.
+The construction process of a neural network is called “training”, which is yet
+another incredibly inaccurate term used by the industry.
- But this is the term that the AI industry uses, so we’re stuck with it.
+ • A pregnant mother isn’t “training” the fetus.
+ • A language model isn’t “trained” from the data, but constructed.
- A language model is a mathematical model built as a derivation of its
- training data. There is no actual training, only construction.
+This is nonsense.
- This is also why it’s inaccurate to say that these systems are inspired
- by their training data. Even though genes and nutrition make an
- artist’s mind they are not in what any reasonable person would call
- “their inspiration”. Even when they are sought out for study and
- genuine inspiration, it’s our representations of our understanding of
- the genes that are the true source of inspiration. Nobody sticks their
- hand in a gelatinous puddle of DNA and spontaneously gets inspired by
- the data it encodes.
+But this is the term that the AI industry uses, so we’re stuck with it.
- Training data are construction materials for a language models. A
- language model can never be inspired. It is itself a cultural artefact
- derived from other cultural artefacts.
+A language model is a mathematical model built as a derivation of its training
+data. There is no actual training, only construction.
- The machine learning process is loosely based on decades-old grossly
- simplified models of how brains work.
+This is also why it’s inaccurate to say that these systems are inspired by
+their training data. Even though genes and nutrition make an artist’s mind they
+are not in what any reasonable person would call “their inspiration”. Even when
+they are sought out for study and genuine inspiration, it’s our representations
+of our understanding of the genes that are the true source of inspiration.
+Nobody sticks their hand in a gelatinous puddle of DNA and spontaneously gets
+inspired by the data it encodes.
- A biological neuron is a complex system in its own right—one of the
- more complex cells in an animal’s body. In a living brain, a biological
- neuron will use electricity, multiple different classes of
- neurotransmitters, and timing to accomplish its function in ways that
- we still don’t fully understand. It even has its own [21]built-in
- engine for chemical energy.
+Training data are construction materials for a language models. A language
+model can never be inspired. It is itself a cultural artefact derived from
+other cultural artefacts.
- The brain as a whole is composed of not just a massive neural network,
- but also layers of hormonal chemical networks that dynamically modify
- its function, both granularly and as a whole.
+The machine learning process is loosely based on decades-old grossly simplified
+models of how brains work.
- The digital neuron—a single signed floating point number—is to a
- biological neuron what a flat-head screwdriver is to a Tesla.
+A biological neuron is a complex system in its own right—one of the more
+complex cells in an animal’s body. In a living brain, a biological neuron will
+use electricity, multiple different classes of neurotransmitters, and timing to
+accomplish its function in ways that we still don’t fully understand. It even
+has its own [19]built-in engine for chemical energy.
- They both contain metal and that’s about the extent of their
- similarity.
+The brain as a whole is composed of not just a massive neural network, but also
+layers of hormonal chemical networks that dynamically modify its function, both
+granularly and as a whole.
- The human brain contains roughly 100 billion neuron cells, a layered
- chemical network, and a cerebrovascular system that all integrate as a
- whole to create a functioning, self-aware system capable of general
- reasoning and autonomous behaviour. This system is multiple orders of
- magnitude more complex than even the largest language model to date,
- both in terms of individual neuron structure, and taken as a whole.
+The digital neuron—a single signed floating point number—is to a biological
+neuron what a flat-head screwdriver is to a Tesla.
- It’s important to remember this so that we don’t fall for marketing
- claims that constantly imply that these tools are fully functioning
- assistants.
- __________________________________________________________________
+They both contain metal and that’s about the extent of their similarity.
- The prompt
+The human brain contains roughly 100 billion neuron cells, a layered chemical
+network, and a cerebrovascular system that all integrate as a whole to create a
+functioning, self-aware system capable of general reasoning and autonomous
+behaviour. This system is multiple orders of magnitude more complex than even
+the largest language model to date, both in terms of individual neuron
+structure, and taken as a whole.
- After all of this, we have a data set which can be used to generate
- text in response to prompts.
+It’s important to remember this so that we don’t fall for marketing claims that
+constantly imply that these tools are fully functioning assistants.
- Prompts such as:
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Who was the first man on the moon?
+The prompt
- The input phrase, or prompt, has no structure beyond the linguistic.
- It’s just a blob of text. You can’t give the model commands or
- parameters separately from other input. Because of this, if your model
- lets a third party enter text, an attacker will always be able to
- bypass whatever restrictions you put on it. Control prompts or prefixes
- will be discovered and countermanded. Delimiters don’t work.
- Fine-tuning the model only limits the harm, but doesn’t prevent it.
+After all of this, we have a data set which can be used to generate text in
+response to prompts.
- This is called a prompt injection and what it means is that model input
- can’t be secured. You have to assume that anybody that can send text to
- the model has full access to it.
+Prompts such as:
- Language models need to be treated like an unsecured client and only
- very carefully integrated into other systems.
+ Who was the first man on the moon?
- The response
+The input phrase, or prompt, has no structure beyond the linguistic. It’s just
+a blob of text. You can’t give the model commands or parameters separately from
+other input. Because of this, if your model lets a third party enter text, an
+attacker will always be able to bypass whatever restrictions you put on it.
+Control prompts or prefixes will be discovered and countermanded. Delimiters
+don’t work. Fine-tuning the model only limits the harm, but doesn’t prevent it.
- What you’re likely to get back from that prompt would be something
- like:
+This is called a prompt injection and what it means is that model input can’t
+be secured. You have to assume that anybody that can send text to the model has
+full access to it.
- On July 20, 1969, Neil Armstrong became the first human to step on
- the moon.
+Language models need to be treated like an unsecured client and only very
+carefully integrated into other systems.
- This is NASA’s own phrasing. Most answers on the web are likely to be
- variations on this, so the answer from a language model is likely to be
- so too.
- * The moon landing happens to be a fact, but the language model only
- knows it as a text.
+The response
- The prompt we provided is strongly associated in the training data set
- with other sentences that are all variations of NASA’s phrasing of the
- answer. The model won’t answer with just “Neil Armstrong” because it
- isn’t actually answering the question, it’s responding with the text
- that correlates with the question. It doesn’t “know” anything.
- * The language model is fabricating a mathematically plausible
- response, based on word distributions in the training data.
- * There are no facts in a language model or its output. Only
- memorised text.
+What you’re likely to get back from that prompt would be something like:
- It only fabricates. It’s all “hallucinations” all the way down.
+ On July 20, 1969, Neil Armstrong became the first human to step on the
+ moon.
- Occasionally those fabrications correlate with facts, but that is a
- mathematical quirk resulting from the fact that, on average, what
- people write roughly correlates with their understanding of a factual
- reality, which in turn roughly correlates with a factual reality.
+This is NASA’s own phrasing. Most answers on the web are likely to be
+variations on this, so the answer from a language model is likely to be so too.
- A knowledge system?
+ • The moon landing happens to be a fact, but the language model only knows it
+ as a text.
- To be able to answer that question and pass as a knowledge system, the
- model needs to memorise the answer, or at least parts of the phrase.
+The prompt we provided is strongly associated in the training data set with
+other sentences that are all variations of NASA’s phrasing of the answer. The
+model won’t answer with just “Neil Armstrong” because it isn’t actually
+answering the question, it’s responding with the text that correlates with the
+question. It doesn’t “know” anything.
- Because “AI” vendors are performing a sleight-of-hand here and
- presenting statistical language synthesis engines as knowledge
- retrieval systems, their focus in training and testing is on “facts”
- and minimising “falsehoods”. The model has no notion of either, as it’s
- entirely a language model, so the only way to square this circle is for
- the model to memorise it all.
- * To be able to answer a question factually, not “hallucinate”, and
- pass as a knowledge system, the model needs to memorise the answer.
- * The model doesn’t know facts, only text.
- * If you want a fact from it, the model will need to memorise text
- that correlates with that fact.
+ • The language model is fabricating a mathematically plausible response,
+ based on word distributions in the training data.
+ • There are no facts in a language model or its output. Only memorised text.
- “Dr. AI”?
+It only fabricates. It’s all “hallucinations” all the way down.
- Vendors then compound this by using human exams as benchmarks for
- reasoning performance. The problem is that bar exams, medical exams,
- and diagnosis tests are specifically designed to mostly test rote
- memorisation. That’s what they’re for.
+Occasionally those fabrications correlate with facts, but that is a
+mathematical quirk resulting from the fact that, on average, what people write
+roughly correlates with their understanding of a factual reality, which in turn
+roughly correlates with a factual reality.
- The human brain is bad at rote memorisation and generally it only
- happens with intensive work and practice. If you want to design a test
- that’s specifically intended to verify that somebody has spent a large
- amount of time studying a subject, you test for rote memorisation.
+A knowledge system?
- Many other benchmarks they use, such as those related to programming
- languages also require memorisation, otherwise the systems would just
- constantly make up APIs.
- * Vendors use human exams as benchmarks.
- * These are specifically designed to test rote memorisation, because
- that’s hard for humans.
- * Programming benchmarks also require memorisation. Otherwise, you’d
- only get pseudocode.
+To be able to answer that question and pass as a knowledge system, the model
+needs to memorise the answer, or at least parts of the phrase.
- Between the tailoring of these systems for knowledge retrieval, and the
- use of rote memorisation exams and code generation as benchmarks, the
- tech industry has created systems where memorisation is a core part of
- how they function. In all research to date, memorisation has been key
- to language model performance in a range of benchmarks.^[22][1]
+Because “AI” vendors are performing a sleight-of-hand here and presenting
+statistical language synthesis engines as knowledge retrieval systems, their
+focus in training and testing is on “facts” and minimising “falsehoods”. The
+model has no notion of either, as it’s entirely a language model, so the only
+way to square this circle is for the model to memorise it all.
- If you’re familiar with storytelling devices, this here would be a
- [23]Chekhov’s gun. Observe! The gun is above the mantelpiece:
+ • To be able to answer a question factually, not “hallucinate”, and pass as a
+ knowledge system, the model needs to memorise the answer.
+ • The model doesn’t know facts, only text.
+ • If you want a fact from it, the model will need to memorise text that
+ correlates with that fact.
- 👉🏻👉🏻 memorisation!
+“Dr. AI”?
- Make a note of it, because those finger guns are going to be fired
- later.
+Vendors then compound this by using human exams as benchmarks for reasoning
+performance. The problem is that bar exams, medical exams, and diagnosis tests
+are specifically designed to mostly test rote memorisation. That’s what they’re
+for.
- Biases
+The human brain is bad at rote memorisation and generally it only happens with
+intensive work and practice. If you want to design a test that’s specifically
+intended to verify that somebody has spent a large amount of time studying a
+subject, you test for rote memorisation.
- Beyond question and answer, these systems are great at generating the
- averagely plausible text for a given prompt. In prose, current system
- output smells vaguely of sweaty-but-quiet LinkedIn desperation and
- over-enthusiastic social media. The general style will vary, but it’s
- always going to be the most plausible style and response based on the
- training data.
+Many other benchmarks they use, such as those related to programming languages
+also require memorisation, otherwise the systems would just constantly make up
+APIs.
- One consequence of how these systems are made is that they are
- constantly backwards-facing. Where brains are focused on the present,
- often to their detriment, “AI” models are built using historical data.
+ • Vendors use human exams as benchmarks.
+ • These are specifically designed to test rote memorisation, because that’s
+ hard for humans.
+ • Programming benchmarks also require memorisation. Otherwise, you’d only get
+ pseudocode.
- The training data encompasses thousands of diverse voices, styles,
- structures, and tones, but some word distributions will be more common
- in the set than others and those will end up dominating the output. As
- a result, language models tend to lean towards the “racist grandpa who
- has learned to speak fluent LinkedIn” end of the spectrum.^[24][2]
+Between the tailoring of these systems for knowledge retrieval, and the use of
+rote memorisation exams and code generation as benchmarks, the tech industry
+has created systems where memorisation is a core part of how they function. In
+all research to date, memorisation has been key to language model performance
+in a range of benchmarks.^[20][1]
- This has implications for a whole host of use cases:
- * Generated text is going to skew conservative in content and
- marketing copy in structure and vocabulary. (Bigoted, prejudiced,
- but polite and inoffensively phrased.)
- * Even when the cut-off date for the data set is recent, it’s still
- going to skew historical because what’s new is also comparatively
- smaller than the old.
- * Language models will always skew towards the more common, middling,
- mediocre, and predictable.
- * Because most of these models are trained on the web, much of which
- is unhinged, violent, pornographic, and abusive, some of that
- language will be represented in the output.
+If you’re familiar with storytelling devices, this here would be a [21]
+Chekhov’s gun. Observe! The gun is above the mantelpiece:
- Modify, summarise, and “reason”
+ 👉🏻👉🏻 memorisation!
- The superpower that these systems provide is conversion or
- modification. They can, generally, take text and convert it to another
- style or structure. Take this note and turn it into a formal prose, and
- it will! That’s amazing. I don’t think that’s a trillion-dollar
- industry, but it’s a neat feature that will definitely be useful.
+Make a note of it, because those finger guns are going to be fired later.
- They can summarise text too, but that’s much less reliable than you’d
- expect. It unsurprisingly works best with text that already provides
- its own summary, such as a newspaper article (first paragraphs always
- summarise the story), academic paper (the abstract), or corporate
- writing (executive summary). Anything that’s a mix of styles, voices,
- or has an unusual structure won’t work as well.
+Biases
- What little reasoning they do is entirely based on finding through
- correlation and re-enacting prior textual descriptions of reasoning.
- They fail utterly when confronted with adversarial or novel examples.
- They also fail if you rephrase the question so that it no longer
- correlates with the phrasing in the data set.^[25][3]
+Beyond question and answer, these systems are great at generating the averagely
+plausible text for a given prompt. In prose, current system output smells
+vaguely of sweaty-but-quiet LinkedIn desperation and over-enthusiastic social
+media. The general style will vary, but it’s always going to be the most
+plausible style and response based on the training data.
- So, not actual reasoning. “Reasoning”, if you will. In other “AI” model
- genres these correlations are often called “shortcuts”, which feels
- apt.
+One consequence of how these systems are made is that they are constantly
+backwards-facing. Where brains are focused on the present, often to their
+detriment, “AI” models are built using historical data.
- To summarise:
- * Language models are a mathematical expression of the training data
- set.
- * Have very little in common with human brains.
- * Rely on inputs that can’t be secured.
- * Lie. Everything they output is a fabrication.
- * Memorise heavily.
- * Great for modifying text. No sarcasm. Genuinely good at this.
- * Occasionally useful for summarisation if you don’t mind being lied
- to regularly.
- * Don’t actually reason.
+The training data encompasses thousands of diverse voices, styles, structures,
+and tones, but some word distributions will be more common in the set than
+others and those will end up dominating the output. As a result, language
+models tend to lean towards the “racist grandpa who has learned to speak fluent
+LinkedIn” end of the spectrum.^[22][2]
+
+This has implications for a whole host of use cases:
+
+ • Generated text is going to skew conservative in content and marketing copy
+ in structure and vocabulary. (Bigoted, prejudiced, but polite and
+ inoffensively phrased.)
+ • Even when the cut-off date for the data set is recent, it’s still going to
+ skew historical because what’s new is also comparatively smaller than the
+ old.
+ • Language models will always skew towards the more common, middling,
+ mediocre, and predictable.
+ • Because most of these models are trained on the web, much of which is
+ unhinged, violent, pornographic, and abusive, some of that language will be
+ represented in the output.
+
+Modify, summarise, and “reason”
+
+The superpower that these systems provide is conversion or modification. They
+can, generally, take text and convert it to another style or structure. Take
+this note and turn it into a formal prose, and it will! That’s amazing. I don’t
+think that’s a trillion-dollar industry, but it’s a neat feature that will
+definitely be useful.
+
+They can summarise text too, but that’s much less reliable than you’d expect.
+It unsurprisingly works best with text that already provides its own summary,
+such as a newspaper article (first paragraphs always summarise the story),
+academic paper (the abstract), or corporate writing (executive summary).
+Anything that’s a mix of styles, voices, or has an unusual structure won’t work
+as well.
+
+What little reasoning they do is entirely based on finding through correlation
+and re-enacting prior textual descriptions of reasoning. They fail utterly when
+confronted with adversarial or novel examples. They also fail if you rephrase
+the question so that it no longer correlates with the phrasing in the data set.
+^[23][3]
+
+So, not actual reasoning. “Reasoning”, if you will. In other “AI” model genres
+these correlations are often called “shortcuts”, which feels apt.
+
+To summarise:
+
+ • Language models are a mathematical expression of the training data set.
+ • Have very little in common with human brains.
+ • Rely on inputs that can’t be secured.
+ • Lie. Everything they output is a fabrication.
+ • Memorise heavily.
+ • Great for modifying text. No sarcasm. Genuinely good at this.
+ • Occasionally useful for summarisation if you don’t mind being lied to
+ regularly.
+ • Don’t actually reason.
Why I believe “AI” for programming is a bad idea
- If you recall from the start of this essay, I began my research into
- machine learning and language models because I was curious to see if
- they could help fix or improve the mess that is modern software
- development.
+If you recall from the start of this essay, I began my research into machine
+learning and language models because I was curious to see if they could help
+fix or improve the mess that is modern software development.
- There was reason to be hopeful. Programming languages are more uniform
- and structured than prose, so it’s not too unreasonable to expect that
- they might lend themselves to language models. Programming language
- output can often be tested directly, which might help with the
- evaluation of each training run.
+There was reason to be hopeful. Programming languages are more uniform and
+structured than prose, so it’s not too unreasonable to expect that they might
+lend themselves to language models. Programming language output can often be
+tested directly, which might help with the evaluation of each training run.
- Training a language model on code also seems to benefit the model.
- Models that include substantial code in their data set tend to be
- better at correlative “reasoning” (to a point, still not actual
- reasoning), which makes sense since code is all about representing
- structured logic in text.
+Training a language model on code also seems to benefit the model. Models that
+include substantial code in their data set tend to be better at correlative
+“reasoning” (to a point, still not actual reasoning), which makes sense since
+code is all about representing structured logic in text.
- But, there is an inherent [26]Catch 22 to any attempt at fixing
- software industry dysfunction with more software. The structure of the
- industry depends entirely on variables that everybody pretends are
- proxies for end user value, but generally aren’t. This will always tend
- to sabotage our efforts at industrial self-improvement.
+But, there is an inherent [24]Catch 22 to any attempt at fixing software
+industry dysfunction with more software. The structure of the industry depends
+entirely on variables that everybody pretends are proxies for end user value,
+but generally aren’t. This will always tend to sabotage our efforts at
+industrial self-improvement.
- The more I studied language models as a technology the more flaws I
- found until it became clear to me that odds are that the overall effect
- on software development will be harmful. The problem starts with the
- models themselves.
+The more I studied language models as a technology the more flaws I found until
+it became clear to me that odds are that the overall effect on software
+development will be harmful. The problem starts with the models themselves.
- 1. Language models can’t be secured
+1. Language models can’t be secured
- This first issue has less to do with the use of language models for
- software development and more to do with their use in software
- products, which is likely to be a priority for many software companies
- over the next few years.
+This first issue has less to do with the use of language models for software
+development and more to do with their use in software products, which is likely
+to be a priority for many software companies over the next few years.
- Prompt injections are not a solved problem. OpenAI has come up with a
- few “solutions” in the past, but none of them actually worked.
- Everybody expects this to be fixed, but nobody has a clue how.
+Prompt injections are not a solved problem. OpenAI has come up with a few
+“solutions” in the past, but none of them actually worked. Everybody expects
+this to be fixed, but nobody has a clue how.
- Language models are fundamentally based on the idea that you give it
- text as input and get text as output. It’s entirely possible that the
- only way to completely fix this is to invent a completely new kind of
- language model and spend a few years training it from scratch.
- * A language model needs to be treated like an unsecured client. It’s
- about as secure as a web page form. It’s vulnerable to a new
- generation of injection vulnerabilities, both direct and indirect,
- that we still don’t quite understand.^[27][4]
+Language models are fundamentally based on the idea that you give it text as
+input and get text as output. It’s entirely possible that the only way to
+completely fix this is to invent a completely new kind of language model and
+spend a few years training it from scratch.
- The training data set itself is also a security hazard. I’ve gone into
- this in more detail elsewhere^[28][5], but the short version is that
- training data set is vulnerable to keyword manipulation, both in terms
- of altering sentiment and censorship.
+ • A language model needs to be treated like an unsecured client. It’s about
+ as secure as a web page form. It’s vulnerable to a new generation of
+ injection vulnerabilities, both direct and indirect, that we still don’t
+ quite understand.^[25][4]
- Again, fully defending against this kind of attack would seem to
- require inventing a completely new kind of language model.
+The training data set itself is also a security hazard. I’ve gone into this in
+more detail elsewhere^[26][5], but the short version is that training data set
+is vulnerable to keyword manipulation, both in terms of altering sentiment and
+censorship.
- Neither of these issues affect the use of language models for software
- development, but it does affect our work because we’re the ones who
- will be expected to integrate these systems into existing websites and
- products.
+Again, fully defending against this kind of attack would seem to require
+inventing a completely new kind of language model.
- 2. It encourages the worst of our management and development practices
+Neither of these issues affect the use of language models for software
+development, but it does affect our work because we’re the ones who will be
+expected to integrate these systems into existing websites and products.
- A language model will never question, push back, doubt, hesitate, or
- waver.
+2. It encourages the worst of our management and development practices
- Your managers are going to use it to flesh out and describe unworkable
- ideas, and it won’t complain. The resulting spec won’t have any bearing
- with reality.
+A language model will never question, push back, doubt, hesitate, or waver.
- People on your team will do “user research” by asking a language model,
- which it will do even though the resulting research will be fiction and
- entirely useless.
+Your managers are going to use it to flesh out and describe unworkable ideas,
+and it won’t complain. The resulting spec won’t have any bearing with reality.
- It’ll let you implement the worst ideas ever in your code without
- protest. Ask a copilot “how can I roll my own cryptography?” and it’ll
- regurgitate a half-baked expression of sha1 in PHP for you.
+People on your team will do “user research” by asking a language model, which
+it will do even though the resulting research will be fiction and entirely
+useless.
- Think of all the times you’ve had an idea for an approach, looked up
- how to do it on the web, and found out that, no, this was a really bad
- idea? I have a couple of those every week when I’m in the middle of a
- project.
+It’ll let you implement the worst ideas ever in your code without protest. Ask
+a copilot “how can I roll my own cryptography?” and it’ll regurgitate a
+half-baked expression of sha1 in PHP for you.
- Language models don’t deliver productivity improvements. They increase
- the volume, unchecked by reason.
+Think of all the times you’ve had an idea for an approach, looked up how to do
+it on the web, and found out that, no, this was a really bad idea? I have a
+couple of those every week when I’m in the middle of a project.
- A core aspect of the theory-building model of software development is
- code that developers don’t understand is a liability. It means your
- mental model of the software is inaccurate which will lead you to
- create bugs as you modify it or add other components that interact with
- pieces you don’t understand.
+Language models don’t deliver productivity improvements. They increase the
+volume, unchecked by reason.
- Language model tools for software development are specifically designed
- to create large volumes of code that the programmer doesn’t understand.
- They are liability engines for all but the most experienced developer.
- You can’t solve this problem by having the “AI” understand the codebase
- and how its various components interact with each other because a
- language model isn’t a mind. It can’t have a mental model of anything.
- It only works through correlation.
+A core aspect of the theory-building model of software development is code that
+developers don’t understand is a liability. It means your mental model of the
+software is inaccurate which will lead you to create bugs as you modify it or
+add other components that interact with pieces you don’t understand.
- These tools will indeed make you go faster, but it’s going to be
- accelerating in the wrong direction. That is objectively worse than
- just standing still.
+Language model tools for software development are specifically designed to
+create large volumes of code that the programmer doesn’t understand. They are
+liability engines for all but the most experienced developer. You can’t solve
+this problem by having the “AI” understand the codebase and how its various
+components interact with each other because a language model isn’t a mind. It
+can’t have a mental model of anything. It only works through correlation.
- 3. Its User Interfaces do not work, and we haven’t found interfaces that do
- work
+These tools will indeed make you go faster, but it’s going to be accelerating
+in the wrong direction. That is objectively worse than just standing still.
- Human factors studies, the field responsible for designing cockpits and
- the like, discovered that humans suffer from an automation bias.
+3. Its User Interfaces do not work, and we haven’t found interfaces that do
+work
- What it means is that when you have cognitive automation—something that
- helps you think less—you inevitably think less. That means that you are
- less critical of the output than if you were doing it yourself. That’s
- potentially catastrophic when the output is code, especially since the
- quality of the generated code is, understandably considering how the
- system works, broadly on the level of a novice developer.^[29][6]
+Human factors studies, the field responsible for designing cockpits and the
+like, discovered that humans suffer from an automation bias.
- Copilots and chatbots—exacerbated by anthropomorphism—seem to trigger
- our automation biases.
+What it means is that when you have cognitive automation—something that helps
+you think less—you inevitably think less. That means that you are less critical
+of the output than if you were doing it yourself. That’s potentially
+catastrophic when the output is code, especially since the quality of the
+generated code is, understandably considering how the system works, broadly on
+the level of a novice developer.^[27][6]
- Microsoft themselves have said that 40% of GitHub Copilot’s output is
- committed unchanged.^[30][7]
+Copilots and chatbots—exacerbated by anthropomorphism—seem to trigger our
+automation biases.
- Let’s not get into the question of how we, as an industry, put
- ourselves in the position where Microsoft can follow a line of code
- from their language model, through your text editor, and into your
- supposedly decentralised version control system.
+Microsoft themselves have said that 40% of GitHub Copilot’s output is committed
+unchanged.^[28][7]
- People overwhelmingly seem to trust the output of a language model.
+Let’s not get into the question of how we, as an industry, put ourselves in the
+position where Microsoft can follow a line of code from their language model,
+through your text editor, and into your supposedly decentralised version
+control system.
- If it runs without errors, it must be fine.
+People overwhelmingly seem to trust the output of a language model.
- But that’s never the case. We all know this. We’ve all seen running
- code turn out to be buggy as hell. But something in our mind switches
- off when we use tools for cognitive automation.
+If it runs without errors, it must be fine.
- 4. It’s biased towards the stale and popular
+But that’s never the case. We all know this. We’ve all seen running code turn
+out to be buggy as hell. But something in our mind switches off when we use
+tools for cognitive automation.
- The biases inherent in these language models are bad enough when it
- comes to prose, but they become a functional problem in code.
- * Its JS code will lean towards React and node, most of it several
- versions old, and away from the less popular corners of the JS
- ecosystem.
- * The code is, inevitably, more likely to be built around CommonJS
- modules instead of the modern ESM modules.
- * It won’t know much about Deno or Cloudflare Workers.
- * It’ll always prefer older APIs over new. Most of these models won’t
- know about any API or module released after 2021. This is going to
- be an issue for languages such as Swift.
- * New platforms and languages don’t exist to it.
- * Existing data will outweigh deprecations and security issues.
- * Popular but obsolete or outdated open source projects will always
- win out over the up-to-date equivalent.
+4. It’s biased towards the stale and popular
- These systems live in the popular past, like the middle-aged man who
- doesn’t realise he isn’t the popular kid at school any more. Everything
- he thinks is cool is actually very much not cool. More the other thing.
+The biases inherent in these language models are bad enough when it comes to
+prose, but they become a functional problem in code.
- This is an issue for software because our industry is entirely
- structured around constant change. Software security hinges on it. All
- of our practices are based on constant march towards the new and fancy.
- We go from framework to framework to try and find the magic solution
- that will solve everything. In some cases language models might help
- push back against that, but it’ll also push back against all the very
- many changes that are necessary because the old stuff turned out to be
- broken.
- * The software industry is built on change.
- * Language models are built on a static past.
+ • Its JS code will lean towards React and node, most of it several versions
+ old, and away from the less popular corners of the JS ecosystem.
+ • The code is, inevitably, more likely to be built around CommonJS modules
+ instead of the modern ESM modules.
+ • It won’t know much about Deno or Cloudflare Workers.
+ • It’ll always prefer older APIs over new. Most of these models won’t know
+ about any API or module released after 2021. This is going to be an issue
+ for languages such as Swift.
+ • New platforms and languages don’t exist to it.
+ • Existing data will outweigh deprecations and security issues.
+ • Popular but obsolete or outdated open source projects will always win out
+ over the up-to-date equivalent.
- 5. No matter how the lawsuits go, this threatens the existence of free and
- open source software
+These systems live in the popular past, like the middle-aged man who doesn’t
+realise he isn’t the popular kid at school any more. Everything he thinks is
+cool is actually very much not cool. More the other thing.
- Many AI vendors are mired in lawsuits.^[31][8]
+This is an issue for software because our industry is entirely structured
+around constant change. Software security hinges on it. All of our practices
+are based on constant march towards the new and fancy. We go from framework to
+framework to try and find the magic solution that will solve everything. In
+some cases language models might help push back against that, but it’ll also
+push back against all the very many changes that are necessary because the old
+stuff turned out to be broken.
- These lawsuits all concentrate on the relationship between the training
- data set and the model and they do so from a variety of angles. Some
- are based on contract and licensing law. Others are claiming that the
- models violate fair use. It’s hard to predict how they will go. They
- might not all go the same way, as laws will vary across industries and
- jurisdictions.
+ • The software industry is built on change.
+ • Language models are built on a static past.
- No matter the result, we’re likely to be facing a major decline in the
- free and open source ecosystem.
- 1. All of these models are trained on open source code without payment
- or even acknowledgement, which is a major disincentive for
- contributors and maintainers. That large corporations might benefit
- from your code is a fixture of open source, but they do
- occasionally give back to the community.
- 2. Language models—built on open source code—commonly replace that
- code. Instead of importing a module to do a thing, you prompt your
- Copilot. The code generated is almost certainly based on the open
- source module, at least partially, but it has been laundered
- through the language model, disconnecting the programmer from the
- community, recognition, and what little reward there was.
+5. No matter how the lawsuits go, this threatens the existence of free and open
+source software
- Language models demotivate maintainers and drain away both resources
- and users. What you’re likely to be left with are those who are
- building core infrastructure or end-user software out of principle. The
- “free software” side of the community is more likely to survive than
- the rest. The Linux kernel, Gnome, KDE—that sort of thing.
+Many AI vendors are mired in lawsuits.^[29][8]
- The “open source” ecosystem, especially that surrounding the web and
- node, is likely to be hit the hardest. The more driven the open source
- project was by its proximity to either an employed contributor or
- actively dependent business, the bigger the impact from a shift to
- language models will be.
+These lawsuits all concentrate on the relationship between the training data
+set and the model and they do so from a variety of angles. Some are based on
+contract and licensing law. Others are claiming that the models violate fair
+use. It’s hard to predict how they will go. They might not all go the same way,
+as laws will vary across industries and jurisdictions.
- This is a serious problem for the software industry as arguably much of
- the economic value the industry has provided over the past decade comes
- from strip-mining open source and free software.
+No matter the result, we’re likely to be facing a major decline in the free and
+open source ecosystem.
- 6. Licence contamination
+ 1. All of these models are trained on open source code without payment or even
+ acknowledgement, which is a major disincentive for contributors and
+ maintainers. That large corporations might benefit from your code is a
+ fixture of open source, but they do occasionally give back to the
+ community.
+ 2. Language models—built on open source code—commonly replace that code.
+ Instead of importing a module to do a thing, you prompt your Copilot. The
+ code generated is almost certainly based on the open source module, at
+ least partially, but it has been laundered through the language model,
+ disconnecting the programmer from the community, recognition, and what
+ little reward there was.
- Microsoft and Google don’t train their language models on their own
- code. GitHub’s Copilot isn’t trained on code from Microsoft’s office
- suite, even though many of its products are likely to be some of the
- largest React Native projects in existence. There aren’t many C++ code
- bases as big as Windows. Google’s repository is probably one of the
- biggest collection of python and java code you can find.
+Language models demotivate maintainers and drain away both resources and users.
+What you’re likely to be left with are those who are building core
+infrastructure or end-user software out of principle. The “free software” side
+of the community is more likely to survive than the rest. The Linux kernel,
+Gnome, KDE—that sort of thing.
- They don’t seem to use it for training, but instead train on
- collections of open source code that contain both permissive and
- copyleft licences.
+The “open source” ecosystem, especially that surrounding the web and node, is
+likely to be hit the hardest. The more driven the open source project was by
+its proximity to either an employed contributor or actively dependent business,
+the bigger the impact from a shift to language models will be.
- Copyleft licences, if used, force you to release your own project under
- their licence. Many of them, even non-copyleft, have patent clauses,
- which is poison for quite a few employers. Even permissive licences
- require attribution, and you can absolutely get sued if you’re caught
- copying open source code without attribution.
+This is a serious problem for the software industry as arguably much of the
+economic value the industry has provided over the past decade comes from
+strip-mining open source and free software.
- Remember our Chekhov’s gun?
+6. Licence contamination
- 👉🏻👉🏻 memorisation!
+Microsoft and Google don’t train their language models on their own code.
+GitHub’s Copilot isn’t trained on code from Microsoft’s office suite, even
+though many of its products are likely to be some of the largest React Native
+projects in existence. There aren’t many C++ code bases as big as Windows.
+Google’s repository is probably one of the biggest collection of python and
+java code you can find.
- Well, 👉🏻👉🏻 pewpew!!!
+They don’t seem to use it for training, but instead train on collections of
+open source code that contain both permissive and copyleft licences.
- Turns out blindly copying open source code is problematic.
- Whodathunkit?
+Copyleft licences, if used, force you to release your own project under their
+licence. Many of them, even non-copyleft, have patent clauses, which is poison
+for quite a few employers. Even permissive licences require attribution, and
+you can absolutely get sued if you’re caught copying open source code without
+attribution.
- These models all memorise a lot, and they tend to copy what they
- memorise into their output. [32]GitHub’s own numbers peg verbatim
- copies of code that’s at least 150 characters at 1%^[33][9], which is
- roughly the same, in terms of verbatim copying, as what you seem to get
- in other language models.
+Remember our Chekhov’s gun?
- For context, that means that if you use a language model for
- development, a copilot or chatbot, three or four times a day, you’re
- going to get a verbatim copy of open source code injected into your
- project about once a month. If every team member uses one, then
- multiply that by the size of the team.
+ 👉🏻👉🏻 memorisation!
- GitHub’s Copilot has a feature that lets you block verbatim copies.
- This obviously requires both a check, which slows the result down, and
- it will throw out a bunch of useful results, making the language model
- less useful. It’s already not as useful as it’s made out to be and
- pretty darn slow so many people are going to turn off the “please don’t
- plagiarise” checkbox.
+Well, 👉🏻👉🏻 pewpew!!!
- But even GitHub’s checks are insufficient. The keyword there is
- “verbatim”, because language models have a tendency to rephrase their
- output. If GitHub Copilot copies a GPLed implementation of an algorithm
- into your project but changes all the variable names, Copilot won’t
- detect it, it’ll still be plagiarism and the copied code is still under
- the GPL. This isn’t unlikely as this is how language models work.
- Memorisation and then copying with light rephrasing is what they do.
+Turns out blindly copying open source code is problematic. Whodathunkit?
- Training the system only on permissively licensed code doesn’t solve
- the problem. It won’t force your project to adopt an MIT licence or
- anything like that, but you can still be sued if it’s discovered.
+These models all memorise a lot, and they tend to copy what they memorise into
+their output. [30]GitHub’s own numbers peg verbatim copies of code that’s at
+least 150 characters at 1%^[31][9], which is roughly the same, in terms of
+verbatim copying, as what you seem to get in other language models.
- This would seem to give Microsoft and GitHub a good reason not to train
- on the Office code base, for example. If they did, there’s a good
- chance that a prompt to generate DOCX parsing code might “generate” a
- verbatim copy of the DOCX parsing code from Microsoft Word.
+For context, that means that if you use a language model for development, a
+copilot or chatbot, three or four times a day, you’re going to get a verbatim
+copy of open source code injected into your project about once a month. If
+every team member uses one, then multiply that by the size of the team.
- And they can’t have that, can they? This would both undercut their own
- strategic advantage, and it would break the illusion that these systems
- are generating novel code from scratch.
+GitHub’s Copilot has a feature that lets you block verbatim copies. This
+obviously requires both a check, which slows the result down, and it will throw
+out a bunch of useful results, making the language model less useful. It’s
+already not as useful as it’s made out to be and pretty darn slow so many
+people are going to turn off the “please don’t plagiarise” checkbox.
- This should make it clear that what they’re actually doing is
- strip-mine the free and open source software ecosystem.
+But even GitHub’s checks are insufficient. The keyword there is “verbatim”,
+because language models have a tendency to rephrase their output. If GitHub
+Copilot copies a GPLed implementation of an algorithm into your project but
+changes all the variable names, Copilot won’t detect it, it’ll still be
+plagiarism and the copied code is still under the GPL. This isn’t unlikely as
+this is how language models work. Memorisation and then copying with light
+rephrasing is what they do.
- How much of a problem is this?
+Training the system only on permissively licensed code doesn’t solve the
+problem. It won’t force your project to adopt an MIT licence or anything like
+that, but you can still be sued if it’s discovered.
- —It won’t matter. I won’t get caught.
+This would seem to give Microsoft and GitHub a good reason not to train on the
+Office code base, for example. If they did, there’s a good chance that a prompt
+to generate DOCX parsing code might “generate” a verbatim copy of the DOCX
+parsing code from Microsoft Word.
- You personally won’t get caught, but your employer might, and
- Intellectual Property scans or similar code audits tend to come up at
- the absolute worst moments in the history of any given organisation:
- * During due diligence for an acquisition. Could cost the company and
- managers a fortune.
- * In discovery for an unrelated lawsuit. Again, could cost the
- company a fortune.
- * During hacks and other security incidents. Could. Cost. A. Fortune.
+And they can’t have that, can they? This would both undercut their own
+strategic advantage, and it would break the illusion that these systems are
+generating novel code from scratch.
- “AI” vendors won’t take any responsibility for this risk. I doubt your
- business insurance covers “automated language model plagiarism”
- lawsuits.
+This should make it clear that what they’re actually doing is strip-mine the
+free and open source software ecosystem.
- Language models for software development are a lawsuit waiting to
- happen.
+How much of a problem is this?
- Unless they are completely reinvented from scratch, language model code
- generators are, in my opinion, unsuitable for anything except for
- prototypes and throwaway projects.
+—It won’t matter. I won’t get caught.
+
+You personally won’t get caught, but your employer might, and Intellectual
+Property scans or similar code audits tend to come up at the absolute worst
+moments in the history of any given organisation:
+
+ • During due diligence for an acquisition. Could cost the company and
+ managers a fortune.
+ • In discovery for an unrelated lawsuit. Again, could cost the company a
+ fortune.
+ • During hacks and other security incidents. Could. Cost. A. Fortune.
+
+“AI” vendors won’t take any responsibility for this risk. I doubt your business
+insurance covers “automated language model plagiarism” lawsuits.
+
+Language models for software development are a lawsuit waiting to happen.
+
+Unless they are completely reinvented from scratch, language model code
+generators are, in my opinion, unsuitable for anything except for prototypes
+and throwaway projects.
So, obviously, everybody’s going to use them
- * All the potentially bad stuff happens later. Unlikely to affect
- your bonuses or employment.
- * It’ll be years before the first licence contamination lawsuits
- happen.
- * Most employees will be long gone before anybody realises just how
- much of a bad idea it was.
- * But you’ll still get that nice “AI” bump in the stock market.
+ • All the potentially bad stuff happens later. Unlikely to affect your
+ bonuses or employment.
+ • It’ll be years before the first licence contamination lawsuits happen.
+ • Most employees will be long gone before anybody realises just how much of a
+ bad idea it was.
+ • But you’ll still get that nice “AI” bump in the stock market.
- What all of these problems have in common is that their impact is
- delayed and most of them will only appear in the form of increased
- frequency of bugs and other defects and general project chaos.
+What all of these problems have in common is that their impact is delayed and
+most of them will only appear in the form of increased frequency of bugs and
+other defects and general project chaos.
- The biggest issue, licence contamination, will likely take years before
- it starts to hit the industry, and is likely to be mitigated by virtue
- of the fact that many of the heaviest users of “AI”-generated code will
- have folded due to general mismanagement long before anybody cares
- enough to check their code.
+The biggest issue, licence contamination, will likely take years before it
+starts to hit the industry, and is likely to be mitigated by virtue of the fact
+that many of the heaviest users of “AI”-generated code will have folded due to
+general mismanagement long before anybody cares enough to check their code.
- If you were ever wondering if we, as an industry, were capable of
- coming up with a systemic issue to rival the Y2K bug in scale and
- stupidity? Well, here you go.
+If you were ever wondering if we, as an industry, were capable of coming up
+with a systemic issue to rival the Y2K bug in scale and stupidity? Well, here
+you go.
- You can start using a language model, get the stock market bump,
- present the short term increase in volume as productivity, and be long
- gone before anybody connects the dots between language model use and
- the jump in defects.
+You can start using a language model, get the stock market bump, present the
+short term increase in volume as productivity, and be long gone before anybody
+connects the dots between language model use and the jump in defects.
- Even if you purposefully tried to come up with a technology that played
- directly into and magnified the software industry’s dysfunctions you
- wouldn’t be able to come up with anything as perfectly imperfect as
- these language models.
+Even if you purposefully tried to come up with a technology that played
+directly into and magnified the software industry’s dysfunctions you wouldn’t
+be able to come up with anything as perfectly imperfect as these language
+models.
- It’s nonsense without consequence.
+It’s nonsense without consequence.
- Counterproductive novelty that you can indulge in without harming your
- career.
+Counterproductive novelty that you can indulge in without harming your career.
- It might even do your career some good. Show that you’re embracing the
- future.
+It might even do your career some good. Show that you’re embracing the future.
- But…
+But…
- The best is yet to come
+The best is yet to come
- In a few years’ time, once the effects of the “AI” bubble finally
- dissipates…
+In a few years’ time, once the effects of the “AI” bubble finally dissipates…
- Somebody’s going to get paid to fix the crap it left behind.
+Somebody’s going to get paid to fix the crap it left behind.
- The best way to support this newsletter or my blog is to buy one of my
- books, [34]The Intelligence Illusion: a practical guide to the business
- risks of Generative AI or [35]Out of the Software Crisis. Or, you can
- buy them both [36]as a bundle.
- __________________________________________________________________
+The best way to support this newsletter or my blog is to buy one of my books,
+[32]The Intelligence Illusion: a practical guide to the business risks of
+Generative AI or [33]Out of the Software Crisis. Or, you can buy them both [34]
+as a bundle.
- 1. There’s quite a bit of papers that either highlight the tendency to
- memorise or demonstrate a strong relationship between that tendency
- and eventual performance.
- + [37]An Empirical Study of Memorization in NLP (Zheng & Jiang,
- ACL 2022)
- + [38]Does learning require memorization? a short tale about a
- long tail. (Feldman, 2020)
- + [39]When is memorization of irrelevant training data necessary
- for high-accuracy learning? (Brown et al. 2021)
- + [40]What Neural Networks Memorize and Why: Discovering the
- Long Tail via Influence Estimation (Feldman & Zhang, 2020)
- + [41]Question and Answer Test-Train Overlap in Open-Domain
- Question Answering Datasets (Lewis et al., EACL 2021)
- + [42]Quantifying Memorization Across Neural Language Models
- (Carlini et al. 2022)
- + [43]On Training Sample Memorization: Lessons from Benchmarking
- Generative Modeling with a Large-scale Competition (Bai et al.
- 2021)
- [44]↩︎
- 2. See the [45]Bias & Safety card at [46]needtoknow.fyi for
- references. [47]↩︎
- 3. See the [48]Shortcut “Reasoning” card at [49]needtoknow.fyi for
- references. [50]↩︎
- 4. Simon Willison has been covering this issue [51]in a series of blog
- posts. [52]↩︎
- 5.
- + [53]The poisoning of ChatGPT
- + [54]Google Bard is a glorious reinvention of black-hat SEO
- spam and keyword-stuffing
- [55]↩︎
- 6. See, for example:
- + [56]Asleep at the Keyboard? Assessing the Security of GitHub
- Copilot’s Code Contributions (Hammond Pearce et al., December
- 2021)
- + [57]Do Users Write More Insecure Code with AI Assistants?
- (Neil Perry et al., December 2022)
- [58]↩︎
- 7. This came out [59]during an investor event and was presented as
- evidence of the high quality of Copilot’s output. [60]↩︎
- 8.
- + [61]Getty Images v. Stability AI - Complaint
- + [62]Getty Images is suing the creators of AI art tool Stable
- Diffusion for scraping its content
- + [63]The Wave of AI Lawsuits Have Begun
- + [64]Copyright lawsuits pose a serious threat to generative AI
- + [65]GitHub Copilot litigation
- + [66]Stable Diffusion litigation
- [67]↩︎
- 9. Archived link of the [68]GitHub Copilot feature page. [69]↩︎
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+ 1. There’s quite a bit of papers that either highlight the tendency to
+ memorise or demonstrate a strong relationship between that tendency and
+ eventual performance.
+
+ □ [35]An Empirical Study of Memorization in NLP (Zheng & Jiang, ACL 2022)
+ □ [36]Does learning require memorization? a short tale about a long tail.
+ (Feldman, 2020)
+ □ [37]When is memorization of irrelevant training data necessary for
+ high-accuracy learning? (Brown et al. 2021)
+ □ [38]What Neural Networks Memorize and Why: Discovering the Long Tail
+ via Influence Estimation (Feldman & Zhang, 2020)
+ □ [39]Question and Answer Test-Train Overlap in Open-Domain Question
+ Answering Datasets (Lewis et al., EACL 2021)
+ □ [40]Quantifying Memorization Across Neural Language Models (Carlini et
+ al. 2022)
+ □ [41]On Training Sample Memorization: Lessons from Benchmarking
+ Generative Modeling with a Large-scale Competition (Bai et al. 2021)
+ [42]↩︎
+ 2. See the [43]Bias & Safety card at [44]needtoknow.fyi for references. [45]↩︎
+
+ 3. See the [46]Shortcut “Reasoning” card at [47]needtoknow.fyi for references.
+ [48]↩︎
+
+ 4. Simon Willison has been covering this issue [49]in a series of blog posts.
+ [50]↩︎
+
+ 5.
+ □ [51]The poisoning of ChatGPT
+ □ [52]Google Bard is a glorious reinvention of black-hat SEO spam and
+ keyword-stuffing
+ [53]↩︎
+ 6. See, for example:
+
+ □ [54]Asleep at the Keyboard? Assessing the Security of GitHub Copilot’s
+ Code Contributions (Hammond Pearce et al., December 2021)
+ □ [55]Do Users Write More Insecure Code with AI Assistants? (Neil Perry
+ et al., December 2022)
+ [56]↩︎
+ 7. This came out [57]during an investor event and was presented as evidence of
+ the high quality of Copilot’s output. [58]↩︎
+
+ 8.
+ □ [59]Getty Images v. Stability AI - Complaint
+ □ [60]Getty Images is suing the creators of AI art tool Stable Diffusion
+ for scraping its content
+ □ [61]The Wave of AI Lawsuits Have Begun
+ □ [62]Copyright lawsuits pose a serious threat to generative AI
+ □ [63]GitHub Copilot litigation
+ □ [64]Stable Diffusion litigation
+ [65]↩︎
+ 9. Archived link of the [66]GitHub Copilot feature page. [67]↩︎
Join the Newsletter
- Subscribe to the Out of the Software Crisis newsletter to get my weekly
- (at least) essays on how to avoid or get out of software development
- crises.
+Subscribe to the Out of the Software Crisis newsletter to get my weekly (at
+least) essays on how to avoid or get out of software development crises.
- Join now and get a free PDF of three bonus essays from Out of the
- Software Crisis.
+Join now and get a free PDF of three bonus essays from Out of the Software
+Crisis.
- ____________________
- (BUTTON)
- Subscribe
+[68][ ]
+Subscribe
- We respect your privacy.
+We respect your privacy.
- Unsubscribe at any time.
+Unsubscribe at any time.
- [70]Mastodon [71]Twitter [72]GitHub [73]Feed
+[70]Mastodon [71]Twitter [72]GitHub [73]Feed
-References
+References:
- 1. https://softwarecrisis.dev/index.xml
- 2. https://softwarecrisis.dev/feed.json
- 3. https://softwarecrisis.dev/
- 4. https://softwarecrisis.dev/
- 5. https://softwarecrisis.baldurbjarnason.com/
- 6. https://illusion.baldurbjarnason.com/
- 7. https://softwarecrisis.dev/archive/
- 8. https://softwarecrisis.dev/author/
- 9. https://www.hakkavelin.is/
- 10. https://illusion.baldurbjarnason.com/
- 11. https://softwarecrisis.baldurbjarnason.com/
- 12. https://baldurbjarnason.lemonsqueezy.com/checkout/buy/cfc2f2c6-34af-436f-91c1-cb2e47283c40
- 13. https://www.baldurbjarnason.com/2021/software-crisis-2/
- 14. https://standishgroup.com/sample_research_files/CHAOSReport2015-Final.pdf
- 15. https://softwarecrisis.baldurbjarnason.com/
- 16. https://quoteinvestigator.com/2019/09/19/woodpecker/
- 17. http://worrydream.com/refs/Brooks-NoSilverBullet.pdf
- 18. https://illusion.baldurbjarnason.com/
- 19. https://www.baldurbjarnason.com/2022/theory-building/
- 20. https://softwarecrisis.baldurbjarnason.com/
- 21. https://en.wikipedia.org/wiki/Mitochondrion
- 22. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn1
- 23. https://en.wikipedia.org/wiki/Chekhov's_gun
- 24. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn2
- 25. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn3
- 26. https://en.wikipedia.org/wiki/Catch-22_(logic)
- 27. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn4
- 28. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn5
- 29. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn6
- 30. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn7
- 31. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn8
- 32. https://archive.ph/2023.01.11-224507/https://github.com/features/copilot#selection-19063.298-19063.462:~:text=Our latest internal research shows that about 1% of the time, a suggestion may contain some code snippets longer than ~150 characters that matches the training set.
- 33. https://softwarecrisis.dev/letters/ai-and-software-quality/#fn9
- 34. https://illusion.baldurbjarnason.com/
- 35. https://softwarecrisis.baldurbjarnason.com/
- 36. https://baldurbjarnason.lemonsqueezy.com/checkout/buy/cfc2f2c6-34af-436f-91c1-cb2e47283c40
- 37. https://aclanthology.org/2022.acl-long.434
- 38. https://doi.org/10.1145/3357713.3384290
- 39. https://doi.org/10.1145/3406325.3451131
- 40. https://papers.nips.cc/paper/2020/hash/1e14bfe2714193e7af5abc64ecbd6b46-Abstract.html
- 41. https://aclanthology.org/2021.eacl-main.86
- 42. https://arxiv.org/abs/2202.07646
- 43. https://dl.acm.org/doi/10.1145/3447548.3467198
- 44. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref1
- 45. https://needtoknow.fyi/card/bias/
- 46. https://needtoknow.fyi/
- 47. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref2
- 48. https://needtoknow.fyi/card/shortcut-reasoning/
- 49. https://needtoknow.fyi/
- 50. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref3
- 51. https://simonwillison.net/series/prompt-injection/
- 52. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref4
- 53. https://softwarecrisis.dev/letters/the-poisoning-of-chatgpt/
- 54. https://softwarecrisis.dev/letters/google-bard-seo/
- 55. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref5
- 56. https://doi.org/10.48550/arXiv.2108.09293
- 57. https://doi.org/10.48550/arXiv.2211.03622
- 58. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref6
- 59. https://www.microsoft.com/en-us/Investor/events/FY-2023/Morgan-Stanley-TMT-Conference#:~:text=Scott Guthrie: I think you're,is now AI-generated and unmodified
- 60. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref7
- 61. https://copyrightlately.com/pdfviewer/getty-images-v-stability-ai-complaint/?auto_viewer=true#page=&zoom=auto&pagemode=none
- 62. https://www.theverge.com/2023/1/17/23558516/ai-art-copyright-stable-diffusion-getty-images-lawsuit
- 63. https://www.plagiarismtoday.com/2023/01/17/the-wave-of-ai-lawsuits-have-begun/
- 64. https://www.understandingai.org/p/copyright-lawsuits-pose-a-serious
- 65. https://githubcopilotlitigation.com/
- 66. https://stablediffusionlitigation.com/
- 67. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref8
- 68. https://archive.ph/2023.01.11-224507/https://github.com/features/copilot#selection-19063.298-19063.462:~:text=Our latest internal research shows that about 1% of the time, a suggestion may contain some code snippets longer than ~150 characters that matches the training set.
- 69. https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref9
- 70. https://toot.cafe/@baldur
- 71. https://twitter.com/fakebaldur
- 72. https://github.com/baldurbjarnason
- 73. https://softwarecrisis.dev/feed.xml
+[1] https://softwarecrisis.dev/
+[2] https://softwarecrisis.dev/
+[3] https://softwarecrisis.baldurbjarnason.com/
+[4] https://illusion.baldurbjarnason.com/
+[5] https://softwarecrisis.dev/archive/
+[6] https://softwarecrisis.dev/author/
+[7] https://www.hakkavelin.is/
+[8] https://illusion.baldurbjarnason.com/
+[9] https://softwarecrisis.baldurbjarnason.com/
+[10] https://baldurbjarnason.lemonsqueezy.com/checkout/buy/cfc2f2c6-34af-436f-91c1-cb2e47283c40
+[11] https://www.baldurbjarnason.com/2021/software-crisis-2/
+[12] https://standishgroup.com/sample_research_files/CHAOSReport2015-Final.pdf
+[13] https://softwarecrisis.baldurbjarnason.com/
+[14] https://quoteinvestigator.com/2019/09/19/woodpecker/
+[15] http://worrydream.com/refs/Brooks-NoSilverBullet.pdf
+[16] https://illusion.baldurbjarnason.com/
+[17] https://www.baldurbjarnason.com/2022/theory-building/
+[18] https://softwarecrisis.baldurbjarnason.com/
+[19] https://en.wikipedia.org/wiki/Mitochondrion
+[20] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn1
+[21] https://en.wikipedia.org/wiki/Chekhov's_gun
+[22] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn2
+[23] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn3
+[24] https://en.wikipedia.org/wiki/Catch-22_(logic)
+[25] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn4
+[26] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn5
+[27] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn6
+[28] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn7
+[29] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn8
+[30] https://archive.ph/2023.01.11-224507/https://github.com/features/copilot#selection-19063.298-19063.462:~:text=Our%20latest%20internal%20research%20shows%20that%20about%201%25%20of%20the%20time%2C%20a%20suggestion%20may%20contain%20some%20code%20snippets%20longer%20than%20~150%20characters%20that%20matches%20the%20training%20set.
+[31] https://softwarecrisis.dev/letters/ai-and-software-quality/#fn9
+[32] https://illusion.baldurbjarnason.com/
+[33] https://softwarecrisis.baldurbjarnason.com/
+[34] https://baldurbjarnason.lemonsqueezy.com/checkout/buy/cfc2f2c6-34af-436f-91c1-cb2e47283c40
+[35] https://aclanthology.org/2022.acl-long.434
+[36] https://doi.org/10.1145/3357713.3384290
+[37] https://doi.org/10.1145/3406325.3451131
+[38] https://papers.nips.cc/paper/2020/hash/1e14bfe2714193e7af5abc64ecbd6b46-Abstract.html
+[39] https://aclanthology.org/2021.eacl-main.86
+[40] https://arxiv.org/abs/2202.07646
+[41] https://dl.acm.org/doi/10.1145/3447548.3467198
+[42] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref1
+[43] https://needtoknow.fyi/card/bias/
+[44] https://needtoknow.fyi/
+[45] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref2
+[46] https://needtoknow.fyi/card/shortcut-reasoning/
+[47] https://needtoknow.fyi/
+[48] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref3
+[49] https://simonwillison.net/series/prompt-injection/
+[50] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref4
+[51] https://softwarecrisis.dev/letters/the-poisoning-of-chatgpt/
+[52] https://softwarecrisis.dev/letters/google-bard-seo/
+[53] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref5
+[54] https://doi.org/10.48550/arXiv.2108.09293
+[55] https://doi.org/10.48550/arXiv.2211.03622
+[56] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref6
+[57] https://www.microsoft.com/en-us/Investor/events/FY-2023/Morgan-Stanley-TMT-Conference#:~:text=Scott%20Guthrie%3A%20I%20think%20you%27re,is%20now%20AI%2Dgenerated%20and%20unmodified
+[58] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref7
+[59] https://copyrightlately.com/pdfviewer/getty-images-v-stability-ai-complaint/?auto_viewer=true#page=&zoom=auto&pagemode=none
+[60] https://www.theverge.com/2023/1/17/23558516/ai-art-copyright-stable-diffusion-getty-images-lawsuit
+[61] https://www.plagiarismtoday.com/2023/01/17/the-wave-of-ai-lawsuits-have-begun/
+[62] https://www.understandingai.org/p/copyright-lawsuits-pose-a-serious
+[63] https://githubcopilotlitigation.com/
+[64] https://stablediffusionlitigation.com/
+[65] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref8
+[66] https://archive.ph/2023.01.11-224507/https://github.com/features/copilot#selection-19063.298-19063.462:~:text=Our%20latest%20internal%20research%20shows%20that%20about%201%25%20of%20the%20time%2C%20a%20suggestion%20may%20contain%20some%20code%20snippets%20longer%20than%20~150%20characters%20that%20matches%20the%20training%20set.
+[67] https://softwarecrisis.dev/letters/ai-and-software-quality/#fnref9
+[70] https://toot.cafe/@baldur
+[71] https://twitter.com/fakebaldur
+[72] https://github.com/baldurbjarnason
+[73] https://softwarecrisis.dev/feed.xml
diff --git a/static/archive/stationery-pizza-93ey2p.txt b/static/archive/stationery-pizza-93ey2p.txt
index 48a1b98..6c63733 100644
--- a/static/archive/stationery-pizza-93ey2p.txt
+++ b/static/archive/stationery-pizza-93ey2p.txt
@@ -1,86 +1,82 @@
- #[1]Stationery🍕
+[1]
- [2]
+Stationery🍕
- Stationery🍕
+[2]Home [3]Favourites [4]Philosophy [5]Pen & Inks [6]About [7]Contact [8]
+Colophon [9]Feed [10]Archives
- [3]Home [4]Favourites [5]Philosophy [6]Pen & Inks [7]About [8]Contact
- [9]Colophon [10]Feed [11]Archives
+[11] Task management system: Analog Calendar
-[12]Task management system: Analog Calendar
+2023-05-25 00:00
- 2023-05-25 00:00
+My current analog calendar is a Hobonichi Cousin A5.
- My current analog calendar is a Hobonichi Cousin A5.
-
- I use it part for planning, and part for setting goals on different
- levels. Yearly, monthly, weekly and daily. I find it very useful
- process to do in order to see how busy things will be and setting
- realistic goals.
+I use it part for planning, and part for setting goals on different levels.
+Yearly, monthly, weekly and daily. I find it very useful process to do in order
+to see how busy things will be and setting realistic goals.
Yearly
- I use on of the graph pages in the back to define some goals I hope to
- achieve during the year.
+I use on of the graph pages in the back to define some goals I hope to achieve
+during the year.
Monthly
- On the monthly pages I make a note of the most important dates like
- birthdates and pay day and things like that. Plus that I use the empty
- area left of the calendar to define some goals and things I’d like to
- complete during the month.
+On the monthly pages I make a note of the most important dates like birthdates
+and pay day and things like that. Plus that I use the empty area left of the
+calendar to define some goals and things I’d like to complete during the month.
Weekly
- In the weekly page I do a lot of the same. I define some goals for the
- week and usually write down a few things I really should get done that
- week. And in the week spread I write down appointments that involve
- others or require me to go somewhere plus where I am working from and
- if I have my daughter.
+In the weekly page I do a lot of the same. I define some goals for the week and
+usually write down a few things I really should get done that week. And in the
+week spread I write down appointments that involve others or require me to go
+somewhere plus where I am working from and if I have my daughter.
- Makes it really easy to plan and check how much time I have for stuff
- that show up .
+Makes it really easy to plan and check how much time I have for stuff that show
+up .
Daily
- The daily page is probably the thing that change the most. In some
- periods it have been where I do my bullet journaling. These days I use
- them more to define the focus of the day.
+The daily page is probably the thing that change the most. In some periods it
+have been where I do my bullet journaling. These days I use them more to define
+the focus of the day.
- So the page laypit it is kind of split into two sections, one taking
- 1/3 and the other taking 2/3.
+So the page laypit it is kind of split into two sections, one taking 1/3 and
+the other taking 2/3.
- The first section I use to outline all the stuff I’m doing that day. It
- typically looks something like this:
- * Get up & dressed
- * Walk the dog
- * Pack my bag
- * Skateboard to work
- * Work
- + Work meetings
- + Lunch
- * Skateboard home
- * Walk the dog
- * Eat dinner
- * Etc
+The first section I use to outline all the stuff I’m doing that day. It
+typically looks something like this:
- Then on the big section I first define three areas that I’m going to
- focus on when I get home from work. After that I use the focus areas to
- define 2-3 goals/bigger tasks for each of them.
+ • Get up & dressed
+ • Walk the dog
+ • Pack my bag
+ • Skateboard to work
+ • Work
+ □ Work meetings
+ □ Lunch
+ • Skateboard home
+ • Walk the dog
+ • Eat dinner
+ • Etc
- Made with ❤️ in Bergen, Norway by Eivind Hjertnes
+Then on the big section I first define three areas that I’m going to focus on
+when I get home from work. After that I use the focus areas to define 2-3 goals
+/bigger tasks for each of them.
-References
+Made with ❤️ in Bergen, Norway by Eivind Hjertnes
- 1. https://stationery.pizza/feed.rss
- 2. https://stationery.pizza/
- 3. https://stationery.pizza/
- 4. https://stationery.pizza/favourites
- 5. https://stationery.pizza/philosophy
- 6. https://stationery.pizza/pen-inks
- 7. https://stationery.pizza/about
- 8. https://stationery.pizza/contact
- 9. https://stationery.pizza/colophon
- 10. https://stationery.pizza/feed.rss
- 11. https://stationery.pizza/archives
- 12. https://stationery.pizza/2023/05/25/task-management-system-analog-calendar
+
+References:
+
+[1] https://stationery.pizza/
+[2] https://stationery.pizza/
+[3] https://stationery.pizza/favourites
+[4] https://stationery.pizza/philosophy
+[5] https://stationery.pizza/pen-inks
+[6] https://stationery.pizza/about
+[7] https://stationery.pizza/contact
+[8] https://stationery.pizza/colophon
+[9] https://stationery.pizza/feed.rss
+[10] https://stationery.pizza/archives
+[11] https://stationery.pizza/2023/05/25/task-management-system-analog-calendar
diff --git a/static/archive/stationery-pizza-vxksey.txt b/static/archive/stationery-pizza-vxksey.txt
index 2fd26c4..543de89 100644
--- a/static/archive/stationery-pizza-vxksey.txt
+++ b/static/archive/stationery-pizza-vxksey.txt
@@ -1,104 +1,100 @@
- #[1]Stationery🍕
+[1]
- [2]
+Stationery🍕
- Stationery🍕
+[2]Home [3]Favourites [4]Philosophy [5]Pen & Inks [6]About [7]Contact [8]
+Colophon [9]Feed [10]Archives
- [3]Home [4]Favourites [5]Philosophy [6]Pen & Inks [7]About [8]Contact
- [9]Colophon [10]Feed [11]Archives
+[11] Bullet Journal
-[12]Bullet Journal
-
- 2023-05-27 00:00
+2023-05-27 00:00
The nerdy pen bits
- I use Leuchtturm1917 A5 dot grid notebooks for it at the moment.
- Sometimes the Bullet Journal versions sometimes the regular. It all
- depends on what is in stock and if I find a color that is cooler than
- the dull crap they have for the Bullet Journal versions.
+I use Leuchtturm1917 A5 dot grid notebooks for it at the moment. Sometimes the
+Bullet Journal versions sometimes the regular. It all depends on what is in
+stock and if I find a color that is cooler than the dull crap they have for the
+Bullet Journal versions.
- Most of the time I use fountain pens. Usually a finer nibbed one for
- writing and broad stub to underline headings.
+Most of the time I use fountain pens. Usually a finer nibbed one for writing
+and broad stub to underline headings.
How I use it
- I usually re-collect things when the number of pages from first to last
- go beyond 20-30 pages, mostly because I find it easier to deal with.
- Plus that I often need to replace at least some of the goals every 3-5
- days anyways.
+I usually re-collect things when the number of pages from first to last go
+beyond 20-30 pages, mostly because I find it easier to deal with. Plus that I
+often need to replace at least some of the goals every 3-5 days anyways.
- On the first two pages I write down my current “yearly” theme, and then
- I write down some goals I have on some areas of my life. Usually weight
- and fitness goals are there. Plus some things I focus on improving.
+On the first two pages I write down my current “yearly” theme, and then I write
+down some goals I have on some areas of my life. Usually weight and fitness
+goals are there. Plus some things I focus on improving.
- Then I put a marker there. Then I turn the page and make a daily page.
- I make one every day. And move over whatever was left on the day
- before.
+Then I put a marker there. Then I turn the page and make a daily page. I make
+one every day. And move over whatever was left on the day before.
- I just write down the day of the week and the date. And start adding
- stuff. I usually start by adding auto generated check lists from things
- that kind of keep my life together.
+I just write down the day of the week and the date. And start adding stuff. I
+usually start by adding auto generated check lists from things that kind of
+keep my life together.
- Usually first work stuff, then my personal daily stuff. I often start
- with the most important stuff. And then things I have to carry over
- from the day before. And then I put a marker on the start of the daily
- page and one marker at the first page with free space to write things.
+Usually first work stuff, then my personal daily stuff. I often start with the
+most important stuff. And then things I have to carry over from the day before.
+And then I put a marker on the start of the daily page and one marker at the
+first page with free space to write things.
- The first marker is always on the “status / goal page” the second is
- always at the first page with tasks I haven’t checked off and the last
- one is always at the first page with available space.
+The first marker is always on the “status / goal page” the second is always at
+the first page with tasks I haven’t checked off and the last one is always at
+the first page with available space.
- As I complete things and run out of tasks I start refilling it. Usually
- start with Daily tasks, move over to weekly and monthly if there are
- anything there I need to do. And after that over to projects that are
- in focus. First the ones outlined in the Hobonichi and then later
- anything not hidden in my task manager.
+As I complete things and run out of tasks I start refilling it. Usually start
+with Daily tasks, move over to weekly and monthly if there are anything there I
+need to do. And after that over to projects that are in focus. First the ones
+outlined in the Hobonichi and then later anything not hidden in my task
+manager.
Formatting
- I don’t use the official Bullet Journal formatting, I’ve tried a few
- times but after many years of using [13]Dash/Plus as my task management
- on paper formatting system I’ve never been able to change it.
+I don’t use the official Bullet Journal formatting, I’ve tried a few times but
+after many years of using [12]Dash/Plus as my task management on paper
+formatting system I’ve never been able to change it.
- The way I do things is that I use one pen and color for writing and
- another pen and color for underlining things.
+The way I do things is that I use one pen and color for writing and another pen
+and color for underlining things.
- I usually only have two levels of headings. One is the day, and then
- one for the “collection”, when things go deeper than that I typically
- will do it as sub-tasks and sub-sub-tasks etc. Anything that has tasks
- under it will be underlined. To make it easy to spot.
+I usually only have two levels of headings. One is the day, and then one for
+the “collection”, when things go deeper than that I typically will do it as
+sub-tasks and sub-sub-tasks etc. Anything that has tasks under it will be
+underlined. To make it easy to spot.
- In addition to this I also often will write a + between different
- areas. Like when I move from “Work” related tasks to “Daily” tasks etc.
+In addition to this I also often will write a + between different areas. Like
+when I move from “Work” related tasks to “Daily” tasks etc.
Page layout
- My page layout is usually that I align the top level heading (the day
- and date) to the left written larger than the rest.
+My page layout is usually that I align the top level heading (the day and date)
+to the left written larger than the rest.
- The collection I typically center.
+The collection I typically center.
- I also try to use as much of the page as possible. So, if a collection
- only takes up half the width or a third of the width of the page, I
- often will add another section next to it. Other times I write the
- tasks two or three per line. It all depends on what works and how
- mindful I am of not wasting page while doing it.
+I also try to use as much of the page as possible. So, if a collection only
+takes up half the width or a third of the width of the page, I often will add
+another section next to it. Other times I write the tasks two or three per
+line. It all depends on what works and how mindful I am of not wasting page
+while doing it.
- Made with ❤️ in Bergen, Norway by Eivind Hjertnes
+Made with ❤️ in Bergen, Norway by Eivind Hjertnes
-References
- 1. https://stationery.pizza/feed.rss
- 2. https://stationery.pizza/
- 3. https://stationery.pizza/
- 4. https://stationery.pizza/favourites
- 5. https://stationery.pizza/philosophy
- 6. https://stationery.pizza/pen-inks
- 7. https://stationery.pizza/about
- 8. https://stationery.pizza/contact
- 9. https://stationery.pizza/colophon
- 10. https://stationery.pizza/feed.rss
- 11. https://stationery.pizza/archives
- 12. https://stationery.pizza/2023/05/27/bullet-journal
- 13. https://patrickrhone.com/dashplus/
+References:
+
+[1] https://stationery.pizza/
+[2] https://stationery.pizza/
+[3] https://stationery.pizza/favourites
+[4] https://stationery.pizza/philosophy
+[5] https://stationery.pizza/pen-inks
+[6] https://stationery.pizza/about
+[7] https://stationery.pizza/contact
+[8] https://stationery.pizza/colophon
+[9] https://stationery.pizza/feed.rss
+[10] https://stationery.pizza/archives
+[11] https://stationery.pizza/2023/05/27/bullet-journal
+[12] https://patrickrhone.com/dashplus/
diff --git a/static/archive/stephango-com-tiumoc.txt b/static/archive/stephango-com-tiumoc.txt
index 7e471fd..ec5208f 100644
--- a/static/archive/stephango-com-tiumoc.txt
+++ b/static/archive/stephango-com-tiumoc.txt
@@ -1,161 +1,157 @@
- #[1]Steph Ango [2]Steph Ango
+[1]Steph Ango / [2]Writing [3]About [4]Now
- [3]Steph Ango / [4]Writing [5]About [6]Now
+Style is consistent constraint
- Style is consistent constraint
+September 3, 2023 · 2 minute read
- September 3, 2023 · 2 minute read
+Oscar Wilde once said:
- Oscar Wilde once said:
+ “Consistency is the last refuge of the unimaginative.”
- “Consistency is the last refuge of the unimaginative.”
+When it comes to ideas, I agree — allow your mind to be changed. When it comes
+to process, I disagree. Style emerges from consistency, and having a style
+opens your imagination. Your mind should be flexible, but your process should
+be repeatable.
- When it comes to ideas, I agree — allow your mind to be changed. When
- it comes to process, I disagree. Style emerges from consistency, and
- having a style opens your imagination. Your mind should be flexible,
- but your process should be repeatable.
+Style is a set of constraints that you stick to.
- Style is a set of constraints that you stick to.
+You can explore many types of constraints: colors, shapes, materials, textures,
+fonts, language, clothing, decor, beliefs, flavors, sounds, scents, rituals.
+Your style doesn’t have to please anyone else. Play by your own rules.
+Everything you do is open to stylistic interpretation.
- You can explore many types of constraints: colors, shapes, materials,
- textures, fonts, language, clothing, decor, beliefs, flavors, sounds,
- scents, rituals. Your style doesn’t have to please anyone else. Play by
- your own rules. Everything you do is open to stylistic interpretation.
+A style can be a system, a pattern, a set of personal guidelines. Here are a
+few of mine:
- A style can be a system, a pattern, a set of personal guidelines. Here
- are a few of mine:
- * I wear monochromatic clothing without logos
- * I use YYYY-MM-DD dates everywhere
- * I pluralize tag and folder names (e.g. #people not #person)
- * I use [7]plain text files for all my writing
- * I ask myself [8]40 questions every year
- * I meal prep lunches every week, shave my head twice a week
- * I write [9]concise essays, less than 500 words
+ • I wear monochromatic clothing without logos
+ • I use YYYY-MM-DD dates everywhere
+ • I pluralize tag and folder names (e.g. #people not #person)
+ • I use [5]plain text files for all my writing
+ • I ask myself [6]40 questions every year
+ • I meal prep lunches every week, shave my head twice a week
+ • I write [7]concise essays, less than 500 words
- Collect constraints you enjoy. Unusual constraints make things more
- fun. You can always change them later. This is your style, after all.
- It’s not a life commitment, it’s just the way you do things. For now.
+Collect constraints you enjoy. Unusual constraints make things more fun. You
+can always change them later. This is your style, after all. It’s not a life
+commitment, it’s just the way you do things. For now.
- Having a style collapses hundreds of future decisions into one, and
- gives you focus. I always pluralize tags so I never have to wonder what
- to name new tags.
+Having a style collapses hundreds of future decisions into one, and gives you
+focus. I always pluralize tags so I never have to wonder what to name new tags.
- Style gives you leverage. Every time you reuse your style you save
- time. A durable style is a great investment.
+Style gives you leverage. Every time you reuse your style you save time. A
+durable style is a great investment.
- Style helps you know when you’re breaking your constraints. Sometimes
- you have to. And if you want to edit your constraints, you can. It will
- be easier to adopt the new constraints if you already had some clearly
- defined.
+Style helps you know when you’re breaking your constraints. Sometimes you have
+to. And if you want to edit your constraints, you can. It will be easier to
+adopt the new constraints if you already had some clearly defined.
- You don’t need a style for everything. Make a deliberate choice about
- what needs consistency and what doesn’t.
+You don’t need a style for everything. Make a deliberate choice about what
+needs consistency and what doesn’t.
- If you stick with your constraints long enough, your style becomes a
- cohesive and recognizable [10]point of view.
- __________________________________________________________________
+If you stick with your constraints long enough, your style becomes a cohesive
+and recognizable [8]point of view.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Appendix
- I am starting a collection of interesting personal style choices.
- Please [11]send me examples and I’ll add them to the list.
- * [12]Scott Yu-Jan [13]paints all his tools white.
- * [14]2ynthetic uses a [15]limited palette for outfits and [16]office
- decor.
- * [17]Johnny Decimal is a system to organize digital data.
- * [18]Casey Neistat labels everything [19]in his studio with paint
- markers.
- * Ryan Hoover [20]never changes his profile picture.
- * Wes Anderson uses [21]the typeface Futura in many of his films.
- * [22]Steve Jobs wore the same Issey Miyake black turtleneck and New
- Balance 991 shoes every day.
- * George R.R. Martin writes his novels on the 40 year old DOS
- operating system
- * Beethoven always counted exactly 60 coffee beans to make coffee,
- especially for visitors.
- * Jesper Kouthoofd of [23]Teenage Engineering [24]only uses lowercase
- because uppercase communicates too much authority
- * Osvaldo Cavandoli created the cartoon [25]La Linea using an
- animated white line, colored backgrounds, and unintelligible
- vocalizations
+I am starting a collection of interesting personal style choices. Please [9]
+send me examples and I’ll add them to the list.
- Linked mentions
- Don't specialize, hybridize
- Specialization is too heavily encouraged as a career path. The world
- needs more hybrid people.
- Buy wisely
- Whenever I buy things I try to prioritize cost per use. Sometimes I
- consider other priorities such as cost per smile, cost...
- Obsidian Vault Template
- My personal Obsidian vault template. A bottom-up approach to
- note-taking and organizing things I am interested in.
- Flexoki
- An inky color scheme for prose and code.
+ • [10]Scott Yu-Jan [11]paints all his tools white.
+ • [12]2ynthetic uses a [13]limited palette for outfits and [14]office decor.
+ • [15]Johnny Decimal is a system to organize digital data.
+ • [16]Casey Neistat labels everything [17]in his studio with paint markers.
+ • Ryan Hoover [18]never changes his profile picture.
+ • Wes Anderson uses [19]the typeface Futura in many of his films.
+ • [20]Steve Jobs wore the same Issey Miyake black turtleneck and New Balance
+ 991 shoes every day.
+ • George R.R. Martin writes his novels on the 40 year old DOS operating
+ system
+ • Beethoven always counted exactly 60 coffee beans to make coffee, especially
+ for visitors.
+ • Jesper Kouthoofd of [21]Teenage Engineering [22]only uses lowercase because
+ uppercase communicates too much authority
+ • Osvaldo Cavandoli created the cartoon [23]La Linea using an animated white
+ line, colored backgrounds, and unintelligible vocalizations
- You might also enjoy
- * [26]Buy wisely
- * [27]Concise explanations accelerate progress
- * [28]Scars are beautiful
- * [29]Choose optimism
- * [30]Quality software deserves your hard‑earned cash
- * [31]Don't delegate understanding
- * [32]Nibble and your appetite will grow
- * [33]How I do my to-dos
- * [34]Calmness is a superpower
+Linked mentions
+[24]
+Don't specialize, hybridize
+Specialization is too heavily encouraged as a career path. The world needs more
+hybrid people.
+[25]
+Buy wisely
+Whenever I buy things I try to prioritize cost per use. Sometimes I consider
+other priorities such as cost per smile, cost...
+[26]
+Obsidian Vault Template
+My personal Obsidian vault template. A bottom-up approach to note-taking and
+organizing things I am interested in.
+[27]
+Flexoki
+An inky color scheme for prose and code.
- [35]Receive my updates
+You might also enjoy
- Follow me via email, [36]RSS, [37]Twitter, and [38]other options
- ____________________ Sign up
+ • [28]Buy wisely
+ • [29]Concise explanations accelerate progress
+ • [30]Scars are beautiful
+ • [31]Choose optimism
+ • [32]Quality software deserves your hard‑earned cash
+ • [33]Don't delegate understanding
+ • [34]Nibble and your appetite will grow
+ • [35]How I do my to-dos
+ • [36]Calmness is a superpower
- [39]Mastodon
+[37]Receive my updates
-References
+Follow me via email, [38]RSS, [39]Twitter, and [40]other options
- Visible links:
- 1. https://stephango.com/feed.xml
- 2. https://stephango.com/feed.json
- 3. https://stephango.com/
- 4. https://stephango.com/
- 5. https://stephango.com/about
- 6. https://stephango.com/now
- 7. https://stephango.com/file-over-app
- 8. https://stephango.com/40-questions
- 9. https://stephango.com/concise
- 10. https://stephango.com/in-good-hands
- 11. https://stephango.com/about
- 12. https://www.youtube.com/@ScottYuJan
- 13. https://www.youtube.com/watch?v=3GBPYRG9jM0
- 14. https://www.youtube.com/@2ynthetic
- 15. https://www.youtube.com/watch?v=4xMo2PsLi3c
- 16. https://www.youtube.com/watch?v=1RqBrl0-qOA
- 17. https://johnnydecimal.com/
- 18. https://www.youtube.com/@casey
- 19. https://www.youtube.com/watch?v=vb60rrtTddQ
- 20. https://www.ryanhoover.me/post/why-i-never-change-my-profile-pic
- 21. https://www.marksimonson.com/notebook/view/RoyalTenenbaumsWorldofFutura
- 22. https://en.wikipedia.org/wiki/Steve_Jobs
- 23. https://teenage.engineering/
- 24. https://scandinavianmind.com/feature/human-touch-interview-jesper-kouthoofd-teenage-engineering
- 25. https://en.wikipedia.org/wiki/La_Linea_(TV_series)
- 26. https://stephango.com/buy-wisely
- 27. https://stephango.com/concise
- 28. https://stephango.com/scars
- 29. https://stephango.com/optimism
- 30. https://stephango.com/quality-software
- 31. https://stephango.com/understand
- 32. https://stephango.com/nibble
- 33. https://stephango.com/todos
- 34. https://stephango.com/calmness
- 35. https://stephango.com/subscribe
- 36. https://stephango.com/feed.xml
- 37. https://twitter.com/kepano
- 38. https://stephango.com/subscribe
- 39. https://mastodon.social/@kepano
+[41][ ] [44][Sign up]
+[45] [46]Mastodon
- Hidden links:
- 41. https://stephango.com/hybridize
- 42. https://stephango.com/buy-wisely
- 43. https://stephango.com/vault
- 44. https://stephango.com/flexoki
- 45. https://twitter.com/kepano
+References:
+
+[1] https://stephango.com/
+[2] https://stephango.com/
+[3] https://stephango.com/about
+[4] https://stephango.com/now
+[5] https://stephango.com/file-over-app
+[6] https://stephango.com/40-questions
+[7] https://stephango.com/concise
+[8] https://stephango.com/in-good-hands
+[9] https://stephango.com/about
+[10] https://www.youtube.com/@ScottYuJan
+[11] https://www.youtube.com/watch?v=3GBPYRG9jM0
+[12] https://www.youtube.com/@2ynthetic
+[13] https://www.youtube.com/watch?v=4xMo2PsLi3c
+[14] https://www.youtube.com/watch?v=1RqBrl0-qOA
+[15] https://johnnydecimal.com/
+[16] https://www.youtube.com/@casey
+[17] https://www.youtube.com/watch?v=vb60rrtTddQ
+[18] https://www.ryanhoover.me/post/why-i-never-change-my-profile-pic
+[19] https://www.marksimonson.com/notebook/view/RoyalTenenbaumsWorldofFutura
+[20] https://en.wikipedia.org/wiki/Steve_Jobs
+[21] https://teenage.engineering/
+[22] https://scandinavianmind.com/feature/human-touch-interview-jesper-kouthoofd-teenage-engineering
+[23] https://en.wikipedia.org/wiki/La_Linea_(TV_series)
+[24] https://stephango.com/hybridize
+[25] https://stephango.com/buy-wisely
+[26] https://stephango.com/vault
+[27] https://stephango.com/flexoki
+[28] https://stephango.com/buy-wisely
+[29] https://stephango.com/concise
+[30] https://stephango.com/scars
+[31] https://stephango.com/optimism
+[32] https://stephango.com/quality-software
+[33] https://stephango.com/understand
+[34] https://stephango.com/nibble
+[35] https://stephango.com/todos
+[36] https://stephango.com/calmness
+[37] https://stephango.com/subscribe
+[38] https://stephango.com/feed.xml
+[39] https://twitter.com/kepano
+[40] https://stephango.com/subscribe
+[45] https://twitter.com/kepano
+[46] https://mastodon.social/@kepano
diff --git a/static/archive/stephenn-com-kbiijs.txt b/static/archive/stephenn-com-kbiijs.txt
index 6664a3c..bcd0f3d 100644
--- a/static/archive/stephenn-com-kbiijs.txt
+++ b/static/archive/stephenn-com-kbiijs.txt
@@ -1,71 +1,65 @@
- [1]Stephen's Tech Blog
+[1]Stephen's Tech Blog
- * [2]Webhook Wizard 🧙♂️
+ • [2]Webhook Wizard 🧙♂️
- Gopher Wrangling. Effective error handling in Go
+Gopher Wrangling. Effective error handling in Go
- June 19, 2023 · 4 min · Stephen Nancekivell
+June 19, 2023 · 4 min · Stephen Nancekivell
+Table of Contents
- Table of Contents
+ □ [3]Guiding principle
+ • [4]1. Always handle errors
+ • [5]2. Log errors in one layer
+ • [6]3. Returning async errors
+ • [7]4. Wrapping errors
+ • [8]5. Downgrade errors Warnings
- * [3]Guiding principle
+When programming in Go, the amount of error handling is something that slaps
+you in the face. Most API’s you deal with will expose errors. It can become
+overwhelming, but with a few tips and a guiding principle we can make handling
+errors easy, keep our code clean and give you the confidence that nothing is
+breaking in production.
- [4]1. Always handle errors
+A cartoon of a crazy stressed programmer pulling their hair out in front of
+lots of screens showing a error exclamation marks
- [5]2. Log errors in one layer
-
- [6]3. Returning async errors
-
- [7]4. Wrapping errors
-
- [8]5. Downgrade errors Warnings
-
- When programming in Go, the amount of error handling is something that
- slaps you in the face. Most API’s you deal with will expose errors. It
- can become overwhelming, but with a few tips and a guiding principle we
- can make handling errors easy, keep our code clean and give you the
- confidence that nothing is breaking in production.
-
- A cartoon of a crazy stressed programmer pulling their hair out in
- front of lots of screens showing a error exclamation marks
-
- A cartoon of a crazy stressed programmer pulling their hair out in
- front of lots of screens showing a error exclamation marks
+ A cartoon of a crazy stressed programmer pulling their hair out in front of
+ lots of screens showing a error exclamation marks
Guiding principle[9]#
- The goal for our error handling strategy is that it should require
- minimal effort and provide an easy way to debug any errors that do
- occur.
+The goal for our error handling strategy is that it should require minimal
+effort and provide an easy way to debug any errors that do occur.
- We wont cover strategies like retrying because they are less common and
- also expose errors.
+We wont cover strategies like retrying because they are less common and also
+expose errors.
1. Always handle errors[10]#
- Always handle errors. Sometimes it’s tempting to skip one, you might
- not expect that error to ever happen. But that’s why it’s an exception!
- You need to handle it so that you can find out clearly if it ever does
- happen.
+Always handle errors. Sometimes it’s tempting to skip one, you might not expect
+that error to ever happen. But that’s why it’s an exception! You need to handle
+it so that you can find out clearly if it ever does happen.
- If you don’t handle the error, the expected value will be something
- else and just lead to another error that will be harder to debug, or
- worse it could lead to data corruption.
+If you don’t handle the error, the expected value will be something else and
+just lead to another error that will be harder to debug, or worse it could lead
+to data corruption.
- In most cases to handle the error all you need to do is return it to
- the caller of your method, where they can log it.
+In most cases to handle the error all you need to do is return it to the caller
+of your method, where they can log it.
- For example, when refreshing some data you might load it, then save it.
- If you skip the error handling it could overwrite potentially useful
- data with corrupt data.
+For example, when refreshing some data you might load it, then save it. If you
+skip the error handling it could overwrite potentially useful data with corrupt
+data.
+
+👎 Bad error handling
- 👎 Bad error handling
func refresh() {
bytes, _ := loadData()
saveData(bytes)
}
- 👍 Good error handling
+👍 Good error handling
+
func refresh() error {
bytes, err := loadData()
if err != nil {
@@ -76,19 +70,19 @@ func refresh() error {
2. Log errors in one layer[11]#
- You always want to log your errors, ideally to something that will
- notify you about the error, so you can fix it. There is no point
- logging the error multiple times at every layer. Make it the top
- layer’s responsibility and don’t log in any services or lower level
- code.
+You always want to log your errors, ideally to something that will notify you
+about the error, so you can fix it. There is no point logging the error
+multiple times at every layer. Make it the top layer’s responsibility and don’t
+log in any services or lower level code.
- Make sure your logging framework is including stack traces so you can
- trace the error to its cause.
+Make sure your logging framework is including stack traces so you can trace the
+error to its cause.
- For example in a web app you would log the error in the http handler
- when returning the Internal Server status code.
+For example in a web app you would log the error in the http handler when
+returning the Internal Server status code.
+
+👍 Good error handling
- 👍 Good error handling
func refresh() error {
bytes, err := loadData()
if err != nil {
@@ -97,8 +91,7 @@ func refresh() error {
saveData(bytes)
}
-func (h *handlers) handleRefreshRequest(w http.ResponseWriter, r *http.Request)
-{
+func (h *handlers) handleRefreshRequest(w http.ResponseWriter, r *http.Request) {
err := refresh()
if err != nil {
log.Error("unexpected error processing request %w", err)
@@ -111,12 +104,12 @@ func (h *handlers) handleRefreshRequest(w http.ResponseWriter, r *http.Request)
3. Returning async errors[12]#
- When processing data concurrently using a go-func’s, it can be annoying
- to return the error. But if you don’t your app will be less
- maintainable. To handle async errors, return them via a channel to the
- calling thread.
+When processing data concurrently using a go-func’s, it can be annoying to
+return the error. But if you don’t your app will be less maintainable. To
+handle async errors, return them via a channel to the calling thread.
+
+👎 Bad error handling
- 👎 Bad error handling
func refreshManyConcurrently() {
go func(){
refresh(1)
@@ -127,7 +120,8 @@ func refreshManyConcurrently() {
}()
}
- 👍 Good error handling
+👍 Good error handling
+
func refreshManyConcurrently() error {
errors := make(chan error, 2)
go func(){
@@ -140,8 +134,9 @@ func refreshManyConcurrently() error {
return multierror.Combine(<-errors, <- errors)
}
- When calling functions that return a value and a possible error using a
- type like Result[T], to wrap the response to pass on the channel.
+When calling functions that return a value and a possible error using a type
+like Result[T], to wrap the response to pass on the channel.
+
type Result[T any] struct {
Value T
Error error
@@ -149,29 +144,27 @@ type Result[T any] struct {
4. Wrapping errors[13]#
- Sometimes you want to add additional context to an error message. Eg to
- include the id of the request that caused the error. You can use
- fmt.error for this.
+Sometimes you want to add additional context to an error message. Eg to include
+the id of the request that caused the error. You can use fmt.error for this.
+
err := saveToDb(user)
if err != nil {
- return fmt.errorf("unexpected error saving user. userId=%v error=%w", user.I
-d, err)
+ return fmt.errorf("unexpected error saving user. userId=%v error=%w", user.Id, err)
}
- Usually this isn’t necessary and its better to just return the error
- unwrapped.
+Usually this isn’t necessary and its better to just return the error unwrapped.
5. Downgrade errors Warnings[14]#
- There are types of errors that regularly occur during normal operation.
- The system might not be able to prevent them all the time, but they
- don’t need to investigate every time. It is better to treat them as
- warnings rather than errors. These might be for things like timeouts or
- intermittent connection errors.
+There are types of errors that regularly occur during normal operation. The
+system might not be able to prevent them all the time, but they don’t need to
+investigate every time. It is better to treat them as warnings rather than
+errors. These might be for things like timeouts or intermittent connection
+errors.
- 👍 Good error handling
-func (h *handlers) handleRefreshRequest(w http.ResponseWriter, r *http.Request)
-{
+👍 Good error handling
+
+func (h *handlers) handleRefreshRequest(w http.ResponseWriter, r *http.Request) {
err := refresh()
if err != nil {
if err == context.DeadlineExceeded {
@@ -187,43 +180,40 @@ func (h *handlers) handleRefreshRequest(w http.ResponseWriter, r *http.Request)
w.WriteHeader(http.StatusOK)
}
- [15]« Prev
- PDFs on the Fly: Programmatically Transforming Webpages into PDFs
- [16]Next »
- How to Serve Web Sockets with Http4s
+[15]« Prev
+PDFs on the Fly: Programmatically Transforming Webpages into PDFs [16]Next »
+How to Serve Web Sockets with Http4s
+[17][18][19][20][21][22]
+[23]© 2023 [24]Stephen's Tech Blog
+[25][26][27][28]
- © 2023 [17]Stephen's Tech Blog
+References:
-References
-
- Visible links:
- 1. https://stephenn.com/
- 2. https://webhookwizard.com/
- 3. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#guiding-principle
- 4. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#1-always-handle-errors
- 5. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#2-log-errors-in-one-layer
- 6. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#3-returning-async-errors
- 7. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#4-wrapping-errors
- 8. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#5-downgrade-errors-warnings
- 9. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#guiding-principle
- 10. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#1-always-handle-errors
- 11. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#2-log-errors-in-one-layer
- 12. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#3-returning-async-errors
- 13. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#4-wrapping-errors
- 14. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#5-downgrade-errors-warnings
- 15. https://stephenn.com/2023/06/pdfs-on-the-fly-programmatically-transforming-webpages-into-pdfs/
- 16. https://stephenn.com/2022/07/web-sockets-with-http4s/
- 17. https://stephenn.com/
-
- Hidden links:
- 19. https://twitter.com/intent/tweet/?text=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f&hashtags=
- 20. https://www.linkedin.com/shareArticle?mini=true&url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f&title=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&summary=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&source=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
- 21. https://reddit.com/submit?url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f&title=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go
- 22. https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
- 23. https://api.whatsapp.com/send?text=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go%20-%20https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
- 24. https://telegram.me/share/url?text=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
- 25. https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#top
- 26. https://github.com/stephennancekivell
- 27. https://twitter.com/hi_stephen_n
- 28. https://www.linkedin.com/in/stephen-nancekivell-77003039
- 29. https://stackoverflow.com/users/893854/stephen
+[1] https://stephenn.com/
+[2] https://webhookwizard.com/
+[3] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#guiding-principle
+[4] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#1-always-handle-errors
+[5] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#2-log-errors-in-one-layer
+[6] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#3-returning-async-errors
+[7] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#4-wrapping-errors
+[8] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#5-downgrade-errors-warnings
+[9] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#guiding-principle
+[10] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#1-always-handle-errors
+[11] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#2-log-errors-in-one-layer
+[12] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#3-returning-async-errors
+[13] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#4-wrapping-errors
+[14] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#5-downgrade-errors-warnings
+[15] https://stephenn.com/2023/06/pdfs-on-the-fly-programmatically-transforming-webpages-into-pdfs/
+[16] https://stephenn.com/2022/07/web-sockets-with-http4s/
+[17] https://twitter.com/intent/tweet/?text=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f&hashtags=
+[18] https://www.linkedin.com/shareArticle?mini=true&url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f&title=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&summary=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&source=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
+[19] https://reddit.com/submit?url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f&title=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go
+[20] https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
+[21] https://api.whatsapp.com/send?text=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go%20-%20https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
+[22] https://telegram.me/share/url?text=Gopher%20Wrangling.%20Effective%20error%20handling%20in%20Go&url=https%3a%2f%2fstephenn.com%2f2023%2f06%2fgopher-wrangling.-effective-error-handling-in-go%2f
+[23] https://stephenn.com/2023/06/gopher-wrangling.-effective-error-handling-in-go/#top
+[24] https://stephenn.com/
+[25] https://github.com/stephennancekivell
+[26] https://twitter.com/hi_stephen_n
+[27] https://www.linkedin.com/in/stephen-nancekivell-77003039
+[28] https://stackoverflow.com/users/893854/stephen
diff --git a/static/archive/taylor-town-5siv9a.txt b/static/archive/taylor-town-5siv9a.txt
index 8cbba07..88f2b27 100644
--- a/static/archive/taylor-town-5siv9a.txt
+++ b/static/archive/taylor-town-5siv9a.txt
@@ -1,191 +1,182 @@
- [1]taylor.town
+[1]taylor.town
+[2]about [3]now [4]spam [5]rss [6]hire
- [2]about [3]now [4]spam [5]rss [6]hire
+cloaca maxima
- cloaca maxima
+When to Build Millennia Sewers
- When to Build Millennia Sewers
+In the mid-1800s, [7]every building in central Chicago was raised 10ft (30m).
+Yes, they literally used [8]jackscrews to lift entire city blocks up
+one-by-one.
- In the mid-1800s, [7]every building in central Chicago was raised 10ft
- (30m). Yes, they literally used [8]jackscrews to lift entire city
- blocks up one-by-one.
+Chicago had to [9]hotfix production because they built the city on the
+shoreline of Lake Michigan, where filth accumulated without natural drainage.
+They lifted the entire city after it was built so they could add sewers and
+prevent flooding.
- Chicago had to [9]hotfix production because they built the city on the
- shoreline of Lake Michigan, where filth accumulated without natural
- drainage. They lifted the entire city after it was built so they could
- add sewers and prevent flooding.
+For comparison, Rome’s [10]Cloaca Maxima (“Greatest Sewer”) is still in-use
+after 2,400 years.
- For comparison, Rome’s [10]Cloaca Maxima (“Greatest Sewer”) is still
- in-use after 2,400 years.
+So why didn’t Chicago just build it right the first time?
- So why didn’t Chicago just build it right the first time?
- * [11]Irreversible Decisions
- * [12]Unintended vs. Unforeseen
- * [13]Always Scale Down
- * [14]Labor & Materials
- * [15]Awful Architecture
+ • [11]Irreversible Decisions
+ • [12]Unintended vs. Unforeseen
+ • [13]Always Scale Down
+ • [14]Labor & Materials
+ • [15]Awful Architecture
Irreversible Decisions
- Some decisions are consequential and irreversible or nearly
- irreversible – one-way doors – and these decisions must be made
- methodically, carefully, slowly, with great deliberation and
- consultation. If you walk through and don’t like what you see on the
- other side, you can’t get back to where you were before. We can call
- these Type 1 decisions. But most decisions aren’t like that – they
- are changeable, reversible – they’re two-way doors. If you’ve made a
- suboptimal Type 2 decision, you don’t have to live with the
- consequences for that long. You can reopen the door and go back
- through. Type 2 decisions can and should be made quickly by high
- judgment individuals or small groups.
+ Some decisions are consequential and irreversible or nearly irreversible –
+ one-way doors – and these decisions must be made methodically, carefully,
+ slowly, with great deliberation and consultation. If you walk through and
+ don’t like what you see on the other side, you can’t get back to where you
+ were before. We can call these Type 1 decisions. But most decisions aren’t
+ like that – they are changeable, reversible – they’re two-way doors. If
+ you’ve made a suboptimal Type 2 decision, you don’t have to live with the
+ consequences for that long. You can reopen the door and go back through.
+ Type 2 decisions can and should be made quickly by high judgment
+ individuals or small groups.
- As organizations get larger, there seems to be a tendency to use the
- heavy-weight Type 1 decision-making process on most decisions,
- including many Type 2 decisions. The end result of this is slowness,
- unthoughtful risk aversion, failure to experiment sufficiently, and
- consequently diminished invention. We’ll have to figure out how to
- fight that tendency.
+ As organizations get larger, there seems to be a tendency to use the
+ heavy-weight Type 1 decision-making process on most decisions, including
+ many Type 2 decisions. The end result of this is slowness, unthoughtful
+ risk aversion, failure to experiment sufficiently, and consequently
+ diminished invention. We’ll have to figure out how to fight that tendency.
- – [16]Jeff Bezos
+ – [16]Jeff Bezos
- The Cloaca Maxima didn’t magically start out as the Greatest Sewer. It
- began as an open-air canal, then was modified and renovated and
- connected to the aqueducts.
+The Cloaca Maxima didn’t magically start out as the Greatest Sewer. It began as
+an open-air canal, then was modified and renovated and connected to the
+aqueducts.
- The Romans probably made mistakes, but they didn’t make any wrong
- irreversible decisions. To build something that lasts, make sure the
- architecture is correct where it counts.
+The Romans probably made mistakes, but they didn’t make any wrong irreversible
+decisions. To build something that lasts, make sure the architecture is correct
+where it counts.
- The Chicago sewage disaster was technically reversible, but extremely
- expensive and painful.
+The Chicago sewage disaster was technically reversible, but extremely expensive
+and painful.
- Put “wiggle-room” in your architecture. Plan for repairs. Add
- backdoors, engine-hoods, seams, and spaces. Emergency plans are
- generally cheap to include in early phases of design.
+Put “wiggle-room” in your architecture. Plan for repairs. Add backdoors,
+engine-hoods, seams, and spaces. Emergency plans are generally cheap to include
+in early phases of design.
Unintented vs. Unforeseen
- [17]Exxon executives knew that CO₂ emissions would harm Earth.
+[17]Exxon executives knew that CO₂ emissions would harm Earth.
- Exxon willfully ignored its own research. Climate change was unintended
- but not unforeseen.
+Exxon willfully ignored its own research. Climate change was unintended but not
+unforeseen.
- Prophets are silenced when apocalypses seem bad for business.
+Prophets are silenced when apocalypses seem bad for business.
- But remember – all apocalypses are opportunities for entrepeneurship.
- Exxon could’ve made billions by diversifying themselves with renewable
- energy. They acted against their own self-interest by ignoring their
- facts.
+But remember – all apocalypses are opportunities for entrepeneurship. Exxon
+could’ve made billions by diversifying themselves with renewable energy. They
+acted against their own self-interest by ignoring their facts.
- To prevent long-term disaster, solve the hard problem of aligning
- incentives. Build systems so that all constituents predict and prevent
- impending doom.
+To prevent long-term disaster, solve the hard problem of aligning incentives.
+Build systems so that all constituents predict and prevent impending doom.
- Transparency thwarts [18]own goals. It’s difficult to do stupid things
- when you do stupid things publicly.
+Transparency thwarts [18]own goals. It’s difficult to do stupid things when you
+do stupid things publicly.
Always Scale Down
- There’s really two ways to design things. You can either sort of
- start with small things and scale them up or you could start with
- big things and scale them down…
+ There’s really two ways to design things. You can either sort of start with
+ small things and scale them up or you could start with big things and scale
+ them down…
- So suppose you want to build a system for like 10,000 people to use
- simultaneously. One way of doing it would be to start with the
- system, design it for 10 people and test it like that and scale it
- up 10,000. The other way would be to design it for like 100,000,000
- people – I mean do the design for that – and then scale it down to
- tens of thousands. You might not get the same architecture. You
- might get a completely different architecture. In fact, you would
- get a different architecture.
+ So suppose you want to build a system for like 10,000 people to use
+ simultaneously. One way of doing it would be to start with the system,
+ design it for 10 people and test it like that and scale it up 10,000. The
+ other way would be to design it for like 100,000,000 people – I mean do the
+ design for that – and then scale it down to tens of thousands. You might
+ not get the same architecture. You might get a completely different
+ architecture. In fact, you would get a different architecture.
- And I think it’s a really bad idea to start at a design for 10 or
- 100 things and scale it up. It’s better to start with an
- architecture that you know will work for a few trillion things and
- scale it down. It will actually be less efficient when you’ve got
- your 10,000 things than when you scaled up, but you’ll know that
- you’ll be able to scale it up later. So it’s good.
+ And I think it’s a really bad idea to start at a design for 10 or 100
+ things and scale it up. It’s better to start with an architecture that you
+ know will work for a few trillion things and scale it down. It will
+ actually be less efficient when you’ve got your 10,000 things than when you
+ scaled up, but you’ll know that you’ll be able to scale it up later. So
+ it’s good.
- So rather than ask, “how do we get to five nines?”, let’s make it
- more interesting! Let’s start at 9,999 nines reliability and scale
- it down.
+ So rather than ask, “how do we get to five nines?”, let’s make it more
+ interesting! Let’s start at 9,999 nines reliability and scale it down.
- – Joe Armstrong from [19]Systems that run forever and self-heal and
- scale
+ – Joe Armstrong from [19]Systems that run forever and self-heal and scale
- If you can afford it, throw a few extra zeroes on your designs.
+If you can afford it, throw a few extra zeroes on your designs.
Labor & Materials
- Carefully compare lifetime, labor, and materials.
+Carefully compare lifetime, labor, and materials.
- lifetime repair labor materials
- asphalt 20 years moderate $ $
- concrete 30 years difficult $ $$
- stone 100+ years easy $$$$ $$$
+ lifetime repair labor materials
+asphalt 20 years moderate $ $
+concrete 30 years difficult $ $$
+stone 100+ years easy $$$$ $$$
- Pay particular attention to labor – 9 women can’t make a baby in 1
- month.
+Pay particular attention to labor – 9 women can’t make a baby in 1 month.
- Exercise for the reader: Which is cheaper, a Nespresso machine or a
- [20]percolator?
+Exercise for the reader: Which is cheaper, a Nespresso machine or a [20]
+percolator?
Awful Architecture
- Sometimes there are no tradeoffs.
+Sometimes there are no tradeoffs.
- Some decisions are awful in every dimension.
+Some decisions are awful in every dimension.
- [21]Dvorak keyboards reduce finger fatigue using the same materials as
- QWERTY keyboards.
+[21]Dvorak keyboards reduce finger fatigue using the same materials as QWERTY
+keyboards.
- [22]Juicero famously launched a high-tech product that was inferior to
- traditional juicers [23]in every comparable way:
+[22]Juicero famously launched a high-tech product that was inferior to
+traditional juicers [23]in every comparable way:
- After taking apart the device, venture capitalist Ben Einstein
- considered the press to be “an incredibly complicated piece of
- engineering”, but that the complexity was unnecessary and likely
- arose from a lack of cost constraints during the design process. A
- simpler and cheaper implementation, suggested Einstein, would likely
- have produced much the same quality of juice at a price several
- hundred dollars cheaper.
+ After taking apart the device, venture capitalist Ben Einstein considered
+ the press to be “an incredibly complicated piece of engineering”, but that
+ the complexity was unnecessary and likely arose from a lack of cost
+ constraints during the design process. A simpler and cheaper
+ implementation, suggested Einstein, would likely have produced much the
+ same quality of juice at a price several hundred dollars cheaper.
- If you want to create lasting sewers, study sewer architecture and its
- impacts. What do good sewers have in common? What do bad sewers look
- like? What tradeoffs exist with sewage systems? Are there any
- promising-yet-untested sewer designs? Why do sewers go into disrepair?
- What societal factors prevent sewers from being made in the first
- place? Who truly controls the sewers?
+If you want to create lasting sewers, study sewer architecture and its impacts.
+What do good sewers have in common? What do bad sewers look like? What
+tradeoffs exist with sewage systems? Are there any promising-yet-untested sewer
+designs? Why do sewers go into disrepair? What societal factors prevent sewers
+from being made in the first place? Who truly controls the sewers?
- Great architects think ahead, but don’t let ambitions run amok. They
- anticipate irreversible changes and second-order effects. They consider
- all the costs – labor and materials and maintenance and environmental
- impact. They always stay ahead-of-schedule and within their budget. And
- despite the overwhelming constraints, great architects build millennia
- sewers whenever and wherever they can.
+Great architects think ahead, but don’t let ambitions run amok. They anticipate
+irreversible changes and second-order effects. They consider all the costs –
+labor and materials and maintenance and environmental impact. They always stay
+ahead-of-schedule and within their budget. And despite the overwhelming
+constraints, great architects build millennia sewers whenever and wherever they
+can.
-References
- 1. https://taylor.town/
- 2. https://taylor.town/about
- 3. https://taylor.town/now
- 4. https://newsletter.taylor.town/
- 5. https://taylor.town/feed.xml
- 6. https://taylor.town/hire-me
- 7. https://en.wikipedia.org/wiki/Raising_of_Chicago
- 8. https://en.wikipedia.org/wiki/Jack_(device)#House_jack
- 9. https://www.reddit.com/r/ProgrammerHumor/comments/blhec6/fixing_bugs_in_production/
- 10. https://en.wikipedia.org/wiki/Cloaca_Maxima
- 11. https://taylor.town/millennium-sewer#irreversible
- 12. https://taylor.town/millennium-sewer#unintended
- 13. https://taylor.town/millennium-sewer#scale-down
- 14. https://taylor.town/millennium-sewer#labor-materials
- 15. https://taylor.town/millennium-sewer#awful
- 16. https://www.sec.gov/Archives/edgar/data/1018724/000119312516530910/d168744dex991.htm
- 17. https://en.wikipedia.org/wiki/ExxonMobil_climate_change_denial
- 18. https://en.wikipedia.org/wiki/Own_goal
- 19. https://www.youtube-nocookie.com/embed/cNICGEwmXLU?start=433
- 20. https://en.wikipedia.org/wiki/Coffee_percolator
- 21. https://en.wikipedia.org/wiki/Dvorak_keyboard_layout
- 22. https://en.wikipedia.org/wiki/Juicero
- 23. https://en.wikipedia.org/wiki/Juicero#Criticism
+References:
+
+[1] https://taylor.town/
+[2] https://taylor.town/about
+[3] https://taylor.town/now
+[4] https://newsletter.taylor.town/
+[5] https://taylor.town/feed.xml
+[6] https://taylor.town/hire-me
+[7] https://en.wikipedia.org/wiki/Raising_of_Chicago
+[8] https://en.wikipedia.org/wiki/Jack_%28device%29#House_jack
+[9] https://www.reddit.com/r/ProgrammerHumor/comments/blhec6/fixing_bugs_in_production/
+[10] https://en.wikipedia.org/wiki/Cloaca_Maxima
+[11] https://taylor.town/millennium-sewer#irreversible
+[12] https://taylor.town/millennium-sewer#unintended
+[13] https://taylor.town/millennium-sewer#scale-down
+[14] https://taylor.town/millennium-sewer#labor-materials
+[15] https://taylor.town/millennium-sewer#awful
+[16] https://www.sec.gov/Archives/edgar/data/1018724/000119312516530910/d168744dex991.htm
+[17] https://en.wikipedia.org/wiki/ExxonMobil_climate_change_denial
+[18] https://en.wikipedia.org/wiki/Own_goal
+[19] https://www.youtube-nocookie.com/embed/cNICGEwmXLU?start=433
+[20] https://en.wikipedia.org/wiki/Coffee_percolator
+[21] https://en.wikipedia.org/wiki/Dvorak_keyboard_layout
+[22] https://en.wikipedia.org/wiki/Juicero
+[23] https://en.wikipedia.org/wiki/Juicero#Criticism
diff --git a/static/archive/techxplore-com-8o7hmu.txt b/static/archive/techxplore-com-8o7hmu.txt
index 10d7d9a..a480c27 100644
--- a/static/archive/techxplore-com-8o7hmu.txt
+++ b/static/archive/techxplore-com-8o7hmu.txt
@@ -1,629 +1,674 @@
- #[1]top [2]search [3]All news stories [4]Spotlight news only
+[1] logotype
+Topics
- [5]logotype
- (BUTTON) Topics
- * [6]Week's top
- * [7]Latest news
- * [8]Unread news
- * [9]Subscribe
+ • [3]Week's top
+ • [4]Latest news
+ • [5]Unread news
+ • [6]Subscribe
- ____________________ (BUTTON)
-
- (BUTTON)
+[7][ ]
+[10]
Science X Account
- ____________________
- ____________________
- [X] Remember me
- (BUTTON) Sign In
+[14][ ]
+[15][ ]
+[16][*] Remember me
+Sign In
- [10]Click here to sign in with or
+[18] Click here to sign in with or
- [11]Forget Password?
- [12]Not a member? Sign up
+[19]Forget Password?
- [13]Learn more
+[20]Not a member? Sign up
- * [14]Automotive
- * [15]Business
- * [16]Computer Sciences
- * [17]Consumer & Gadgets
- * [18]Electronics & Semiconductors
- * [19]Energy & Green Tech
- * [20]Engineering
- * [21]Hardware
- * [22]Hi Tech & Innovation
- * [23]Internet
- * [24]Machine learning & AI
- * [25]Other
- * [26]Robotics
- * [27]Security
- * [28]Software
- * [29]Telecom
+[21]Learn more
- [INS: :INS]
- * (BUTTON)
- * share this!
- * [30]114
- * [31]32
- * [32]Share
- * [33]Email
+ • [22]Automotive
+ • [23]Business
+ • [24]Computer Sciences
+ • [25]Consumer & Gadgets
+ • [26]Electronics & Semiconductors
+ • [27]Energy & Green Tech
+ • [28]Engineering
+ • [29]Hardware
+ • [30]Hi Tech & Innovation
+ • [31]Internet
+ • [32]Machine learning & AI
+ • [33]Other
+ • [34]Robotics
+ • [35]Security
+ • [36]Software
+ • [37]Telecom
- 1. [34]Home
- 2. [35]Consumer & Gadgets
+[INS::INS]
- 1. [36]Home
- 2. [37]Computer Sciences
+ •
+ • share this!
- *
- *
- *
- __________________________________________________________________
+ • [39]
- June 29, 2023
- [38]Editors' notes
+ 114
- This article has been reviewed according to Science X's [39]editorial
- process and [40]policies. [41]Editors have highlighted the following
- attributes while ensuring the content's credibility:
+ • [40]
- fact-checked
+ 32
- trusted source
+ • [41]
- proofread
+ Share
+
+ • [42]
+
+ Email
+
+ 1. [43]Home
+ 2. [44] Consumer & Gadgets
+
+ 1. [45]Home
+ 2. [46] Computer Sciences
+
+ • [47]
+ • [48]
+ • [49]
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[50]
+
+June 29, 2023
+
+[51] Editors' notes
+
+This article has been reviewed according to Science X's [52]editorial process
+and [53]policies. [54]Editors have highlighted the following attributes while
+ensuring the content's credibility:
+
+fact-checked
+
+trusted source
+
+proofread
We are wasting up to 20% of our time on computer problems, says study
- by [42]University of Copenhagen
- computer Credit: Unsplash/CC0 Public Domain
+by [55]University of Copenhagen
- Even though our computers are now better than 15 years ago, they still
- malfunction 11%–20% of the time, a new study from the University of
- Copenhagen and Roskilde University concludes. The researchers behind
- the study therefore find that there are major gains to be achieved for
- society by rethinking the systems and involving users more in their
- development.
+computer Credit: Unsplash/CC0 Public Domain
- An endlessly rotating beach ball, a program that [43]crashes without
- saving data or systems that require illogical procedures or simply do
- not work: Unfortunately, struggling with computers is still a familiar
- situation for most of us. Tearing your hair out over computers that do
- not work remains very common among users, according to new Danish
- research.
+Even though our computers are now better than 15 years ago, they still
+malfunction 11%–20% of the time, a new study from the University of Copenhagen
+and Roskilde University concludes. The researchers behind the study therefore
+find that there are major gains to be achieved for society by rethinking the
+systems and involving users more in their development.
- In fact, so much that on average, we waste 11%–20% of our time in front
- of our computers on systems that do not work or that are so difficult
- to understand that we cannot perform the task we want to. And this is
- far from being good enough, says Professor Kasper Hornbæk, one of the
- researchers behind the study.
+An endlessly rotating beach ball, a program that [56]crashes without saving
+data or systems that require illogical procedures or simply do not work:
+Unfortunately, struggling with computers is still a familiar situation for most
+of us. Tearing your hair out over computers that do not work remains very
+common among users, according to new Danish research.
- "It's incredible that the figure is so high. However, most people
- experience frustration when using computers and can tell a horror story
- about an important PowerPoint presentation that was not saved or a
- system that crashed at a critical moment. Everyone knows that it is
- difficult to create IT systems that match people's needs, but the
- figure should be much lower, and one thing that it shows is that
- [44]ordinary people aren't involved enough when the systems are
- developed," he says.
+In fact, so much that on average, we waste 11%–20% of our time in front of our
+computers on systems that do not work or that are so difficult to understand
+that we cannot perform the task we want to. And this is far from being good
+enough, says Professor Kasper Hornbæk, one of the researchers behind the study.
- Professor Morten Hertzum, the other researcher behind the study,
- emphasizes that most frustrations are experienced in connection with
- the performance of completely ordinary tasks.
+"It's incredible that the figure is so high. However, most people experience
+frustration when using computers and can tell a horror story about an important
+PowerPoint presentation that was not saved or a system that crashed at a
+critical moment. Everyone knows that it is difficult to create IT systems that
+match people's needs, but the figure should be much lower, and one thing that
+it shows is that [57]ordinary people aren't involved enough when the systems
+are developed," he says.
- "The frustrations are not due to people using their computers for
- something highly advanced, but because they experience problems in
- their performance of everyday tasks. This makes it easier to involve
- users in identifying problems. But it also means that problems that are
- not identified and solved will probably frustrate a large number of
- users," says Morten Hertzum.
- [INS: :INS]
+Professor Morten Hertzum, the other researcher behind the study, emphasizes
+that most frustrations are experienced in connection with the performance of
+completely ordinary tasks.
+
+"The frustrations are not due to people using their computers for something
+highly advanced, but because they experience problems in their performance of
+everyday tasks. This makes it easier to involve users in identifying problems.
+But it also means that problems that are not identified and solved will
+probably frustrate a large number of users," says Morten Hertzum.
+
+[INS::INS]
The problems are only too recognizable
- To examine this issue, the researchers have been assisted by 234
- participants who spend between six and eight hours in front of a
- computer in their day-to-day work.
+To examine this issue, the researchers have been assisted by 234 participants
+who spend between six and eight hours in front of a computer in their
+day-to-day work.
- During one hour, the researchers told them to report the situations in
- which the computer would not work properly, or where the participants
- were frustrated about not being able to perform the task they wanted.
+During one hour, the researchers told them to report the situations in which
+the computer would not work properly, or where the participants were frustrated
+about not being able to perform the task they wanted.
- The problems most often experienced by the participants included: "the
- system was slow," "the system froze temporarily," "the system crashed,"
- "it is difficult to find things." The participants had backgrounds such
- as student, accountant, consultant, but several of them actually worked
- in the IT industry.
+The problems most often experienced by the participants included: "the system
+was slow," "the system froze temporarily," "the system crashed," "it is
+difficult to find things." The participants had backgrounds such as student,
+accountant, consultant, but several of them actually worked in the IT industry.
- "A number of the participants in the survey were IT professionals,
- while most of the other participants were highly competent IT and
- computer users. Nevertheless, they encountered these problems, and it
- turns out that this involves some fundamental functions," says Kasper
- Hornbæk.
+"A number of the participants in the survey were IT professionals, while most
+of the other participants were highly competent IT and computer users.
+Nevertheless, they encountered these problems, and it turns out that this
+involves some fundamental functions," says Kasper Hornbæk.
- The participants in the survey also responded that 84% of the episodes
- had occurred before and that 87% of the episodes could happen again.
- And, according to Kasper Hornbæk, we are having the same fundamental
- problems today that we had 15–20 years ago.
+The participants in the survey also responded that 84% of the episodes had
+occurred before and that 87% of the episodes could happen again. And, according
+to Kasper Hornbæk, we are having the same fundamental problems today that we
+had 15–20 years ago.
- "The two biggest categories of problems are still about insufficient
- performance and lack of user-friendliness," he says.
+"The two biggest categories of problems are still about insufficient
+performance and lack of user-friendliness," he says.
- Morten Hertzum adds, "Our technology can do more today, and it has also
- become better, but at the same time, we expect more from it. Even
- though downloads are faster now, they are often still experienced as
- frustratingly slow. "
+Morten Hertzum adds, "Our technology can do more today, and it has also become
+better, but at the same time, we expect more from it. Even though downloads are
+faster now, they are often still experienced as frustratingly slow. "
88% use a computer at work
- According to Statistics Denmark, 88% of Danes used computers, laptops,
- smartphones, tablets or other mobile devices at work in 2018. In this
- context, the new study indicates that a half to a whole day of a normal
- working week may be wasted on computer problems.
+According to Statistics Denmark, 88% of Danes used computers, laptops,
+smartphones, tablets or other mobile devices at work in 2018. In this context,
+the new study indicates that a half to a whole day of a normal working week may
+be wasted on computer problems.
- "There is a lot of productivity lost in workplaces throughout Denmark
- because people are unable to perform their ordinary work because the
- computer is not running as it should. It also causes a lot of
- frustrations for the individual user," says Kasper Hornbæk.
+"There is a lot of productivity lost in workplaces throughout Denmark because
+people are unable to perform their ordinary work because the computer is not
+running as it should. It also causes a lot of frustrations for the individual
+user," says Kasper Hornbæk.
- This means that there are major benefits to be gained for society if we
- experienced fewer problems in front of our computers. According to
- Kasper Hornbæk, the gains can, for example, be achieved if more
- resources are invested in rethinking how faults are presented to us on
- the computer.
+This means that there are major benefits to be gained for society if we
+experienced fewer problems in front of our computers. According to Kasper
+Hornbæk, the gains can, for example, be achieved if more resources are invested
+in rethinking how faults are presented to us on the computer.
- "Part of the solution may be to shield us from knowing that the
- computer is working to solve a problem. In reality, there is no reason
- why we need to look at an incomprehensible box with commands or a
- frozen computer. The [45]computer could easily solve the problems
- without displaying this, while it provided a back-up version of the
- system for us, so that we could continue to work with our tasks
- undisturbed," says Kasper Hornbæk.
+"Part of the solution may be to shield us from knowing that the computer is
+working to solve a problem. In reality, there is no reason why we need to look
+at an incomprehensible box with commands or a frozen computer. The [58]computer
+could easily solve the problems without displaying this, while it provided a
+back-up version of the system for us, so that we could continue to work with
+our tasks undisturbed," says Kasper Hornbæk.
- At the same time, IT developers should involve the users even more when
- designing the systems to make them as easy to use—and understand—as
- possible, because according to the researcher, there are no poor IT
- users, only poor systems.
+At the same time, IT developers should involve the users even more when
+designing the systems to make them as easy to use—and understand—as possible,
+because according to the researcher, there are no poor IT users, only poor
+systems.
- "When we're all surrounded by IT systems that we're cursing, it's very
- healthy to ascertain that it's probably not the [46]users that are the
- problem, but those who make the systems. The study clearly shows that
- there is still much room for improvement, and we therefore hope that it
- can create more focus on making more user-friendly systems in the
- future," concludes Kasper Hornbæk.
+"When we're all surrounded by IT systems that we're cursing, it's very healthy
+to ascertain that it's probably not the [59]users that are the problem, but
+those who make the systems. The study clearly shows that there is still much
+room for improvement, and we therefore hope that it can create more focus on
+making more user-friendly systems in the future," concludes Kasper Hornbæk.
- More information: Morten Hertzum et al, Frustration: Still a Common
- User Experience, ACM Transactions on Computer-Human Interaction (2023).
- [47]DOI: 10.1145/3582432
- Provided by [48]University of Copenhagen
- Citation: We are wasting up to 20% of our time on computer problems,
- says study (2023, June 29) retrieved 16 January 2024 from
- https://techxplore.com/news/2023-06-problems.html
- This document is subject to copyright. Apart from any fair dealing for
- the purpose of private study or research, no part may be reproduced
- without the written permission. The content is provided for information
- purposes only.
- __________________________________________________________________
+More information: Morten Hertzum et al, Frustration: Still a Common User
+Experience, ACM Transactions on Computer-Human Interaction (2023). [60]DOI:
+10.1145/3582432
+Provided by [61]University of Copenhagen [62]
+Citation: We are wasting up to 20% of our time on computer problems, says study
+(2023, June 29) retrieved 17 January 2024 from https://techxplore.com/news/
+2023-06-problems.html
+This document is subject to copyright. Apart from any fair dealing for the
+purpose of private study or research, no part may be reproduced without the
+written permission. The content is provided for information purposes only.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- Explore further
- [49]Computer 'brains' solving mysteries of human behaviour
- __________________________________________________________________
+Explore further
- [50]148 shares
- * [51]Facebook
- * [52]Twitter
- * [53]Email
+[63]Computer 'brains' solving mysteries of human behaviour
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[64]148 shares
- [54]
+ • [65]
- Feedback to editors
+ Facebook
- * [55]Featured
- * [56]Last Comments
- * [57]Popular
+ • [66]
-[58]Team at Anthropic finds LLMs can be made to engage in deceptive behaviors
+ Twitter
- 11 hours ago
+ • [67]
- 0
+ Email
-[59]Model outlines how ionic blockades influence energy recovery in forward
+[68]
+
+Feedback to editors
+
+ • [69]Featured
+ • [70]Last Comments
+ • [71]Popular
+
+[72]Using AI to develop a battery that uses less lithium
+
+1 hour ago
+
+0
+
+[73]The solution space of the spherical negative perceptron model is
+star-shaped, researchers find
+
+4 hours ago
+
+0
+
+[74]Team at Anthropic finds LLMs can be made to engage in deceptive behaviors
+
+23 hours ago
+
+1
+
+[75]Model outlines how ionic blockades influence energy recovery in forward
bias bipolar membranes
- Jan 15, 2024
+Jan 15, 2024
- 0
+0
-[60]A new method to develop recyclable, organic and flexible electronics
+[76]A new method to develop recyclable, organic and flexible electronics
- Jan 10, 2024
+Jan 10, 2024
- 0
+0
-[61]Light-emitting textiles for diverse flexible and wearable displays
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[77] [gif]
- Jan 9, 2024
+Smart devices' ambient light sensors pose imaging privacy risk
- 0
+1 hour ago
-[62]A robot that can play video games with humans
+[78] [gif]
- Jan 9, 2024
+New tech addresses augmented reality's privacy problem
- 1
- __________________________________________________________________
+1 hour ago
+
+[79] [gif]
+
+Using AI to develop a battery that uses less lithium
+
+1 hour ago
+
+[80] [gif]
+
+The solution space of the spherical negative perceptron model is star-shaped,
+researchers find
+
+4 hours ago
+
+[81] [gif]
Team develops a new deepfake detector designed to be less biased
- 8 hours ago
+21 hours ago
+
+[82] [gif]
From cannabis harvest to flexible solar panels: Using organic electronics to
develop next-gen devices
- 11 hours ago
+23 hours ago
+
+[83] [gif]
Team at Anthropic finds LLMs can be made to engage in deceptive behaviors
- 11 hours ago
+23 hours ago
+
+[84] [gif]
Volocopter flying taxi seeks to seduce Paris
- 12 hours ago
+Jan 16, 2024
-Engineers propose hybrid urban water sourcing model using reclaimed
-wastewater
+[85] [gif]
- 12 hours ago
+Engineers propose hybrid urban water sourcing model using reclaimed wastewater
+
+Jan 16, 2024
+
+[86] [gif]
Africa's chance for green electricity
- 12 hours ago
+Jan 16, 2024
-Squishy, metal-free magnets to power robots and guide medical implants
+[INS::INS]
- 13 hours ago
+ • Related Stories
-Material science advance could lead to airplanes that optimize their shape in
-flight
+ [87] [gif]
- 13 hours ago
+ Computer 'brains' solving mysteries of human behaviour
-Discovery enables cost-effective and eco-friendly green hydrogen production
+ Oct 14, 2016
- 13 hours ago
+ [88] [gif]
-Advancement in thermoelectricity could light up the Internet of Things
+ The quantum computer already exists, but is not all that powerful
- 18 hours ago
- [INS: :INS]
+ May 16, 2023
- *
+ [89] [gif]
-Related Stories
+ Q&A: Expert discusses how to realistically achieve quantum speedups beyond
+ the hype
-Computer 'brains' solving mysteries of human behaviour
- Oct 14, 2016
+ May 26, 2023
-The quantum computer already exists, but is not all that powerful
- May 16, 2023
+ [90] [gif]
-Q&A: Expert discusses how to realistically achieve quantum speedups beyond
-the hype
- May 26, 2023
+ Tiny quantum computer solves real optimization problem
-Tiny quantum computer solves real optimization problem
- Dec 17, 2020
+ Dec 17, 2020
-New software allows nonspecialists to intuitively train machines using
-gestures
- Oct 31, 2022
+ [91] [gif]
-Scalable photonic computer solves the subset sum problem
- Feb 3, 2020
- *
+ New software allows nonspecialists to intuitively train machines using
+ gestures
-Recommended for you
+ Oct 31, 2022
-Team develops a new deepfake detector designed to be less biased
- 8 hours ago
+ [92] [gif]
-Zeroing in on the origins of bias in large language models
- Jan 15, 2024
+ Scalable photonic computer solves the subset sum problem
-Robot baristas and AI chefs caused a stir at CES 2024 as casino union workers
-fear for their jobs
- Jan 14, 2024
+ Feb 3, 2020
-At CES, gadgets to make everyday life easier
- Jan 13, 2024
+ • Recommended for you
-Scientists show how shallow learning mechanism used by the brain can compete
-with deep learning
- Jan 12, 2024
+ [93] [gif]
-Novel AI framework generates images from nothing
- Jan 11, 2024
+ Smart devices' ambient light sensors pose imaging privacy risk
- IFRAME:
- [63]//js.trendmd.com/trendmd.amp.html?title=We%20are%20wasting%20up%20t
- o%2020%25%20of%20our%20time%20on%20computer%20problems%2C%20says%20stud
- y&url=https%3A%2F%2Ftechxplore.com%2Fnews%2F2023-06-problems.html&journ
- alId=73746
+ 1 hour ago
- [64]Load comments (0)
+ [94] [gif]
+
+ New tech addresses augmented reality's privacy problem
+
+ 1 hour ago
+
+ [95] [gif]
+
+ The solution space of the spherical negative perceptron model is
+ star-shaped, researchers find
+
+ 4 hours ago
+
+ [96] [gif]
+
+ Team develops a new deepfake detector designed to be less biased
+
+ 21 hours ago
+
+ [97] [gif]
+
+ Zeroing in on the origins of bias in large language models
+
+ Jan 15, 2024
+
+ [98] [gif]
+
+ Robot baristas and AI chefs caused a stir at CES 2024 as casino union
+ workers fear for their jobs
+
+ Jan 14, 2024
+
+[99] Load comments (0)
Let us know if there is a problem with our content
- (BUTTON)
+Use this form if you have come across a typo, inaccuracy or would like to send
+an edit request for the content on this page. For general inquiries, please use
+our [101]contact form. For general feedback, use the public comments section
+below (please [102]adhere to guidelines).
- Use this form if you have come across a typo, inaccuracy or would like
- to send an edit request for the content on this page. For general
- inquiries, please use our [65]contact form. For general feedback, use
- the public comments section below (please [66]adhere to guidelines).
+Please select the most appropriate category to facilitate processing of your
+request
- Please select the most appropriate category to facilitate processing of
- your request
- [-- please select one --______]
- Your message to the editors
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- Your email (only if you want to be contacted back) ____________________
- (BUTTON) Send Feedback
+[103][-- please select one -- ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+Your message to the editors [ ]
+Your email (only if you want to be contacted back) [105][ ]
+Send Feedback
- Thank you for taking time to provide your feedback to the editors.
+Thank you for taking time to provide your feedback to the editors.
- Your feedback is important to us. However, we do not guarantee
- individual replies due to the high volume of messages.
+Your feedback is important to us. However, we do not guarantee individual
+replies due to the high volume of messages.
E-mail the story
We are wasting up to 20% of our time on computer problems, says study
- (BUTTON)
- Your friend's email ____________________
- Your email ____________________
- [ ] I would like to subscribe to Science X Newsletter. [67]Learn more
- Your name ____________________
+Your friend's email [108][ ]
+Your email [109][ ]
+[110][ ] I would like to subscribe to Science X Newsletter. [111]Learn more
+Your name [112][ ]
Note
- Your email address is used only to let the recipient know who sent the
- email. Neither your address nor the recipient's address will be used
- for any other purpose. The information you enter will appear in your
- e-mail message and is not retained by Tech Xplore in any form.
- Your message
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- (BUTTON) Send
+Your email address is used only to let the recipient know who sent the email.
+Neither your address nor the recipient's address will be used for any other
+purpose. The information you enter will appear in your e-mail message and is
+not retained by Tech Xplore in any form.
- (BUTTON)
-
- Phys.org logotype
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+ [ ]
+Your message [ ]
+Send
+[116] Phys.org logotype
Phys.org
- Daily science news on research developments and the latest scientific
- innovations
- MedicalXpress logotype
+Daily science news on research developments and the latest scientific
+innovations
+
+[117] MedicalXpress logotype
Medical Xpress
- Medical research advances and health news
- ScienceX logotype
+Medical research advances and health news
+
+[118] ScienceX logotype
Science X
- The most comprehensive sci-tech news coverage on the web
+The most comprehensive sci-tech news coverage on the web
Newsletters
- ____________________
- (BUTTON) Subscribe
- Science X Daily and the Weekly Email Newsletter are free features that
- allow you to receive your favorite sci-tech news updates in your email
- inbox
-
+[119][ ]
+Subscribe
+Science X Daily and the Weekly Email Newsletter are free features that allow
+you to receive your favorite sci-tech news updates in your email inbox
Follow us
- *
- *
- *
- *
+ • [122]
+ • [123]
+ • [124]
+ • [125]
- * [68]Top
- * [69]Home
- * [70]Search
- * [71]Mobile version
+ • [126]Top
+ • [127]Home
+ • [128]Search
+ • [129]Mobile version
- * [72]Help
- * [73]FAQ
- * [74]About
- * [75]Contact
+ • [130]Help
+ • [131]FAQ
+ • [132]About
+ • [133]Contact
- * [76]Science X Account
- * [77]Premium Account
- * [78]Newsletter
- * [79]Archive
+ • [134]Science X Account
+ • [135]Premium Account
+ • [136]Newsletter
+ • [137]Archive
- * [80]Android app
- * [81]iOS app
- * [82]RSS feeds
- * [83]Push notification
+ • [138]Android app
+ • [139]iOS app
+ • [140]RSS feeds
+ • [141]Push notification
- © Tech Xplore 2014 - 2024 powered by [84]Science X Network
- [85]Privacy policy [86]Terms of use
+© Tech Xplore 2014 - 2024 powered by [142]Science X Network
+[143]Privacy policy [144]Terms of use
Your Privacy
- This site uses cookies to assist with navigation, analyse your use of
- our services, collect data for ads personalisation and provide content
- from third parties. By using our site, you acknowledge that you have
- read and understand our [87]Privacy Policy and [88]Terms of Use.
- [89]I'm OK with that [90]Cookie options
+This site uses cookies to assist with navigation, analyse your use of our
+services, collect data for ads personalisation and provide content from third
+parties. By using our site, you acknowledge that you have read and understand
+our [145]Privacy Policy and [146]Terms of Use.
- (BUTTON)
+[147]I'm OK with that [148]Cookie options
E-mail newsletter
- ____________________
- (BUTTON) Subscribe
-
+[150][ ]
+Subscribe
Follow us
- *
- *
- *
- *
+ • [153]
+ • [154]
+ • [155]
+ • [156]
- [91]It appears that you are currently using Ad Blocking software. What
- are the consequences? (BUTTON) ×
+[157] It appears that you are currently using Ad Blocking software. What are
+the consequences? ×
+Quantcast
- Quantcast
+References:
-References
-
- Visible links:
- 1. https://techxplore.com/
- 2. https://techxplore.com/search/
- 3. https://techxplore.com/rss-feed/
- 4. https://techxplore.com/rss-feed/breaking/
- 5. https://techxplore.com/
- 6. https://techxplore.com/weekly-news/
- 7. https://techxplore.com/latest-news/
- 8. https://techxplore.com/unread-news/
- 9. https://techxplore.com/news/2023-06-problems.html
- 10. https://sciencex.com/profile/login/
- 11. https://sciencex.com/profile/pwdreset/
- 12. https://sciencex.com/profile/register/
- 13. https://sciencex.com/help/account/
- 14. https://techxplore.com/automotive-news/
- 15. https://techxplore.com/business-tech-news/
- 16. https://techxplore.com/computer-sciences-news/
- 17. https://techxplore.com/consumer-gadgets-news/
- 18. https://techxplore.com/semiconductors-news/
- 19. https://techxplore.com/energy-green-tech-news/
- 20. https://techxplore.com/engineering-news/
- 21. https://techxplore.com/hardware-news/
- 22. https://techxplore.com/hi-tech-news/
- 23. https://techxplore.com/internet-news/
- 24. https://techxplore.com/machine-learning-ai-news/
- 25. https://techxplore.com/other-news/
- 26. https://techxplore.com/robotics-news/
- 27. https://techxplore.com/security-news/
- 28. https://techxplore.com/software-news/
- 29. https://techxplore.com/telecom-news/
- 30. javascript:void(0)
- 31. https://techxplore.com/news/2023-06-problems.html
- 32. https://techxplore.com/news/2023-06-problems.html
- 33. mailto:/
- 34. https://techxplore.com/
- 35. https://techxplore.com/consumer-gadgets-news/
- 36. https://techxplore.com/
- 37. https://techxplore.com/computer-sciences-news/
- 38. javascript:void(0)
- 39. https://sciencex.com/help/editorial-process/
- 40. https://sciencex.com/help/editorial-standards/
- 41. https://sciencex.com/help/editorial-team/
- 42. http://www.ku.dk/english/
- 43. https://techxplore.com/tags/crashes/
- 44. https://techxplore.com/tags/ordinary+people/
- 45. https://techxplore.com/tags/computer/
- 46. https://techxplore.com/tags/users/
- 47. https://dx.doi.org/10.1145/3582432
- 48. https://techxplore.com/partners/university-of-copenhagen/
- 49. https://techxplore.com/news/2016-10-brains-mysteries-human-behaviour.html
- 50. javascript:void(0)
- 51. javascript:void(0)
- 52. https://techxplore.com/news/2023-06-problems.html
- 53. https://techxplore.com/news/2023-06-problems.html
- 54. https://techxplore.com/news/2023-06-problems.html
- 55. https://techxplore.com/news/2023-06-problems.html#nav-featured
- 56. https://techxplore.com/news/2023-06-problems.html#nav-commented
- 57. https://techxplore.com/news/2023-06-problems.html#nav-popular
- 58. https://techxplore.com/news/2024-01-team-anthropic-llms-engage-deceptive.html
- 59. https://techxplore.com/news/2024-01-outlines-ionic-blockades-energy-recovery.html
- 60. https://techxplore.com/news/2024-01-method-recyclable-flexible-electronics.html
- 61. https://techxplore.com/news/2024-01-emitting-textiles-diverse-flexible-wearable.html
- 62. https://techxplore.com/news/2024-01-robot-play-video-games-humans.html
- 63. https://js.trendmd.com/trendmd.amp.html?title=We are wasting up to 20% of our time on computer problems, says study&url=https://techxplore.com/news/2023-06-problems.html&journalId=73746
- 64. Javascript:void(0);
- 65. https://sciencex.com/help/feedback/
- 66. https://sciencex.com/help/comments/
- 67. https://sciencex.com/help/newsletter/
- 68. https://techxplore.com/news/2023-06-problems.html
- 69. https://techxplore.com/
- 70. https://techxplore.com/search/
- 71. https://techxplore.com/news/2023-06-problems.html?deviceType=mobile
- 72. https://sciencex.com/help/
- 73. https://sciencex.com/help/contactus/
- 74. https://sciencex.com/help/about-us/
- 75. https://sciencex.com/help/feedback/
- 76. https://sciencex.com/profile/
- 77. https://sciencex.com/help/donate/
- 78. https://sciencex.com/help/newsletter/
- 79. https://techxplore.com/archive/
- 80. https://play.google.com/store/apps/details?id=com.PhysOrg.TechXplore
- 81. https://itunes.apple.com/us/app/tech-xplore/id1154953172?mt=8
- 82. https://techxplore.com/feeds/
- 83. javascript:void(0)
- 84. https://sciencex.com/
- 85. https://sciencex.com/help/privacy/
- 86. https://sciencex.com/help/terms/
- 87. https://sciencex.com/help/privacy/
- 88. https://sciencex.com/help/terms/
- 89. https://techxplore.com/news/2023-06-problems.html
- 90. https://sciencex.com/help/cookies/
- 91. https://sciencex.com/help/adblock/
-
- Hidden links:
- 93. https://techxplore.com/news/2023-06-problems.html
- 94. javascript:void(0)
- 95. https://techxplore.com/news/2023-06-problems.pdf
- 96. javascript:window.print()
- 97. https://techxplore.com/archive/29-06-2023/
- 98. http://www.ku.dk/english/
- 99. https://techxplore.com/news/2024-01-team-deepfake-detector-biased.html
- 100. https://techxplore.com/news/2024-01-cannabis-harvest-flexible-solar-panels.html
- 101. https://techxplore.com/news/2024-01-team-anthropic-llms-engage-deceptive.html
- 102. https://techxplore.com/news/2024-01-volocopter-flying-taxi-seduce-paris.html
- 103. https://techxplore.com/news/2024-01-hybrid-urban-sourcing-reclaimed-wastewater.html
- 104. https://techxplore.com/news/2024-01-africa-chance-green-electricity.html
- 105. https://techxplore.com/news/2024-01-squishy-metal-free-magnets-power.html
- 106. https://techxplore.com/news/2024-01-material-science-advance-airplanes-optimize.html
- 107. https://techxplore.com/news/2024-01-discovery-enables-effective-eco-friendly.html
- 108. https://techxplore.com/news/2024-01-advancement-thermoelectricity-internet.html
- 109. https://techxplore.com/news/2016-10-brains-mysteries-human-behaviour.html
- 110. https://techxplore.com/news/2023-05-quantum-powerful.html
- 111. https://techxplore.com/news/2023-05-qa-expert-discusses-realistically-quantum.html
- 112. https://phys.org/news/2020-12-tiny-quantum-real-optimization-problem.html
- 113. https://techxplore.com/news/2022-10-software-nonspecialists-intuitively-machines-gestures.html
- 114. https://phys.org/news/2020-02-scalable-photonic-subset-sum-problem.html
- 115. https://techxplore.com/news/2024-01-team-deepfake-detector-biased.html
- 116. https://techxplore.com/news/2024-01-zeroing-bias-large-language.html
- 117. https://techxplore.com/news/2024-01-robot-baristas-ai-chefs-ces.html
- 118. https://techxplore.com/news/2024-01-ces-gadgets-everyday-life-easier.html
- 119. https://techxplore.com/news/2024-01-scientists-shallow-mechanism-brain-deep.html
- 120. https://techxplore.com/news/2024-01-ai-framework-generates-images.html
- 121. https://phys.org/
- 122. https://medicalxpress.com/
- 123. https://sciencex.com/
- 124. https://www.facebook.com/TechxploreCom
- 125. https://twitter.com/techxplore_com
- 126. https://www.linkedin.com/company/tech-xplore/
- 127. https://techxplore.com/feeds/
- 128. https://www.facebook.com/TechxploreCom
- 129. https://twitter.com/techxplore_com
- 130. https://www.linkedin.com/company/tech-xplore/
- 131. https://techxplore.com/feeds/
+[1] https://techxplore.com/
+[3] https://techxplore.com/weekly-news/
+[4] https://techxplore.com/latest-news/
+[5] https://techxplore.com/unread-news/
+[6] https://techxplore.com/news/2023-06-problems.html#
+[10] https://techxplore.com/news/2023-06-problems.html#
+[18] https://sciencex.com/profile/login/
+[19] https://sciencex.com/profile/pwdreset/
+[20] https://sciencex.com/profile/register/
+[21] https://sciencex.com/help/account/
+[22] https://techxplore.com/automotive-news/
+[23] https://techxplore.com/business-tech-news/
+[24] https://techxplore.com/computer-sciences-news/
+[25] https://techxplore.com/consumer-gadgets-news/
+[26] https://techxplore.com/semiconductors-news/
+[27] https://techxplore.com/energy-green-tech-news/
+[28] https://techxplore.com/engineering-news/
+[29] https://techxplore.com/hardware-news/
+[30] https://techxplore.com/hi-tech-news/
+[31] https://techxplore.com/internet-news/
+[32] https://techxplore.com/machine-learning-ai-news/
+[33] https://techxplore.com/other-news/
+[34] https://techxplore.com/robotics-news/
+[35] https://techxplore.com/security-news/
+[36] https://techxplore.com/software-news/
+[37] https://techxplore.com/telecom-news/
+[39] javascript:void(0)
+[40] https://techxplore.com/news/2023-06-problems.html#
+[41] https://techxplore.com/news/2023-06-problems.html#
+[42] mailto:
+[43] https://techxplore.com/
+[44] https://techxplore.com/consumer-gadgets-news/
+[45] https://techxplore.com/
+[46] https://techxplore.com/computer-sciences-news/
+[47] javascript:void(0)
+[48] https://techxplore.com/news/2023-06-problems.pdf
+[49] javascript:window.print()
+[50] https://techxplore.com/archive/29-06-2023/
+[51] javascript:void(0)
+[52] https://sciencex.com/help/editorial-process/
+[53] https://sciencex.com/help/editorial-standards/
+[54] https://sciencex.com/help/editorial-team/
+[55] http://www.ku.dk/english/
+[56] https://techxplore.com/tags/crashes/
+[57] https://techxplore.com/tags/ordinary+people/
+[58] https://techxplore.com/tags/computer/
+[59] https://techxplore.com/tags/users/
+[60] https://dx.doi.org/10.1145/3582432
+[61] https://techxplore.com/partners/university-of-copenhagen/
+[62] http://www.ku.dk/english/
+[63] https://techxplore.com/news/2016-10-brains-mysteries-human-behaviour.html
+[64] javascript:void(0)
+[65] javascript:void(0)
+[66] https://techxplore.com/news/2023-06-problems.html#
+[67] https://techxplore.com/news/2023-06-problems.html#
+[68] https://techxplore.com/news/2023-06-problems.html#
+[69] https://techxplore.com/news/2023-06-problems.html#nav-featured
+[70] https://techxplore.com/news/2023-06-problems.html#nav-commented
+[71] https://techxplore.com/news/2023-06-problems.html#nav-popular
+[72] https://techxplore.com/news/2024-01-ai-battery-lithium.html
+[73] https://techxplore.com/news/2024-01-solution-space-spherical-negative-perceptron.html
+[74] https://techxplore.com/news/2024-01-team-anthropic-llms-engage-deceptive.html
+[75] https://techxplore.com/news/2024-01-outlines-ionic-blockades-energy-recovery.html
+[76] https://techxplore.com/news/2024-01-method-recyclable-flexible-electronics.html
+[77] https://techxplore.com/news/2024-01-smart-devices-ambient-sensors-pose.html
+[78] https://techxplore.com/news/2024-01-tech-augmented-reality-privacy-problem.html
+[79] https://techxplore.com/news/2024-01-ai-battery-lithium.html
+[80] https://techxplore.com/news/2024-01-solution-space-spherical-negative-perceptron.html
+[81] https://techxplore.com/news/2024-01-team-deepfake-detector-biased.html
+[82] https://techxplore.com/news/2024-01-cannabis-harvest-flexible-solar-panels.html
+[83] https://techxplore.com/news/2024-01-team-anthropic-llms-engage-deceptive.html
+[84] https://techxplore.com/news/2024-01-volocopter-flying-taxi-seduce-paris.html
+[85] https://techxplore.com/news/2024-01-hybrid-urban-sourcing-reclaimed-wastewater.html
+[86] https://techxplore.com/news/2024-01-africa-chance-green-electricity.html
+[87] https://techxplore.com/news/2016-10-brains-mysteries-human-behaviour.html
+[88] https://techxplore.com/news/2023-05-quantum-powerful.html
+[89] https://techxplore.com/news/2023-05-qa-expert-discusses-realistically-quantum.html
+[90] https://phys.org/news/2020-12-tiny-quantum-real-optimization-problem.html
+[91] https://techxplore.com/news/2022-10-software-nonspecialists-intuitively-machines-gestures.html
+[92] https://phys.org/news/2020-02-scalable-photonic-subset-sum-problem.html
+[93] https://techxplore.com/news/2024-01-smart-devices-ambient-sensors-pose.html
+[94] https://techxplore.com/news/2024-01-tech-augmented-reality-privacy-problem.html
+[95] https://techxplore.com/news/2024-01-solution-space-spherical-negative-perceptron.html
+[96] https://techxplore.com/news/2024-01-team-deepfake-detector-biased.html
+[97] https://techxplore.com/news/2024-01-zeroing-bias-large-language.html
+[98] https://techxplore.com/news/2024-01-robot-baristas-ai-chefs-ces.html
+[99] Javascript:void(0);
+[101] https://sciencex.com/help/feedback/
+[102] https://sciencex.com/help/comments/
+[111] https://sciencex.com/help/newsletter/
+[116] https://phys.org/
+[117] https://medicalxpress.com/
+[118] https://sciencex.com/
+[122] https://www.facebook.com/TechxploreCom
+[123] https://twitter.com/techxplore_com
+[124] https://www.linkedin.com/company/tech-xplore/
+[125] https://techxplore.com/feeds/
+[126] https://techxplore.com/news/2023-06-problems.html#
+[127] https://techxplore.com/
+[128] https://techxplore.com/search/
+[129] https://techxplore.com/news/2023-06-problems.html?deviceType=mobile
+[130] https://sciencex.com/help/
+[131] https://sciencex.com/help/contactus/
+[132] https://sciencex.com/help/about-us/
+[133] https://sciencex.com/help/feedback/
+[134] https://sciencex.com/profile/
+[135] https://sciencex.com/help/donate/
+[136] https://sciencex.com/help/newsletter/
+[137] https://techxplore.com/archive/
+[138] https://play.google.com/store/apps/details?id=com.PhysOrg.TechXplore
+[139] https://itunes.apple.com/us/app/tech-xplore/id1154953172?mt=8
+[140] https://techxplore.com/feeds/
+[141] javascript:void(0)
+[142] https://sciencex.com/
+[143] https://sciencex.com/help/privacy/
+[144] https://sciencex.com/help/terms/
+[145] https://sciencex.com/help/privacy/
+[146] https://sciencex.com/help/terms/
+[147] https://techxplore.com/news/2023-06-problems.html#
+[148] https://sciencex.com/help/cookies/
+[153] https://www.facebook.com/TechxploreCom
+[154] https://twitter.com/techxplore_com
+[155] https://www.linkedin.com/company/tech-xplore/
+[156] https://techxplore.com/feeds/
+[157] https://sciencex.com/help/adblock/
diff --git a/static/archive/thesweetsetup-com-99zpkj.txt b/static/archive/thesweetsetup-com-99zpkj.txt
index b640c90..dca82ad 100644
--- a/static/archive/thesweetsetup-com-99zpkj.txt
+++ b/static/archive/thesweetsetup-com-99zpkj.txt
@@ -1,278 +1,249 @@
- #[1]The Sweet Setup [2]alternate [3]alternate [4]alternate
+fbpx *
- fbpx [tr?id=1547247442291447&ev=PageView &noscript=1]
+FREE! Plan Your Ideal Week: Bonus Workshop + Planner → Get the Workshop
- IFRAME: [5]https://www.googletagmanager.com/ns.html?id=GTM-PS7L89F
+[1]The Sweet SetupThe Sweet Setup
+[2]ABOUT [3]COURSES [4]BLOG
+[5]Sign In
- FREE! Plan Your Ideal Week: Bonus Workshop + Planner → Get the
- Workshop
+ • [6]Categories
+ □ [7]Mindfulness
+ □ [8]Workflows
+ □ [9]Setups
+ □ [10]Quick Tips
- [6]The Sweet Setup The Sweet Setup
- [7]ABOUT [8]COURSES [9]BLOG
- [10]Sign In
+[11]
+[12][ ] [13][Go]
+How to Create an Effective Weekly Schedule
- * [11]Categories
- + [12]Mindfulness
- + [13]Workflows
- + [14]Setups
- + [15]Quick Tips
+April 24, 2023
+by [14]Isaac Smith
- ____________________ Go
+HeroHero
How to Create an Effective Weekly Schedule
- April 24, 2023
- by [16]Isaac Smith
+Have you ever finished a week feeling like your to-do list got longer with each
+passing day?
- Hero Hero
+Even though each day was a flurry of activity, it feels like no matter how hard
+you try and regardless of how much you do, it seems impossible to make
+progress. I can relate. And there were a lot of weeks this was my reality.
-How to Create an Effective Weekly Schedule
+But it’s been a while since I’ve had one of those weeks. And as a whole, they
+have become a lot less common. I would attribute much of this due to my weekly
+and daily planning process.
- Have you ever finished a week feeling like your to-do list got longer
- with each passing day?
+Every Monday for the past 5 years, I’ve taken the first 15 minutes to plan the
+week ahead.
- Even though each day was a flurry of activity, it feels like no matter
- how hard you try and regardless of how much you do, it seems impossible
- to make progress. I can relate. And there were a lot of weeks this was
- my reality.
+For me, this has been my single greatest productivity routine. Before being
+sucked in to the myriad of inboxes and notifications, I take a brief moment to
+identify and plan what is truly important for the week ahead.
- But it’s been a while since I’ve had one of those weeks. And as a
- whole, they have become a lot less common. I would attribute much of
- this due to my weekly and daily planning process.
+Part of this planning process includes accounting for the unmovable rocks in my
+schedule. Meetings, errands, when the kids need picking up, the things I know
+are going to happen on a specific day and time. These events act as guardrails
+in my schedule. Hard stopping points in which I know I’ll have to transition
+out of “get things done” mode.
- Every Monday for the past 5 years, I’ve taken the first 15 minutes to
- plan the week ahead.
-
- For me, this has been my single greatest productivity routine. Before
- being sucked in to the myriad of inboxes and notifications, I take a
- brief moment to identify and plan what is truly important for the week
- ahead.
-
- Part of this planning process includes accounting for the unmovable
- rocks in my schedule. Meetings, errands, when the kids need picking up,
- the things I know are going to happen on a specific day and time. These
- events act as guardrails in my schedule. Hard stopping points in which
- I know I’ll have to transition out of “get things done” mode.
-
- With a framework of my week sketched out, I set myself to the task of
- painting what done or progress looks like. First, what two or three
- projects do I need to push forward? Second, what are the two to four
- tasks associated with each project? And what does “done” mean? The more
- specific the better.
+With a framework of my week sketched out, I set myself to the task of painting
+what done or progress looks like. First, what two or three projects do I need
+to push forward? Second, what are the two to four tasks associated with each
+project? And what does “done” mean? The more specific the better.
Targets
- In every sport, there is a clear objective — get the ball into the
- basket, hit the target, get to home base, etc. Strategy and tactics may
- differ, but ultimately there is clarity on what it means to win. That
- clarity allows for an endless number of ways to achieve success. The
- rules and boundaries actually cause creativity to thrive within their
- confines.
+In every sport, there is a clear objective — get the ball into the basket, hit
+the target, get to home base, etc. Strategy and tactics may differ, but
+ultimately there is clarity on what it means to win. That clarity allows for an
+endless number of ways to achieve success. The rules and boundaries actually
+cause creativity to thrive within their confines.
- When we give ourselves clear objectives (targets) to aim for through
- planning, we increase our ability to be creative. A lack of clarity
- leads to confusion, inefficiency, and ultimately, frustration.
+When we give ourselves clear objectives (targets) to aim for through planning,
+we increase our ability to be creative. A lack of clarity leads to confusion,
+inefficiency, and ultimately, frustration.
- When there is a lack of clarity, people waste time and energy on the
- trivial many. When they have sufficient levels of clarity, they are
- capable of greater breakthroughs and innovations—greater than people
- even realize they ought to have—in those areas that are truly vital.
- —Greg McKeown
+ When there is a lack of clarity, people waste time and energy on the
+ trivial many. When they have sufficient levels of clarity, they are capable
+ of greater breakthroughs and innovations—greater than people even realize
+ they ought to have—in those areas that are truly vital. —Greg McKeown
- For me, the planning process gives me time and space to identify what
- is truly important. This results in clarity of what needs to be done.
- That clarity moves me to precise action.
+For me, the planning process gives me time and space to identify what is truly
+important. This results in clarity of what needs to be done. That clarity moves
+me to precise action.
Winning Each Day
- Once I’ve outlined my weekly plan, I turn my attention to the day
- ahead.
+Once I’ve outlined my weekly plan, I turn my attention to the day ahead.
- Weekly plan Weekly plan
+Weekly planWeekly plan
- The same principles that guide my weekly plan are also true for daily
- planning. Greater clarity on what I’m trying to accomplish leads to
- taking action.
+The same principles that guide my weekly plan are also true for daily planning.
+Greater clarity on what I’m trying to accomplish leads to taking action.
- This does not mean my tasks do not involve any level of ambiguity.
- Often in the doing of something, greater clarity comes as a result. I
- try to remove any guesswork for myself in planning out my tasks.
+This does not mean my tasks do not involve any level of ambiguity. Often in the
+doing of something, greater clarity comes as a result. I try to remove any
+guesswork for myself in planning out my tasks.
- Instead of assigning myself the task, “write weekly newsletter” I may
- start with instead “outline weekly newsletter on restoring margin.” A
- smaller, bite-size, specific task.
+Instead of assigning myself the task, “write weekly newsletter” I may start
+with instead “outline weekly newsletter on restoring margin.” A smaller,
+bite-size, specific task.
- I’ve found my limit is typically three important tasks (MITs) for each
- day. And usually I only have enough brain power for two deep work
- tasks. Things that require a large chunk of un-interrupted focus and
- creativity. If I assign myself five deep work tasks in a single day,
- it’s unlikely I’ll get through three of them, and I’ll finish the day
- feeling behind.
+I’ve found my limit is typically three important tasks (MITs) for each day. And
+usually I only have enough brain power for two deep work tasks. Things that
+require a large chunk of un-interrupted focus and creativity. If I assign
+myself five deep work tasks in a single day, it’s unlikely I’ll get through
+three of them, and I’ll finish the day feeling behind.
- The real secret to winning each day has been planning my three MITs the
- day before.
+The real secret to winning each day has been planning my three MITs the day
+before.
- At the end of each day I review what I accomplished and compare that to
- my plan for the week. Then, I look at my schedule for the next day and
- plan the two to three tasks I will tackle.
+At the end of each day I review what I accomplished and compare that to my plan
+for the week. Then, I look at my schedule for the next day and plan the two to
+three tasks I will tackle.
- * * *
+* * *
- All of this leads to a remarkable level of calm and responsiveness to
- my work, rather than feeling frantic and reactive.
+All of this leads to a remarkable level of calm and responsiveness to my work,
+rather than feeling frantic and reactive.
- I’m able to be proactive in managing my workload rather than just
- surviving the dog-pile nature of incoming requests.
+I’m able to be proactive in managing my workload rather than just surviving the
+dog-pile nature of incoming requests.
- The more I lean into the 4-Focus Method, the more I find it working for
- me.
+The more I lean into the 4-Focus Method, the more I find it working for me.
- IDENTIFY → PLAN → ACT → CELEBRATE
+IDENTIFY → PLAN → ACT → CELEBRATE
- Studio spread Studio spread
+Studio spreadStudio spread
- My 15-minute planning session on Monday mornings has changed the way I
- get work done. And thankfully, it’s rare to find myself absolutely
- buried on Friday as I wrap up my week.
+My 15-minute planning session on Monday mornings has changed the way I get work
+done. And thankfully, it’s rare to find myself absolutely buried on Friday as I
+wrap up my week.
- There will always be more work to do, but I know I’ll be able to plan
- for it when I’m back in the saddle on Monday.
+There will always be more work to do, but I know I’ll be able to plan for it
+when I’m back in the saddle on Monday.
- (P.S. We’re re-launching our task and time management course All the
- Things next month (May). 🙌 In which we cover weekly and daily planning
- extensively.)
+(P.S. We’re re-launching our task and time management course All the Things
+next month (May). 🙌 In which we cover weekly and daily planning extensively.)
-Follow us
+Follow us [15] [16]
[17]Get App Picks, Guides, & More
- Get workflow tips, app recommendations, how-to guides, stories, and
- more delivered to your inbox. Plus we'll send you our productivity
- guide for free!
+Get workflow tips, app recommendations, how-to guides, stories, and more
+delivered to your inbox. Plus we'll send you our productivity guide for free!
- ____________________
+[25][ ]
- Sweet!
+ [26][Sweet!]
-[18]Best-Selling Courses
+[27]Best-Selling Courses
-[19]🎟 All Access Pass 🎟
+[28]🎟 All Access Pass 🎟
- Join the Focus Accelerator to get instant access to the entire course
- library, resource vault, and more. [20]»
+Join the Focus Accelerator to get instant access to the entire course library,
+resource vault, and more. [29]»
-[21]NEW: All the Things
+[30]NEW: All the Things
- Best-selling productivity course. Stop being managed by your task list.
- [22]»
+Best-selling productivity course. Stop being managed by your task list. [31]»
-[23]Full Course List
+[32]Full Course List
- Serving 15,000 customers since 2013, we have a library full of in-depth
- courses to help you be more productive, creative, and focused. [24]View
- all courses »
+Serving 15,000 customers since 2013, we have a library full of in-depth courses
+to help you be more productive, creative, and focused. [33]View all courses »
-[25]The Latest Posts
+[34]The Latest Posts
-[26]Our First Look at Apple’s New Journal App
+[35]Our First Look at Apple’s New Journal App
- Let’s take a look at Apple’s new Journal app for iPhone and how it
- stacks up to one of the perennial apps on the App Store. The app has a
- long way to go, but it has some very intriguing elements to start.
- [27]»
+Let’s take a look at Apple’s new Journal app for iPhone and how it stacks up to
+one of the perennial apps on the App Store. The app has a long way to go, but
+it has some very intriguing elements to start. [36]»
-[28]Tracking Important Events with Up Ahead, Time Blocking Methods, and More
+[37]Tracking Important Events with Up Ahead, Time Blocking Methods, and More
- Catch up on what we published this week, including a look at Up Ahead
- for tracking upcoming events you're looking forward to, a guide to
- effectively using time blocking for productivity, and more. [29]»
+Catch up on what we published this week, including a look at Up Ahead for
+tracking upcoming events you're looking forward to, a guide to effectively
+using time blocking for productivity, and more. [38]»
-[30]Up Ahead Lets You Track the Important Things in Life
+[39]Up Ahead Lets You Track the Important Things in Life
- How many days is it until your next trip? How about until your
- anniversary? Or maybe that movie you’ve been waiting to see comes out?
- You can of course put all of these events on a calendar and find them
- that way, but that doesn’t really make it easy to see how long it is
- until that thing happens. That's where Up Ahead comes in. [31]»
+How many days is it until your next trip? How about until your anniversary? Or
+maybe that movie you’ve been waiting to see comes out? You can of course put
+all of these events on a calendar and find them that way, but that doesn’t
+really make it easy to see how long it is until that thing happens. That's
+where Up Ahead comes in. [40]»
-[32]The Power of Focus Themes
+[41]The Power of Focus Themes
- One of the most important concepts to learn as you figure out your 2024
- plans comes from David Allen: "You can do anything you want, but you
- can’t do everything you want." [Free Workshop this Monday] [33]»
+One of the most important concepts to learn as you figure out your 2024 plans
+comes from David Allen: "You can do anything you want, but you can’t do
+everything you want." [Free Workshop this Monday] [42]»
-[34]The CEO Who Had No Goals (Video)
+[43]The CEO Who Had No Goals (Video)
- I recently heard a surprising admission from a very successful CEO.
- [35]»
+I recently heard a surprising admission from a very successful CEO. [44]»
- * [36]Home
- * [37]About
- * [38]Products
- * [39]Contact
- * [40]Blog
- * [41]Newsletter
- * [42]Sign In
+ • [45]Home
+ • [46]About
+ • [47]Products
+ • [48]Contact
+ • [49]Blog
+ • [50]Newsletter
+ • [51]Sign In
- A website by [43]Shawn Blanc and friends. See also: [44]The Focus
- Course | [45]Tools & Toys
- © 2024 Blanc Media, LLC
- [46]Design by Ink Blot Media Group • [47]Dev by Jonathan Christopher
+A website by [52]Shawn Blanc and friends. See also: [53]The Focus Course |
+[54]Tools & Toys
+© 2024 Blanc Media, LLC
+[55]Design by Ink Blot Media Group • [56]Dev by Jonathan Christopher
+fbpx
- fbpx
+References:
-References
-
- Visible links:
- 1. https://thesweetsetup.com/feed/
- 2. https://thesweetsetup.com/wp-json/wp/v2/posts/160038
- 3. https://thesweetsetup.com/wp-json/oembed/1.0/embed?url=https://thesweetsetup.com/how-to-create-an-effective-weekly-schedule/
- 4. https://thesweetsetup.com/wp-json/oembed/1.0/embed?url=https://thesweetsetup.com/how-to-create-an-effective-weekly-schedule/&format=xml
- 5. https://www.googletagmanager.com/ns.html?id=GTM-PS7L89F
- 6. https://thesweetsetup.com/
- 7. https://thesweetsetup.com/colophon/
- 8. https://thesweetsetup.com/training/
- 9. https://thesweetsetup.com/blog/
- 10. https://thesweetsetup.com/my-account
- 11. https://thesweetsetup.com/how-to-create-an-effective-weekly-schedule/
- 12. https://thesweetsetup.com/category/mindfulness/
- 13. https://thesweetsetup.com/category/workflows/
- 14. https://thesweetsetup.com/category/sweet-setup-interview/
- 15. https://thesweetsetup.com/category/quick-tip/
- 16. https://thesweetsetup.com/author/imsmith/
- 17. https://thesweetsetup.com/newsletter/
- 18. https://thesweetsetup.com/training/
- 19. https://thesweetsetup.com/accelerator/
- 20. https://thesweetsetup.com/accelerator/
- 21. https://thesweetsetup.com/things/
- 22. https://thesweetsetup.com/things/
- 23. https://thesweetsetup.com/training/?utm_source=training_sidebar_link&utm_medium=sidebar&utm_campaign=sidebar_att
- 24. https://thesweetsetup.com/training/
- 25. https://thesweetsetup.com/blog/
- 26. https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
- 27. https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
- 28. https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
- 29. https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
- 30. https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
- 31. https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
- 32. https://thesweetsetup.com/the-power-of-focus-themes/
- 33. https://thesweetsetup.com/the-power-of-focus-themes/
- 34. https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
- 35. https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
- 36. https://thesweetsetup.com/
- 37. https://thesweetsetup.com/colophon/
- 38. https://thesweetsetup.com/training/
- 39. https://thesweetsetup.com/contact/
- 40. https://thesweetsetup.com/blog/
- 41. https://thesweetsetup.com/newsletter/
- 42. https://thesweetsetup.com/my-account
- 43. https://shawnblanc.net/
- 44. https://thefocuscourse.com/
- 45. http://toolsandtoys.net/
- 46. http://inkblotmediagroup.com/
- 47. http://mondaybynoon.com/
-
- Hidden links:
- 49. https://thesweetsetup.com/how-to-create-an-effective-weekly-schedule/
- 50. https://twitter.com/thesweetsetup
- 51. https://thesweetsetup.com/feed
+[1] https://thesweetsetup.com/
+[2] https://thesweetsetup.com/colophon/
+[3] https://thesweetsetup.com/training/
+[4] https://thesweetsetup.com/blog/
+[5] https://thesweetsetup.com/my-account
+[6] https://thesweetsetup.com/how-to-create-an-effective-weekly-schedule/#
+[7] https://thesweetsetup.com/category/mindfulness/
+[8] https://thesweetsetup.com/category/workflows/
+[9] https://thesweetsetup.com/category/sweet-setup-interview/
+[10] https://thesweetsetup.com/category/quick-tip/
+[11] https://thesweetsetup.com/how-to-create-an-effective-weekly-schedule/#
+[14] https://thesweetsetup.com/author/imsmith/
+[15] https://twitter.com/thesweetsetup
+[16] https://thesweetsetup.com/feed
+[17] https://thesweetsetup.com/newsletter/
+[27] https://thesweetsetup.com/training/
+[28] https://thesweetsetup.com/accelerator/
+[29] https://thesweetsetup.com/accelerator/
+[30] https://thesweetsetup.com/things/
+[31] https://thesweetsetup.com/things/
+[32] https://thesweetsetup.com/training/?utm_source=training_sidebar_link&utm_medium=sidebar&utm_campaign=sidebar_att
+[33] https://thesweetsetup.com/training/
+[34] https://thesweetsetup.com/blog/
+[35] https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
+[36] https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
+[37] https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
+[38] https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
+[39] https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
+[40] https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
+[41] https://thesweetsetup.com/the-power-of-focus-themes/
+[42] https://thesweetsetup.com/the-power-of-focus-themes/
+[43] https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
+[44] https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
+[45] https://thesweetsetup.com/
+[46] https://thesweetsetup.com/colophon/
+[47] https://thesweetsetup.com/training/
+[48] https://thesweetsetup.com/contact/
+[49] https://thesweetsetup.com/blog/
+[50] https://thesweetsetup.com/newsletter/
+[51] https://thesweetsetup.com/my-account
+[52] https://shawnblanc.net/
+[53] https://thefocuscourse.com/
+[54] http://toolsandtoys.net/
+[55] http://inkblotmediagroup.com/
+[56] http://mondaybynoon.com/
diff --git a/static/archive/thesweetsetup-com-x9nbdv.txt b/static/archive/thesweetsetup-com-x9nbdv.txt
index e5db8ce..b4204a9 100644
--- a/static/archive/thesweetsetup-com-x9nbdv.txt
+++ b/static/archive/thesweetsetup-com-x9nbdv.txt
@@ -1,390 +1,385 @@
- #[1]The Sweet Setup [2]alternate [3]alternate [4]alternate
+fbpx *
- fbpx [tr?id=1547247442291447&ev=PageView &noscript=1]
+FREE! Plan Your Ideal Week: Bonus Workshop + Planner → Get the Workshop
- IFRAME: [5]https://www.googletagmanager.com/ns.html?id=GTM-PS7L89F
+[1]The Sweet SetupThe Sweet Setup
+[2]ABOUT [3]COURSES [4]BLOG
+[5]Sign In
- FREE! Plan Your Ideal Week: Bonus Workshop + Planner → Get the
- Workshop
-
- [6]The Sweet Setup The Sweet Setup
- [7]ABOUT [8]COURSES [9]BLOG
- [10]Sign In
-
- * [11]Categories
- + [12]Mindfulness
- + [13]Workflows
- + [14]Setups
- + [15]Quick Tips
-
- ____________________ Go
+ • [6]Categories
+ □ [7]Mindfulness
+ □ [8]Workflows
+ □ [9]Setups
+ □ [10]Quick Tips
+[11]
+[12][ ] [13][Go]
Turning Obsidian into My Perfect Writing App
- October 24, 2022
- by [16]Mike Schmitz
+October 24, 2022
+by [14]Mike Schmitz
- NaNoWriMo (National Novel Writing Month) is right around the corner,
- and if you’re looking for a great tool to help you hit your writing
- goals, there are lots of great options available.
+NaNoWriMo (National Novel Writing Month) is right around the corner, and if
+you’re looking for a great tool to help you hit your writing goals, there are
+lots of great options available.
- In this article, I want to make the case for using [17]Obsidian by
- showing you how to turn it into a powerful writing environment using a
- few essential plugins.
+In this article, I want to make the case for using [15]Obsidian by showing you
+how to turn it into a powerful writing environment using a few essential
+plugins.
+
+[svg][obsidianwr]
But Isn’t Obsidian a Notes App?
- That’s what I thought when I first started using it a couple of years
- ago. I was hoping it would help me make connections between my notes
- and help inspire some new ideas. But over time, I fell in love with it
- as a writing tool. In fact, every article I’ve written in the last 2
- years has been written in Obsidian.
+That’s what I thought when I first started using it a couple of years ago. I
+was hoping it would help me make connections between my notes and help inspire
+some new ideas. But over time, I fell in love with it as a writing tool. In
+fact, every article I’ve written in the last 2 years has been written in
+Obsidian.
- What makes Obsidian great as a writing tool is how much you can
- customize it using third-party plugins. The number of plugins continues
- to grow (676 as of this writing), and with Obsidian recently launching
- version 1.0, the app shows no signs of slowing down any time soon.
+What makes Obsidian great as a writing tool is how much you can customize it
+using third-party plugins. The number of plugins continues to grow (676 as of
+this writing), and with Obsidian recently launching version 1.0, the app shows
+no signs of slowing down any time soon.
My Journey Away from Ulysses
- Let me get this out right now: Ulysses is an incredible writing app.
+Let me get this out right now: Ulysses is an incredible writing app.
- It’s just not for me for a couple of specific reasons.
+It’s just not for me for a couple of specific reasons.
- First, publishing to the web isn’t quite as easy as it should be with
- Ulysses. It does give you the ability to publish straight to WordPress,
- and you can even update blog posts from Ulysses now — if you can get it
- to connect to your custom WordPress blog.
+First, publishing to the web isn’t quite as easy as it should be with Ulysses.
+It does give you the ability to publish straight to WordPress, and you can even
+update blog posts from Ulysses now — if you can get it to connect to your
+custom WordPress blog.
- When this broke for me, I started digging in to how to fix it and
- quickly came across weird plugins and settings for modifying XMLRPC.
- And unfortunately, I could never get it functioning again. I fully
- understand it’s something on my domains, but the “simple instructions”
- didn’t work for me, and even as a web developer I didn’t feel
- comfortable digging too far into this.
+When this broke for me, I started digging in to how to fix it and quickly came
+across weird plugins and settings for modifying XMLRPC. And unfortunately, I
+could never get it functioning again. I fully understand it’s something on my
+domains, but the “simple instructions” didn’t work for me, and even as a web
+developer I didn’t feel comfortable digging too far into this.
- Which meant I was stuck copying and pasting into WordPress.
+Which meant I was stuck copying and pasting into WordPress.
- And because Ulysses doesn’t use standard Markdown, that meant I had to
- “export” my text first. This works, but adds a few extra clicks (or
- taps in iOS) in order to get my text out of my writing app. Combine
- that with the fact that Ulysses has some weird Markdown formatting that
- never quite clicked for me in the first place, and I was left looking
- for a straight Markdown-based text editor.
+And because Ulysses doesn’t use standard Markdown, that meant I had to “export”
+my text first. This works, but adds a few extra clicks (or taps in iOS) in
+order to get my text out of my writing app. Combine that with the fact that
+Ulysses has some weird Markdown formatting that never quite clicked for me in
+the first place, and I was left looking for a straight Markdown-based text
+editor.
- Obsidian fits that description perfectly. It’s simple, uses plain text
- files, provides inline formatting, and supports standard Markdown. It’s
- everything I’ve ever wanted in a plain text editor.
+Obsidian fits that description perfectly. It’s simple, uses plain text files,
+provides inline formatting, and supports standard Markdown. It’s everything
+I’ve ever wanted in a plain text editor.
- But there are a few additional settings and plugins you can use to make
- it even better as a writing app.
+But there are a few additional settings and plugins you can use to make it even
+better as a writing app.
Obsidian Settings
- First, let’s look at some of the settings.
+First, let’s look at some of the settings.
- To access these settings, click the gear icon in the lower-left corner
- and then select Editor from the Settings sidebar.
+To access these settings, click the gear icon in the lower-left corner and then
+select Editor from the Settings sidebar.
- The defaults are actually pretty good, but here’s the key settings you
- want if you’re going to use Obsidian for writing:
- * Make sure that Auto pair Markdown syntax is toggled ON. This
- creates both symbols and places the cursor in the middle, making it
- easier to create italicized or emphasized text.
- * Make sure Smart indent lists is toggled ON. This makes it easier to
- create bulleted and numbered lists quickly, automatically adding
- the next bullet when you hit the Return key.
- * Make sure that Fold heading and Fold indent are toggled ON. This
- creates carats for Markdown headers as well as indented text,
- adding some cool outliner-inspired features that make it easy to
- fold up text in large files and focus on the text you want.
+The defaults are actually pretty good, but here’s the key settings you want if
+you’re going to use Obsidian for writing:
- There are a bunch of other settings you can customize, but many of them
- are simply personal preference. These are the important ones.
+ • Make sure that Auto pair Markdown syntax is toggled ON. This creates both
+ symbols and places the cursor in the middle, making it easier to create
+ italicized or emphasized text.
+ • Make sure Smart indent lists is toggled ON. This makes it easier to create
+ bulleted and numbered lists quickly, automatically adding the next bullet
+ when you hit the Return key.
+ • Make sure that Fold heading and Fold indent are toggled ON. This creates
+ carats for Markdown headers as well as indented text, adding some cool
+ outliner-inspired features that make it easy to fold up text in large files
+ and focus on the text you want.
- Once you have your settings, it’s time to move on to the plugins.
+There are a bunch of other settings you can customize, but many of them are
+simply personal preference. These are the important ones.
+
+Once you have your settings, it’s time to move on to the plugins.
Obsidian Core Plugin Settings
- There are two types of plugins in Obsidian: Core plugins that ship with
- the app, and Community plugins that you can install to extend the
- functionality of Obsidian. We’re going to look at the Core plugins
- first.
+There are two types of plugins in Obsidian: Core plugins that ship with the
+app, and Community plugins that you can install to extend the functionality of
+Obsidian. We’re going to look at the Core plugins first.
- Here are my recommendations for modifying the Core plugins:
- * Make sure that Backlinks and Outgoing Links are both toggled ON.
- These are sections available in the right sidebar that show all of
- the notes that link to the active note and all of the notes linked
- to from the active note respectively. (If you’re new to the concept
- of connected notes, check out [18]this article on using the local
- graph.)
- * Make sure that Outline is toggled ON. This adds a tab in the right
- sidebar that creates a table of contents for your note based on the
- Markdown headers. This is helpful when you need to jump to a
- specific section of a longer text as you can do so simply by
- clicking on the appropriate header title.
- * Turn the Word Count setting OFF. Word counts are important, but
- there’s a Community plugin that does this much better than the
- built-in word count tool here.
+Here are my recommendations for modifying the Core plugins:
- Again, there are a bunch of options here that are personal preference,
- but these are the important ones. Once you have these Core plugins set,
- it’s time to really make Obsidian dance by adding some Community
- plugins.
+ • Make sure that Backlinks and Outgoing Links are both toggled ON. These are
+ sections available in the right sidebar that show all of the notes that
+ link to the active note and all of the notes linked to from the active note
+ respectively. (If you’re new to the concept of connected notes, check out
+ [16]this article on using the local graph.)
+ • Make sure that Outline is toggled ON. This adds a tab in the right sidebar
+ that creates a table of contents for your note based on the Markdown
+ headers. This is helpful when you need to jump to a specific section of a
+ longer text as you can do so simply by clicking on the appropriate header
+ title.
+ • Turn the Word Count setting OFF. Word counts are important, but there’s a
+ Community plugin that does this much better than the built-in word count
+ tool here.
+
+Again, there are a bunch of options here that are personal preference, but
+these are the important ones. Once you have these Core plugins set, it’s time
+to really make Obsidian dance by adding some Community plugins.
Obsidian Community Plugins for an Upgraded Writing Experience
- You can access the Community plugins public directory by going to
- Settings → Community plugins → Browse once you’ve toggled off Safe
- Mode. From there, you can find plugins for just about anything, from
- [19]embedding tasks from Todoist to [20]creating timeblocked daily
- plans to [21]creating kanban boards — all based on your locally-stored
- plain text files using standard Markdown.
+You can access the Community plugins public directory by going to Settings →
+Community plugins → Browse once you’ve toggled off Safe Mode. From there, you
+can find plugins for just about anything, from [17]embedding tasks from Todoist
+to [18]creating timeblocked daily plans to [19]creating kanban boards — all
+based on your locally-stored plain text files using standard Markdown.
- All of the plugin links I share below are Obsidian links
- (obsidian://link-adress) that will open straight to the plug-in page if
- you have Obsidian installed and running on your device.
+[svg][obsidianpl]
- Note that many of the plugins I will share here are 1:1 replacements
- for standard features in Ulysses, so if you don’t mind non-standard
- Markdown formatting and don’t run into the publishing issues that I
- did, maybe try that instead. But if you’re all in with Obsidian, here
- are the plugins I use to make Obsidian my perfect writing app.
+All of the plugin links I share below are Obsidian links (obsidian://
+link-adress) that will open straight to the plug-in page if you have Obsidian
+installed and running on your device.
+
+Note that many of the plugins I will share here are 1:1 replacements for
+standard features in Ulysses, so if you don’t mind non-standard Markdown
+formatting and don’t run into the publishing issues that I did, maybe try that
+instead. But if you’re all in with Obsidian, here are the plugins I use to make
+Obsidian my perfect writing app.
Better Word Count
- The first plugin is called [22]Better Word Count. This replaces the
- built-in word count core plugin, and it functions largely the same with
- one key addition: when you highlight text, it shows the
- words/characters of the highlighted text instead of the whole document.
+The first plugin is called [20]Better Word Count. This replaces the built-in
+word count core plugin, and it functions largely the same with one key
+addition: when you highlight text, it shows the words/characters of the
+highlighted text instead of the whole document.
- It’s not as good as the writing stats in Ulysses, but it’s good enough
- for me.
+[svg][obsidianbw]
+
+It’s not as good as the writing stats in Ulysses, but it’s good enough for me.
cMenu
- If you’re uncomfortable relying on your memory for Markdown formatting,
- [23]cMenu is a third-party plugin that gives you a minimal text editor
- modal that allows you to do things like bold, italicize, strikethrough,
- underline, and toggle blockquotes.
+If you’re uncomfortable relying on your memory for Markdown formatting, [21]
+cMenu is a third-party plugin that gives you a minimal text editor modal that
+allows you to do things like bold, italicize, strikethrough, underline, and
+toggle blockquotes.
- If you don’t like the default options, you can customize what shows up
- in the modal by adding any of the Commands in your Obsidian library.
+[svg][obsidiancm]
+
+If you don’t like the default options, you can customize what shows up in the
+modal by adding any of the Commands in your Obsidian library.
Reading Time
- Another handy Ulysses feature is being able to see how long it will
- take to read the text in the selected file. But you can add this
- feature to the status bar using the [24]Reading Time plugin.
+Another handy Ulysses feature is being able to see how long it will take to
+read the text in the selected file. But you can add this feature to the status
+bar using the [22]Reading Time plugin.
- This one is pretty straightforward — just install it and turn it on and
- you’ll see the reading time at the bottom of your Obsidian window. You
- can customize your reading speed in the settings for the plugin.
+[svg][obsidianre]
+
+This one is pretty straightforward — just install it and turn it on and you’ll
+see the reading time at the bottom of your Obsidian window. You can customize
+your reading speed in the settings for the plugin.
Footnote Shortcut
- If you use footnotes a lot, they can be a bit of a pain to create with
- standard Markdown. It’s a lot easier with the [25]Obsidian Footnotes
- plugin.^[26]1
+If you use footnotes a lot, they can be a bit of a pain to create with standard
+Markdown. It’s a lot easier with the [23]Obsidian Footnotes plugin.^[24]1
- Once installed, you can find it in the Command Palette and with the
- hotkey: Footnote Shortcut: Insert and Navigate Footnote. You can
- customize the hotkey by going to Settings → Hotkey and searching for
- Footnote, which will then insert the appropriate Markdown and navigate
- to the bottom of the note where you can insert the text for your
- footnote.
+[svg][obsidianfo]
+
+Once installed, you can find it in the Command Palette and with the hotkey:
+Footnote Shortcut: Insert and Navigate Footnote. You can customize the hotkey
+by going to Settings → Hotkey and searching for Footnote, which will then
+insert the appropriate Markdown and navigate to the bottom of the note where
+you can insert the text for your footnote.
Focus Mode
- The Obsidian interface can be a little distracting when you’re trying
- to focus on your words. Fortunately, the [27]Focus Mode plugin allows
- you to remove all the distractions and focus on what you’re writing.
+The Obsidian interface can be a little distracting when you’re trying to focus
+on your words. Fortunately, the [25]Focus Mode plugin allows you to remove all
+the distractions and focus on what you’re writing.
- Once the plugin is installed and active, just click the Toggle Focus
- Mode button to hide the sidebars and status bar, and you can
- shift-click the button to hide everything but the active writing pane.
+[svg][obsidianfo]
+
+Once the plugin is installed and active, just click the Toggle Focus Mode
+button to hide the sidebars and status bar, and you can shift-click the button
+to hide everything but the active writing pane.
Typewriter Scroll
- [28]This plugin keeps the currently selected line in the middle of the
- screen as you type. As you type, the focus moves from the current
- section to the next section by moving the rest of the page in the
- background, much like an old-fashioned typewriter.
+[26]This plugin keeps the currently selected line in the middle of the screen
+as you type. As you type, the focus moves from the current section to the next
+section by moving the rest of the page in the background, much like an
+old-fashioned typewriter.
- There’s even a Zen Mode option that grays out the background text to
- help you focus on the line that you are currently writing.
+[svg][obsidianty]
+
+There’s even a Zen Mode option that grays out the background text to help you
+focus on the line that you are currently writing.
Novel Word Count
- If you are aiming to write a book (fiction or non-fiction), you
- probably have a total word count in mind. [29]Novel Word Count shows
- you the number of words that a document or folder contains in the
- sidebar so you can keep track of your long-form writing progress.
+If you are aiming to write a book (fiction or non-fiction), you probably have a
+total word count in mind. [27]Novel Word Count shows you the number of words
+that a document or folder contains in the sidebar so you can keep track of your
+long-form writing progress.
- You can also use pages, characters, date created, and date updated (as
- well as a few different combinations) that can be configured in the
- plugin settings once you turn it on.
+[svg][obsidianno]
+
+You can also use pages, characters, date created, and date updated (as well as
+a few different combinations) that can be configured in the plugin settings
+once you turn it on.
Conclusion
- Obsidian is much more than just a notes app, and might be the perfect
- writing tool for you if you want to:
- 1. Store your plain text files locally
- 2. Use something that supports standard Markdown
- 3. Gives you the flexibility to craft your writing environment
+Obsidian is much more than just a notes app, and might be the perfect writing
+tool for you if you want to:
- Obsidian may not be for everyone, but since it’s completely free to
- start, there’s no reason not to give it a spin.
- __________________________________________________________________
+ 1. Store your plain text files locally
+ 2. Use something that supports standard Markdown
+ 3. Gives you the flexibility to craft your writing environment
- 1. Since it’s an Obsidian Command, you could also add this as a button
- to the cMenu plugin mentioned above. [30]↩
+Obsidian may not be for everyone, but since it’s completely free to start,
+there’s no reason not to give it a spin.
-Follow us
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+ 1. Since it’s an Obsidian Command, you could also add this as a button to the
+ cMenu plugin mentioned above. [28]↩
+
+Follow us [29] [30]
[31]Get App Picks, Guides, & More
- Get workflow tips, app recommendations, how-to guides, stories, and
- more delivered to your inbox. Plus we'll send you our productivity
- guide for free!
+Get workflow tips, app recommendations, how-to guides, stories, and more
+delivered to your inbox. Plus we'll send you our productivity guide for free!
- ____________________
+[39][ ]
- Sweet!
+ [40][Sweet!]
-[32]Best-Selling Courses
+[41]Best-Selling Courses
-[33]🎟 All Access Pass 🎟
+[42]🎟 All Access Pass 🎟
- Join the Focus Accelerator to get instant access to the entire course
- library, resource vault, and more. [34]»
+Join the Focus Accelerator to get instant access to the entire course library,
+resource vault, and more. [43]»
-[35]NEW: All the Things
+[44]NEW: All the Things
- Best-selling productivity course. Stop being managed by your task list.
- [36]»
+Best-selling productivity course. Stop being managed by your task list. [45]»
-[37]Full Course List
+[46]Full Course List
- Serving 15,000 customers since 2013, we have a library full of in-depth
- courses to help you be more productive, creative, and focused. [38]View
- all courses »
+Serving 15,000 customers since 2013, we have a library full of in-depth courses
+to help you be more productive, creative, and focused. [47]View all courses »
-[39]The Latest Posts
+[48]The Latest Posts
-[40]Our First Look at Apple’s New Journal App
+[49]Our First Look at Apple’s New Journal App
- Let’s take a look at Apple’s new Journal app for iPhone and how it
- stacks up to one of the perennial apps on the App Store. The app has a
- long way to go, but it has some very intriguing elements to start.
- [41]»
+Let’s take a look at Apple’s new Journal app for iPhone and how it stacks up to
+one of the perennial apps on the App Store. The app has a long way to go, but
+it has some very intriguing elements to start. [50]»
-[42]Tracking Important Events with Up Ahead, Time Blocking Methods, and More
+[51]Tracking Important Events with Up Ahead, Time Blocking Methods, and More
- Catch up on what we published this week, including a look at Up Ahead
- for tracking upcoming events you're looking forward to, a guide to
- effectively using time blocking for productivity, and more. [43]»
+Catch up on what we published this week, including a look at Up Ahead for
+tracking upcoming events you're looking forward to, a guide to effectively
+using time blocking for productivity, and more. [52]»
-[44]Up Ahead Lets You Track the Important Things in Life
+[53]Up Ahead Lets You Track the Important Things in Life
- How many days is it until your next trip? How about until your
- anniversary? Or maybe that movie you’ve been waiting to see comes out?
- You can of course put all of these events on a calendar and find them
- that way, but that doesn’t really make it easy to see how long it is
- until that thing happens. That's where Up Ahead comes in. [45]»
+How many days is it until your next trip? How about until your anniversary? Or
+maybe that movie you’ve been waiting to see comes out? You can of course put
+all of these events on a calendar and find them that way, but that doesn’t
+really make it easy to see how long it is until that thing happens. That's
+where Up Ahead comes in. [54]»
-[46]The Power of Focus Themes
+[55]The Power of Focus Themes
- One of the most important concepts to learn as you figure out your 2024
- plans comes from David Allen: "You can do anything you want, but you
- can’t do everything you want." [Free Workshop this Monday] [47]»
+One of the most important concepts to learn as you figure out your 2024 plans
+comes from David Allen: "You can do anything you want, but you can’t do
+everything you want." [Free Workshop this Monday] [56]»
-[48]The CEO Who Had No Goals (Video)
+[57]The CEO Who Had No Goals (Video)
- I recently heard a surprising admission from a very successful CEO.
- [49]»
+I recently heard a surprising admission from a very successful CEO. [58]»
- * [50]Home
- * [51]About
- * [52]Products
- * [53]Contact
- * [54]Blog
- * [55]Newsletter
- * [56]Sign In
+ • [59]Home
+ • [60]About
+ • [61]Products
+ • [62]Contact
+ • [63]Blog
+ • [64]Newsletter
+ • [65]Sign In
- A website by [57]Shawn Blanc and friends. See also: [58]The Focus
- Course | [59]Tools & Toys
- © 2024 Blanc Media, LLC
- [60]Design by Ink Blot Media Group • [61]Dev by Jonathan Christopher
+A website by [66]Shawn Blanc and friends. See also: [67]The Focus Course |
+[68]Tools & Toys
+© 2024 Blanc Media, LLC
+[69]Design by Ink Blot Media Group • [70]Dev by Jonathan Christopher
+fbpx
- fbpx
+References:
-References
-
- Visible links:
- 1. https://thesweetsetup.com/feed/
- 2. https://thesweetsetup.com/wp-json/wp/v2/posts/132252
- 3. https://thesweetsetup.com/wp-json/oembed/1.0/embed?url=https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/
- 4. https://thesweetsetup.com/wp-json/oembed/1.0/embed?url=https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/&format=xml
- 5. https://www.googletagmanager.com/ns.html?id=GTM-PS7L89F
- 6. https://thesweetsetup.com/
- 7. https://thesweetsetup.com/colophon/
- 8. https://thesweetsetup.com/training/
- 9. https://thesweetsetup.com/blog/
- 10. https://thesweetsetup.com/my-account
- 11. https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/
- 12. https://thesweetsetup.com/category/mindfulness/
- 13. https://thesweetsetup.com/category/workflows/
- 14. https://thesweetsetup.com/category/sweet-setup-interview/
- 15. https://thesweetsetup.com/category/quick-tip/
- 16. https://thesweetsetup.com/author/mikeschmitz/
- 17. https://obsidian.md/
- 18. https://thesweetsetup.com/the-power-of-obsidians-local-graph/
- 19. https://thesweetsetup.com/syncing-embedding-tasks-from-todoist-in-obsidian/
- 20. https://thesweetsetup.com/timeblocking-in-obsidian/
- 21. https://thesweetsetup.com/my-obsidian-based-kanban-writing-workflow/
- 22. obsidian://show-plugin/?id=better-word-count
- 23. obsidian://show-plugin/?id=cmenu-plugin
- 24. obsidian://show-plugin/?id=obsidian-reading-time
- 25. obsidian://show-plugin/?id=obsidian-footnotes
- 26. https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/#fn-132252:1
- 27. obsidian://show-plugin/?id=obsidian-focus-mode
- 28. obsidian://show-plugin/?id=cm-typewriter-scroll-obsidian
- 29. obsidian://show-plugin/?id=novel-word-count
- 30. https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/#fnref-132252:1
- 31. https://thesweetsetup.com/newsletter/
- 32. https://thesweetsetup.com/training/
- 33. https://thesweetsetup.com/accelerator/
- 34. https://thesweetsetup.com/accelerator/
- 35. https://thesweetsetup.com/things/
- 36. https://thesweetsetup.com/things/
- 37. https://thesweetsetup.com/training/?utm_source=training_sidebar_link&utm_medium=sidebar&utm_campaign=sidebar_att
- 38. https://thesweetsetup.com/training/
- 39. https://thesweetsetup.com/blog/
- 40. https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
- 41. https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
- 42. https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
- 43. https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
- 44. https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
- 45. https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
- 46. https://thesweetsetup.com/the-power-of-focus-themes/
- 47. https://thesweetsetup.com/the-power-of-focus-themes/
- 48. https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
- 49. https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
- 50. https://thesweetsetup.com/
- 51. https://thesweetsetup.com/colophon/
- 52. https://thesweetsetup.com/training/
- 53. https://thesweetsetup.com/contact/
- 54. https://thesweetsetup.com/blog/
- 55. https://thesweetsetup.com/newsletter/
- 56. https://thesweetsetup.com/my-account
- 57. https://shawnblanc.net/
- 58. https://thefocuscourse.com/
- 59. http://toolsandtoys.net/
- 60. http://inkblotmediagroup.com/
- 61. http://mondaybynoon.com/
-
- Hidden links:
- 63. https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/
- 64. https://twitter.com/thesweetsetup
- 65. https://thesweetsetup.com/feed
+[1] https://thesweetsetup.com/
+[2] https://thesweetsetup.com/colophon/
+[3] https://thesweetsetup.com/training/
+[4] https://thesweetsetup.com/blog/
+[5] https://thesweetsetup.com/my-account
+[6] https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/#
+[7] https://thesweetsetup.com/category/mindfulness/
+[8] https://thesweetsetup.com/category/workflows/
+[9] https://thesweetsetup.com/category/sweet-setup-interview/
+[10] https://thesweetsetup.com/category/quick-tip/
+[11] https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/#
+[14] https://thesweetsetup.com/author/mikeschmitz/
+[15] https://obsidian.md/
+[16] https://thesweetsetup.com/the-power-of-obsidians-local-graph/
+[17] https://thesweetsetup.com/syncing-embedding-tasks-from-todoist-in-obsidian/
+[18] https://thesweetsetup.com/timeblocking-in-obsidian/
+[19] https://thesweetsetup.com/my-obsidian-based-kanban-writing-workflow/
+[20] obsidian://show-plugin?id=better-word-count
+[21] obsidian://show-plugin?id=cmenu-plugin
+[22] obsidian://show-plugin?id=obsidian-reading-time
+[23] obsidian://show-plugin?id=obsidian-footnotes
+[24] https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/#fn-132252:1
+[25] obsidian://show-plugin?id=obsidian-focus-mode
+[26] obsidian://show-plugin?id=cm-typewriter-scroll-obsidian
+[27] obsidian://show-plugin?id=novel-word-count
+[28] https://thesweetsetup.com/turning-obsidian-into-my-perfect-writing-app/#fnref-132252:1
+[29] https://twitter.com/thesweetsetup
+[30] https://thesweetsetup.com/feed
+[31] https://thesweetsetup.com/newsletter/
+[41] https://thesweetsetup.com/training/
+[42] https://thesweetsetup.com/accelerator/
+[43] https://thesweetsetup.com/accelerator/
+[44] https://thesweetsetup.com/things/
+[45] https://thesweetsetup.com/things/
+[46] https://thesweetsetup.com/training/?utm_source=training_sidebar_link&utm_medium=sidebar&utm_campaign=sidebar_att
+[47] https://thesweetsetup.com/training/
+[48] https://thesweetsetup.com/blog/
+[49] https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
+[50] https://thesweetsetup.com/our-first-look-at-apples-new-journal-app/
+[51] https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
+[52] https://thesweetsetup.com/tracking-important-events-up-ahead-timeblocking-more/
+[53] https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
+[54] https://thesweetsetup.com/up-ahead-lets-you-track-the-important-things-in-life/
+[55] https://thesweetsetup.com/the-power-of-focus-themes/
+[56] https://thesweetsetup.com/the-power-of-focus-themes/
+[57] https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
+[58] https://thesweetsetup.com/the-ceo-who-dad-no-goals-video/
+[59] https://thesweetsetup.com/
+[60] https://thesweetsetup.com/colophon/
+[61] https://thesweetsetup.com/training/
+[62] https://thesweetsetup.com/contact/
+[63] https://thesweetsetup.com/blog/
+[64] https://thesweetsetup.com/newsletter/
+[65] https://thesweetsetup.com/my-account
+[66] https://shawnblanc.net/
+[67] https://thefocuscourse.com/
+[68] http://toolsandtoys.net/
+[69] http://inkblotmediagroup.com/
+[70] http://mondaybynoon.com/
diff --git a/static/archive/timharek-no-ah7ilz.txt b/static/archive/timharek-no-ah7ilz.txt
index 83cf368..92270f0 100644
--- a/static/archive/timharek-no-ah7ilz.txt
+++ b/static/archive/timharek-no-ah7ilz.txt
@@ -1,68 +1,64 @@
- #[1]RSS feed [2]JSON feed
+[1]Skip to content[2]
- [3]Skip to content
+ • [3]Blog
+ • [4]About
+ • [5]More
- * [4]Blog
- * [5]About
- * [6]More
+ 1. [6]Index
+ 2. [7]Blog
+ 3. [8]My thoughts on Helix after 6 months
- 1. [7]Index
- 2. [8]Blog
- 3. [9]My thoughts on Helix after 6 months
-
- [10](Photo)[11]tim@harek.no[12]PGP key
+[9][10](Photo)[11]tim@harek.no[12]PGP key
My thoughts on Helix after 6 months
- Published June 19, 2023
- 2 minutes read
+Published June 19, 2023
+2 minutes read
- Back in [13]January I decided to try out Helix as my primary editor and
- today I have almost been using it for 6 months and these are my
- thoughts.
+Back in [13]January I decided to try out Helix as my primary editor and today I
+have almost been using it for 6 months and these are my thoughts.
What I like
Keystrokes
- Helix lives in the opposite land when it comes to keystrokes in
- comparison to Vim, and it was only difficult for the first couple of
- days. I've become fond of the way to navigate around.
+Helix lives in the opposite land when it comes to keystrokes in comparison to
+Vim, and it was only difficult for the first couple of days. I've become fond
+of the way to navigate around.
Minor modes
- I really like that there are more modes, called [14]"Minor modes", and
- the reason why I like them are that whenever I initate a mode there is
- a subtle pop-up in the lower-right corner with the available actions
- with the activated mode. This is super helpful when you are first
- learning Helix and when you are doing something you don't do on a
- regular basis. It lowers the chance of having to switch context in
- order to do something. For instance, I know that m activates "Match
- mode", but sometimes I may forget how to select around specific
- selector like (), but with Helix I will have a little helper that tells
- me that the next key is a and then the next helper will help me select
- just ().
+I really like that there are more modes, called [14]"Minor modes", and the
+reason why I like them are that whenever I initate a mode there is a subtle
+pop-up in the lower-right corner with the available actions with the activated
+mode. This is super helpful when you are first learning Helix and when you are
+doing something you don't do on a regular basis. It lowers the chance of having
+to switch context in order to do something. For instance, I know that m
+activates "Match mode", but sometimes I may forget how to select around
+specific selector like (), but with Helix I will have a little helper that
+tells me that the next key is a and then the next helper will help me select
+just ().
Moving around
- I've become really fond of the idea that every move-action is also a
- selection/highlight, I find that I miss that feature whenever I edit
- server-configs via SSH or somewhere else when I'm not in Helix. It
- feels natural after a while because you get used to moving around
- text/code with w and e.
+I've become really fond of the idea that every move-action is also a selection/
+highlight, I find that I miss that feature whenever I edit server-configs via
+SSH or somewhere else when I'm not in Helix. It feels natural after a while
+because you get used to moving around text/code with w and e.
Configuration
- No more Vimscript and Lua, just plaintext TOML! The documentation for
- how to configure the editor is great and most of the defaults are also
- great! My editor-config is just 23 lines in contrast to my
- Neovim-config which is 209 lines long.
+No more Vimscript and Lua, just plaintext TOML! The documentation for how to
+configure the editor is great and most of the defaults are also great! My
+editor-config is just 23 lines in contrast to my Neovim-config which is 209
+lines long.
Language server protocol (LSP) support
- I had some experience with this from Neovim, but it felt cumbersome
- having to configure everything. With Helix I can simply run hx --health
- markdown and see what LSP is required for Markdown.
+I had some experience with this from Neovim, but it felt cumbersome having to
+configure everything. With Helix I can simply run hx --health markdown and see
+what LSP is required for Markdown.
+
$ hx --health markdown
Configured language server: marksman
Binary for language server: /opt/homebrew/bin/marksman
@@ -71,77 +67,73 @@ Highlight queries: ✓
Textobject queries: ✘
Indent queries: ✘
- I even managed to get it working with Deno thanks to its documentation
- on how to use custom LSPs for specific languages.
+I even managed to get it working with Deno thanks to its documentation on how
+to use custom LSPs for specific languages.
What I don't like
- There really isn't anything in particualr that I don't like about
- Helix. I really miss having it installed on servers by default, but I
- completely understand that that is a big ask 😅 It's not too difficult
- to swap between Vim-bindings and Helix-bindings for short sessions.
+There really isn't anything in particualr that I don't like about Helix. I
+really miss having it installed on servers by default, but I completely
+understand that that is a big ask 😅 It's not too difficult to swap between
+Vim-bindings and Helix-bindings for short sessions.
Conclusion
- Helix is fun and easy! I highly recommend Helix if you:
- * want to try a new editor,
- * tired of configuring {Neo}vim with Vimscript/Lua,
- * or been thinking about trying out Vim, but been hesitant because of
- the modes.
+Helix is fun and easy! I highly recommend Helix if you:
- I will continue to use Helix for the forseeable future, I'm looking
- forward to what future updates will bring!
+ • want to try a new editor,
+ • tired of configuring {Neo}vim with Vimscript/Lua,
+ • or been thinking about trying out Vim, but been hesitant because of the
+ modes.
- Remember to check out Helix's tutor, hx --tutor for quick introduction
- to its keystrokes and interactions.
+I will continue to use Helix for the forseeable future, I'm looking forward to
+what future updates will bring!
+
+Remember to check out Helix's tutor, hx --tutor for quick introduction to its
+keystrokes and interactions.
Tagged with
- * [15]#100-days-to-offload
- * [16]#helix
- * [17]#software
- * [18]#thoughts
- * [19]#tools
+ • [15]#100-days-to-offload
+ • [16]#helix
+ • [17]#software
+ • [18]#thoughts
+ • [19]#tools
516 words
- [20]Reply via email
+[20]Reply via email
+Last deploy: 2024-01-10
- Last deploy: 2024-01-10
+ • [21]Stats
+ • [22]Privacy
+ • [23]Connect
+ • [24]Subscribe
- * [21]Stats
- * [22]Privacy
- * [23]Connect
- * [24]Subscribe
-References
+References:
- Visible links:
- 1. https://timharek.no/feed.xml
- 2. https://timharek.no/feed.json
- 3. https://timharek.no/blog/my-thoughts-on-helix-after-6-months#main
- 4. https://timharek.no/blog
- 5. https://timharek.no/about
- 6. https://timharek.no/more
- 7. https://timharek.no/
- 8. https://timharek.no/blog
- 9. https://timharek.no/blog/my-thoughts-on-helix-after-6-months
- 10. https://timharek.no/.well-known/avatar?size=250&quality=90
- 11. mailto:tim@harek.no
- 12. https://timharek.no/public-key.asc
- 13. https://timharek.no/blog/trying-helix
- 14. https://docs.helix-editor.com/keymap.html#normal-mode
- 15. https://timharek.no/tags/100-days-to-offload
- 16. https://timharek.no/tags/helix
- 17. https://timharek.no/tags/software
- 18. https://timharek.no/tags/thoughts
- 19. https://timharek.no/tags/tools
- 20. mailto:tim@harek.no?subject=RE: My thoughts on Helix after 6 months
- 21. https://timharek.no/stats
- 22. https://timharek.no/privacy
- 23. https://timharek.no/connect
- 24. https://timharek.no/subscribe
-
- Hidden links:
- 26. https://timharek.no/
- 27. https://timharek.no/
+[1] https://timharek.no/blog/my-thoughts-on-helix-after-6-months#main
+[2] https://timharek.no/
+[3] https://timharek.no/blog
+[4] https://timharek.no/about
+[5] https://timharek.no/more
+[6] https://timharek.no/
+[7] https://timharek.no/blog
+[8] https://timharek.no/blog/my-thoughts-on-helix-after-6-months
+[9] https://timharek.no/
+[10] https://timharek.no/.well-known/avatar?size=250&quality=90
+[11] mailto:tim@harek.no
+[12] https://timharek.no/public-key.asc
+[13] https://timharek.no/blog/trying-helix
+[14] https://docs.helix-editor.com/keymap.html#normal-mode
+[15] https://timharek.no/tags/100-days-to-offload
+[16] https://timharek.no/tags/helix
+[17] https://timharek.no/tags/software
+[18] https://timharek.no/tags/thoughts
+[19] https://timharek.no/tags/tools
+[20] mailto:tim@harek.no?subject=RE:%20My%20thoughts%20on%20Helix%20after%206%20months
+[21] https://timharek.no/stats
+[22] https://timharek.no/privacy
+[23] https://timharek.no/connect
+[24] https://timharek.no/subscribe
diff --git a/static/archive/twonerds-net-pv4a04.txt b/static/archive/twonerds-net-pv4a04.txt
index 92c57e1..165ddce 100644
--- a/static/archive/twonerds-net-pv4a04.txt
+++ b/static/archive/twonerds-net-pv4a04.txt
@@ -1,107 +1,124 @@
- #[1]RSS Feed
+[1] Two Nerds | A lifestyle blog
-[2]Two Nerds | A lifestyle blog
+ • [2]Blog
+ • [3]About
- * [3]Blog
- * [4]About
-
- [Blog______]
+[4][Blog ]
+IMG_0450.JPG
[5]Radda in Chianti to Siena
- [6]May 15, 2017 [7]by Claire
+[6]May 15, 2017 [7]by Claire
- As expected, our second day of riding was easier than the first -- but
- still hilly, and twice as difficult as any ride I'd done before this
- trip. It was well worth it to end the day in Siena, a town that's
- incredibly easy to fall in love with (once you forgive the ancient
- Etruscans for building their cities on freakin' mountains!).
+As expected, our second day of riding was easier than the first -- but still
+hilly, and twice as difficult as any ride I'd done before this trip. It was
+well worth it to end the day in Siena, a town that's incredibly easy to fall in
+love with (once you forgive the ancient Etruscans for building their cities on
+freakin' mountains!).
- We started our day with an early breakfast on our terrace (bruschetta
- with tomatoes, olives and pieces of fried egg, prepared by our B&B
- proprietor Romanita), then set off for the open road. After about an
- hour of pedaling (55 minutes of steady uphill climbing, followed by 5
- minutes of an exhilarating 35mph downhill plunge) we rolled into Gaolie
- in Chianti, home of L'Eroica, a retro 200km bike ride held in Tuscany
- every October.
+We started our day with an early breakfast on our terrace (bruschetta with
+tomatoes, olives and pieces of fried egg, prepared by our B&B proprietor
+Romanita), then set off for the open road. After about an hour of pedaling (55
+minutes of steady uphill climbing, followed by 5 minutes of an exhilarating
+35mph downhill plunge) we rolled into Gaolie in Chianti, home of L'Eroica, a
+retro 200km bike ride held in Tuscany every October.
- We made an unplanned stop at the [8]bike rental shop in town for a
- quick tune-up, tire pressure check, and to have Felipe (the mechanic)
- look at a few nagging rattling noises on the bikes -- undoubtedly a
- result of putting them together ourselves. 45 minutes and just 5 Euro
- later, we were back on the road!
+We made an unplanned stop at the [8]bike rental shop in town for a quick
+tune-up, tire pressure check, and to have Felipe (the mechanic) look at a few
+nagging rattling noises on the bikes -- undoubtedly a result of putting them
+together ourselves. 45 minutes and just 5 Euro later, we were back on the road!
+
- We were treated to our second tough climb of the day out of Gaoile, and
- by the time we reached the turn for [9]Castello di Brolio at about
- 12:45pm, we were in desperate need of fuel. We stopped at a small café
- for overpriced cheese sandwiches and unnamed beer. Totally worth it.
- Then, we pushed our bikes up a steep cliff (zero shame in that) and
- explored the grounds of the 12th century castle!
+FullSizeRender.jpg
+FullSizeRender.jpg
- Our route map had us getting back on the main road to snake through a
- few more hill towns before our final ascent to Siena. We called an
- audible and followed the white gravel L'Eroica route (which seemed to
- be shorter, but about which we knew absolutely nothing) instead. We
- were not disappointed! The road circled around behind the castle, then
- through the beautiful countryside on roads that were virtually
- car-less.
+We were treated to our second tough climb of the day out of Gaoile, and by the
+time we reached the turn for [9]Castello di Brolio at about 12:45pm, we were in
+desperate need of fuel. We stopped at a small café for overpriced cheese
+sandwiches and unnamed beer. Totally worth it. Then, we pushed our bikes up a
+steep cliff (zero shame in that) and explored the grounds of the 12th century
+castle!
- Thanks to our shortcut, we arrived in Siena before 4pm and checked into
- the Hotel Bernini (which was absolutely perfect – basic, clean rooms,
- friendly staff, and a terrace with a killer view). We spent the rest of
- the afternoon exploring the city streets and enjoying drinks and snacks
- on Il Campo, the main city square that doubles as a race track one day
- a year with horses representing each of Siena's 17 contrade
- (districts).
+IMG_0459.JPG
+IMG_0461.JPG
+IMG_0457.JPG
+IMG_0460.JPG
- As the Palio di Siena draws closer, the districts are known to march
- into the square. (I equate this to a horse race pep rally, sans
- horses.) We happened to catch the Oca (goose) district marching on
- Sunday afternoon. It was crazy awesome!
+Our route map had us getting back on the main road to snake through a few more
+hill towns before our final ascent to Siena. We called an audible and followed
+the white gravel L'Eroica route (which seemed to be shorter, but about which we
+knew absolutely nothing) instead. We were not disappointed! The road circled
+around behind the castle, then through the beautiful countryside on roads that
+were virtually car-less.
- We had a few too many snacks during aperitivo (the Italian equivalent
- of Happy Hour), so weren't hungry for dinner until late – or, put
- another way, we're finally on the Italian dinner schedule. After
- scouring menus for the osterias around town, we googled 'best pizza in
- Siena', and ended up at il Pomodorino around 10pm. It was the best
- pizza either of us had ever had, and made for a fantastic end to a
- great day.
+IMG_0456.JPG
+IMG_0361.JPG
+IMG_0349.JPG
- We had two route options for Monday, Day 3: a Level 2/4 Difficulty and
- a Level 3/4 Difficulty. After Saturday's killer ride (a 2/4), we felt
- much more comfortable taking on the former – although it would take
- about half the time as our original planned route. We decided to
- sleep-in Monday morning (until 9am), go out for coffee in Siena, then
- sit in Il Campo and map out our bike route for the day. It was so nice
- to take our time and enjoy the town (our favorite so far) before all
- the tour groups showed up!
+Thanks to our shortcut, we arrived in Siena before 4pm and checked into the
+Hotel Bernini (which was absolutely perfect – basic, clean rooms, friendly
+staff, and a terrace with a killer view). We spent the rest of the afternoon
+exploring the city streets and enjoying drinks and snacks on Il Campo, the main
+city square that doubles as a race track one day a year with horses
+representing each of Siena's 17 contrade (districts).
- Stay tuned for Monday's ride to San Gimignano!
+IMG_0411.JPG
+IMG_0451.JPG
+IMG_0415.JPG
- Bike Route: 29.4 miles // 2,711 ft of elevation
- gain. [10]https://www.strava.com/activities/986032513
+As the Palio di Siena draws closer, the districts are known to march into the
+square. (I equate this to a horse race pep rally, sans horses.) We happened to
+catch the Oca (goose) district marching on Sunday afternoon. It was crazy
+awesome!
- [11]May 15, 2017 /[12]Claire
+IMG_0454.JPG
+IMG_0453.JPG
- * [13]Newer
- * [14]Older
+ We had a few too many snacks during aperitivo (the Italian equivalent of Happy
+Hour), so weren't hungry for dinner until late – or, put another way, we're
+finally on the Italian dinner schedule. After scouring menus for the osterias
+around town, we googled 'best pizza in Siena', and ended up at il Pomodorino
+around 10pm. It was the best pizza either of us had ever had, and made for a
+fantastic end to a great day.
- 2017 © Two Nerds Dot Net. All Rights Reserved. No content from this
- site may be used without written permission.
+IMG_0422.JPG
-References
+ We had two route options for Monday, Day 3: a Level 2/4 Difficulty and a Level
+3/4 Difficulty. After Saturday's killer ride (a 2/4), we felt much more
+comfortable taking on the former – although it would take about half the time
+as our original planned route. We decided to sleep-in Monday morning (until
+9am), go out for coffee in Siena, then sit in Il Campo and map out our bike
+route for the day. It was so nice to take our time and enjoy the town (our
+favorite so far) before all the tour groups showed up!
- 1. https://twonerds.net/blog?format=rss
- 2. https://twonerds.net/
- 3. https://twonerds.net/
- 4. https://twonerds.net/about
- 5. https://twonerds.net/blog/radda-in-chianti-to-siena
- 6. https://twonerds.net/blog/radda-in-chianti-to-siena
- 7. https://twonerds.net/?author=590f29c99f745610d38765af
- 8. http://www.tuscanybicycle.com/en/
- 9. http://www.baronericasoli.com/
- 10. https://www.strava.com/activities/986032513
- 11. https://twonerds.net/blog/radda-in-chianti-to-siena
- 12. https://twonerds.net/?author=590f29c99f745610d38765af
- 13. https://twonerds.net/blog/siena-to-san-gimignano
- 14. https://twonerds.net/blog/firenze-to-radda-in-chianti-our-first-day-in-the-saddle
+IMG_0429.JPG
+
+Stay tuned for Monday's ride to San Gimignano!
+
+Bike Route: 29.4 miles // 2,711 ft of elevation gain. [10]https://
+www.strava.com/activities/986032513
+
+[11]May 15, 2017 /[12]Claire
+
+ • [13]Newer
+ • [14]Older
+
+2017 © Two Nerds Dot Net. All Rights Reserved. No content from this site may be
+used without written permission.
+
+
+References:
+
+[1] https://twonerds.net/
+[2] https://twonerds.net/
+[3] https://twonerds.net/about
+[5] https://twonerds.net/blog/radda-in-chianti-to-siena
+[6] https://twonerds.net/blog/radda-in-chianti-to-siena
+[7] https://twonerds.net/?author=590f29c99f745610d38765af
+[8] http://www.tuscanybicycle.com/en/
+[9] http://www.baronericasoli.com/
+[10] https://www.strava.com/activities/986032513
+[11] https://twonerds.net/blog/radda-in-chianti-to-siena
+[12] https://twonerds.net/?author=590f29c99f745610d38765af
+[13] https://twonerds.net/blog/siena-to-san-gimignano
+[14] https://twonerds.net/blog/firenze-to-radda-in-chianti-our-first-day-in-the-saddle
diff --git a/static/archive/vladh-net-lmumqo.txt b/static/archive/vladh-net-lmumqo.txt
index ad25e42..17c7998 100644
--- a/static/archive/vladh-net-lmumqo.txt
+++ b/static/archive/vladh-net-lmumqo.txt
@@ -1,359 +1,349 @@
- A logo showing a blue circle
- Vlad-Stefan Harbuz
- Menu
- * [1]About
- * [2]Music
- * [3]Photos
- * [4]Books
- * [5]RSS
+[1]
+A logo showing a blue circle
+Vlad-Stefan Harbuz
+Menu
- Philosophy
- * [6]Resources: Philosophy of Work
- * [7]Alternatives to Wage Labour
- * [8]The Epistemic Implications of AI Assistants
- * [9]Our Schools Should Teach Communication
- * [10]Voting Regardless of Citizenship
- * [11]Effective Apologies
+ • [2]About
+ • [3]Music
+ • [4]Photos
+ • [5]Books
+ • [6]RSS
- Programming
- * [12]The Caring Programmer's Manifesto
- * [13]The Hare Programming Language
- * [14]Hare Regex Implementation
- * [15]Peony Game Engine
- * [16]Skeletal Animation
- * [17]clumsy computer
- * [18]Submodule GB01
- * [19]vegvisir
- * [20]pstr
- * [21]Dithering
+Philosophy
- Languages
- * [22]Japanese Recommendations
- * [23]German Noun Genders
+ • [7]Resources: Philosophy of Work
+ • [8]Alternatives to Wage Labour
+ • [9]The Epistemic Implications of AI Assistants
+ • [10]Our Schools Should Teach Communication
+ • [11]Voting Regardless of Citizenship
+ • [12]Effective Apologies
- Fun
- * [24]Most Minimal UK Address
+Programming
- * [25]About
- * [26]Music
- * [27]Photos
- * [28]Books
- * [29]RSS
+ • [13]The Caring Programmer's Manifesto
+ • [14]The Hare Programming Language
+ • [15]Hare Regex Implementation
+ • [16]Peony Game Engine
+ • [17]Skeletal Animation
+ • [18]clumsy computer
+ • [19]Submodule GB01
+ • [20]vegvisir
+ • [21]pstr
+ • [22]Dithering
- Philosophy
- * [30]Resources: Philosophy of Work
- * [31]Alternatives to Wage Labour
- * [32]The Epistemic Implications of AI Assistants
- * [33]Our Schools Should Teach Communication
- * [34]Voting Regardless of Citizenship
- * [35]Effective Apologies
+Languages
- Programming
- * [36]The Caring Programmer's Manifesto
- * [37]The Hare Programming Language
- * [38]Hare Regex Implementation
- * [39]Peony Game Engine
- * [40]Skeletal Animation
- * [41]clumsy computer
- * [42]Submodule GB01
- * [43]vegvisir
- * [44]pstr
- * [45]Dithering
+ • [23]Japanese Recommendations
+ • [24]German Noun Genders
- Languages
- * [46]Japanese Recommendations
- * [47]German Noun Genders
+Fun
- Fun
- * [48]Most Minimal UK Address
+ • [25]Most Minimal UK Address
+
+ • [26]About
+ • [27]Music
+ • [28]Photos
+ • [29]Books
+ • [30]RSS
+
+Philosophy
+
+ • [31]Resources: Philosophy of Work
+ • [32]Alternatives to Wage Labour
+ • [33]The Epistemic Implications of AI Assistants
+ • [34]Our Schools Should Teach Communication
+ • [35]Voting Regardless of Citizenship
+ • [36]Effective Apologies
+
+Programming
+
+ • [37]The Caring Programmer's Manifesto
+ • [38]The Hare Programming Language
+ • [39]Hare Regex Implementation
+ • [40]Peony Game Engine
+ • [41]Skeletal Animation
+ • [42]clumsy computer
+ • [43]Submodule GB01
+ • [44]vegvisir
+ • [45]pstr
+ • [46]Dithering
+
+Languages
+
+ • [47]Japanese Recommendations
+ • [48]German Noun Genders
+
+Fun
+
+ • [49]Most Minimal UK Address
Resources on the Philosophy of Work
- 04 August 2022
+04 August 2022
- Wage labour is when you get paid a salary by a company to do work,
- thereby renting out your time. It’s not a good system because it forces
- employees to be exploited by manager-owners. This exploitation can be
- financial, for example if you get paid less than you produce, but it
- can also be something more than that. One often ends up in a situation
- where one finds one’s work meaningless, because one cannot connect to,
- own and direct one’s work in a hierarchical managerial workplace.
- Additionally, because wage labour is by far the most widespread method
- of organising work, one might feel powerless to attempt to connect to
- their work without having someone else own and direct it.
+Wage labour is when you get paid a salary by a company to do work, thereby
+renting out your time. It’s not a good system because it forces employees to be
+exploited by manager-owners. This exploitation can be financial, for example if
+you get paid less than you produce, but it can also be something more than
+that. One often ends up in a situation where one finds one’s work meaningless,
+because one cannot connect to, own and direct one’s work in a hierarchical
+managerial workplace. Additionally, because wage labour is by far the most
+widespread method of organising work, one might feel powerless to attempt to
+connect to their work without having someone else own and direct it.
- Worse, even when one works 8 hours per day, the remaining hours are
- often dedicated to recovering from work and restoring one’s energy so
- that one may be productive on the next workday. All of these things
- come together to form something called “alienation” — our work is
- important to us, and we should have a positive connection to it, but we
- end up having a deficient and corrupted connection to it, which is an
- injustice.
+Worse, even when one works 8 hours per day, the remaining hours are often
+dedicated to recovering from work and restoring one’s energy so that one may be
+productive on the next workday. All of these things come together to form
+something called “alienation” — our work is important to us, and we should have
+a positive connection to it, but we end up having a deficient and corrupted
+connection to it, which is an injustice.
- Some might say that this is unavoidable, but this is not true. In fact,
- the very idea of this system being unavoidable is a result of a bad way
- of looking at things called “reification”, which means taking something
- that us humans have made up, such as our economic system, and saying
- that it is actually real and inevitably has power over us. This is not
- the case because it is us who structured society in this way, and we
- could have done it any other way.
+Some might say that this is unavoidable, but this is not true. In fact, the
+very idea of this system being unavoidable is a result of a bad way of looking
+at things called “reification”, which means taking something that us humans
+have made up, such as our economic system, and saying that it is actually real
+and inevitably has power over us. This is not the case because it is us who
+structured society in this way, and we could have done it any other way.
- Indeed, we know that it is possible to be creative without being
- oppressed. Most people can contrast alienated wage labour (what some
- simply sweepingly call “work”) with playful creation, where someone is
- compelled by passion and interest to put a lot of effort into creating
- something. In fact, we know that, ironically, we are usually more
- productive in this passionate state, than when we are managed and
- disciplined into doing something we do not care about.
+Indeed, we know that it is possible to be creative without being oppressed.
+Most people can contrast alienated wage labour (what some simply sweepingly
+call “work”) with playful creation, where someone is compelled by passion and
+interest to put a lot of effort into creating something. In fact, we know that,
+ironically, we are usually more productive in this passionate state, than when
+we are managed and disciplined into doing something we do not care about.
- One might object that this view is naïve because it is not possible to
- simply do what we’re passionate about — there are many jobs that must
- be done and that are simply not fun. But the fact of the matter is that
- a very large amount of today’s jobs are entirely pointless and
- unneccesary. Instead, they only exist to provide a reason to perpetuate
- the status quo of wage labour.
+One might object that this view is naïve because it is not possible to simply
+do what we’re passionate about — there are many jobs that must be done and that
+are simply not fun. But the fact of the matter is that a very large amount of
+today’s jobs are entirely pointless and unneccesary. Instead, they only exist
+to provide a reason to perpetuate the status quo of wage labour.
- Imagine someone doing a job we knew to be completely useless, and
- receiving a salary for it every month. How would we respond to the
- proposal of paying this person their salary, but allowing them to
- simply stop doing their work? Many would react negatively and say that
- this person would be getting paid for nothing. But is it not concerning
- that we would want someone to waste their life away doing something
- which is never useful to anyone, just so that we can feel that they
- have thereby somehow earned their right to exist?
+Imagine someone doing a job we knew to be completely useless, and receiving a
+salary for it every month. How would we respond to the proposal of paying this
+person their salary, but allowing them to simply stop doing their work? Many
+would react negatively and say that this person would be getting paid for
+nothing. But is it not concerning that we would want someone to waste their
+life away doing something which is never useful to anyone, just so that we can
+feel that they have thereby somehow earned their right to exist?
- Gradual change is possible, and a big part of this change is cultural.
- This means first realising all the harmful things that gross inequality
- of income and power does, then changing our values to say that everyone
- deserves to direct their own life and earn a fair living. This does not
- necessarily mean that everyone actually will be able to do these
- things, but the first step is recognising the current state of affairs
- as unjustifiable.
+Gradual change is possible, and a big part of this change is cultural. This
+means first realising all the harmful things that gross inequality of income
+and power does, then changing our values to say that everyone deserves to
+direct their own life and earn a fair living. This does not necessarily mean
+that everyone actually will be able to do these things, but the first step is
+recognising the current state of affairs as unjustifiable.
- Here are some beginner-friendly books and articles on this topic that I
- have loved, and are both eloquent and fun to read. I have also included
- some quotes that I feel explain these concepts well.
+Here are some beginner-friendly books and articles on this topic that I have
+loved, and are both eloquent and fun to read. I have also included some quotes
+that I feel explain these concepts well.
Introductory Essays and Books
- [49]“In Praise of Idleness” Bertrand Russell [50]“Bullshit Jobs” David
- Graeber [51]“The Tyranny of Merit” Michael J. Sandel [52]“The Abolition
- of Work” Bob Black
+[50] “In Praise of Idleness” Bertrand Russell [51] “Bullshit Jobs” David
+Graeber [52] “The Tyranny of Merit” Michael J. Sandel [53] “The Abolition of
+Work” Bob Black
- The absolute best place to start is “In Praise of Idleness”, a short
- and very accessible essay by Russell that explains some of the most
- basic problems with our conception of work. “Bullshit Jobs” is a
- classic in which Graeber describes how many of the jobs we are
- currently doing are simply not useful to anyone. In “The Tyranny of
- Merit”, which I have found life-changing, Sandel describes how our
- conceptions of “merit” do not align with reality, and that our
- blindness to this affects our lives significantly. Lastly, “The
- Abolition of Work” is a classic and emotionally powerful essay by Bob
- Black in which he very clearly describes many of the problems with
- “work”, but this essay can also be too polemical and antagonising.
+The absolute best place to start is “In Praise of Idleness”, a short and very
+accessible essay by Russell that explains some of the most basic problems with
+our conception of work. “Bullshit Jobs” is a classic in which Graeber describes
+how many of the jobs we are currently doing are simply not useful to anyone. In
+“The Tyranny of Merit”, which I have found life-changing, Sandel describes how
+our conceptions of “merit” do not align with reality, and that our blindness to
+this affects our lives significantly. Lastly, “The Abolition of Work” is a
+classic and emotionally powerful essay by Bob Black in which he very clearly
+describes many of the problems with “work”, but this essay can also be too
+polemical and antagonising.
More In-Depth Books
- [53]“Another Now” Yanis Varoufakis [54]“Talking to my Daughter About
- the Economy” Yanis Varoufakis
+[54] “Another Now” Yanis Varoufakis [55] “Talking to my Daughter About the
+Economy” Yanis Varoufakis
- People often ask me what a system that abolishes wage labour and
- capitalism would look like. In “Another Now”, former Greek finance
- minister Yanis Varoufakis tells a fictional story that describes what
- such a parallel world would look like, and he goes into significant
- economic detail. Similarly, “Talking to my Daughter About the Economy”
- is an easy to read and light-hearted description of today’s economy.
+People often ask me what a system that abolishes wage labour and capitalism
+would look like. In “Another Now”, former Greek finance minister Yanis
+Varoufakis tells a fictional story that describes what such a parallel world
+would look like, and he goes into significant economic detail. Similarly,
+“Talking to my Daughter About the Economy” is an easy to read and light-hearted
+description of today’s economy.
Philosophical Background
- [55]“Alienation” Rahel Jaeggi [56]“Free Time” Theodor W. Adorno
+[56] “Alienation” Rahel Jaeggi [57] “Free Time” Theodor W. Adorno
- Perhaps you have read the more accessible material above, but would
- like to get more into the philosophical details. In “Alienation”, Rahel
- Jaeggi describes the history of the concept of alienation, and
- describes a modern and analytic way to look at it, which I find very
- useful. Her description really makes one wonder about the aspects of
- alienation that transcend the financial, such as its impact on our
- epistemic agency. Adorno’s “Free Time” is an amazingly insightful look
- at how work has profound effects on us not only during our time at the
- workplace, but also during our so-called “free time”, which the
- employer nonetheless deeply affects and controls.
+Perhaps you have read the more accessible material above, but would like to get
+more into the philosophical details. In “Alienation”, Rahel Jaeggi describes
+the history of the concept of alienation, and describes a modern and analytic
+way to look at it, which I find very useful. Her description really makes one
+wonder about the aspects of alienation that transcend the financial, such as
+its impact on our epistemic agency. Adorno’s “Free Time” is an amazingly
+insightful look at how work has profound effects on us not only during our time
+at the workplace, but also during our so-called “free time”, which the employer
+nonetheless deeply affects and controls.
- You can also read my somewhat amateurish essay, [57]“Alternatives to
- Wage Labour”.
+You can also read my somewhat amateurish essay, [58]“Alternatives to Wage
+Labour”.
Explanatory quotes
- Here are some quotes that I feel explain the ideas I have referenced
- above quite well. I do not necessarily directly endorse all of these
- perspectives, but rather find it useful to illustrate how philosophers
- describe these issues.
+Here are some quotes that I feel explain the ideas I have referenced above
+quite well. I do not necessarily directly endorse all of these perspectives,
+but rather find it useful to illustrate how philosophers describe these issues.
- We should do away with the absolutely specious notion that everybody
- has to earn a living. It is a fact today that one in ten thousand of
- us can make a technological breakthrough capable of supporting all
- the rest. The youth of today are absolutely right in recognizing
- this nonsense of earning a living. We keep inventing jobs because of
- this false idea that everybody has to be employed at some kind of
- drudgery because, according to Malthusian Darwinian theory he must
- justify his right to exist. So we have inspectors of inspectors and
- people making instruments for inspectors to inspect inspectors. The
- true business of people should be to go back to school and think
- about whatever it was they were thinking about before somebody came
- along and told them they had to earn a living.
+ We should do away with the absolutely specious notion that everybody has to
+ earn a living. It is a fact today that one in ten thousand of us can make a
+ technological breakthrough capable of supporting all the rest. The youth of
+ today are absolutely right in recognizing this nonsense of earning a
+ living. We keep inventing jobs because of this false idea that everybody
+ has to be employed at some kind of drudgery because, according to
+ Malthusian Darwinian theory he must justify his right to exist. So we have
+ inspectors of inspectors and people making instruments for inspectors to
+ inspect inspectors. The true business of people should be to go back to
+ school and think about whatever it was they were thinking about before
+ somebody came along and told them they had to earn a living.
- — Buckminster Fuller
+ — Buckminster Fuller
- The ‘positive’ sense of the word ‘liberty’ derives from the wish on
- the part of the individual to be his own master. I wish my life and
- decisions to depend on myself, not on external forces of whatever
- kind. I wish to be the instrument of my own, not of other men’s,
- acts of will. I wish to be a subject, not an object; to be moved by
- reasons, by conscious purposes, which are my own, not by causes
- which affect me, as it were, from outside. I wish to be somebody,
- not nobody; a doer—deciding, not being decided for, self-directed
- and not acted upon by external nature or by other men as if I were a
- thing, or an animal, or a slave incapable of playing a human role,
- that is, of conceiving goals and policies of my own and realizing
- them. (…) I wish, above all, to be conscious of myself as a
- thinking, willing, active being, bearing responsibility for my
- choices and able to explain them by references to my own ideas and
- purposes. I feel free to the degree that I believe this to be true,
- and enslaved to the degree that I am made to realize that it is not.
+ The ‘positive’ sense of the word ‘liberty’ derives from the wish on the
+ part of the individual to be his own master. I wish my life and decisions
+ to depend on myself, not on external forces of whatever kind. I wish to be
+ the instrument of my own, not of other men’s, acts of will. I wish to be a
+ subject, not an object; to be moved by reasons, by conscious purposes,
+ which are my own, not by causes which affect me, as it were, from outside.
+ I wish to be somebody, not nobody; a doer—deciding, not being decided for,
+ self-directed and not acted upon by external nature or by other men as if I
+ were a thing, or an animal, or a slave incapable of playing a human role,
+ that is, of conceiving goals and policies of my own and realizing them. (…)
+ I wish, above all, to be conscious of myself as a thinking, willing, active
+ being, bearing responsibility for my choices and able to explain them by
+ references to my own ideas and purposes. I feel free to the degree that I
+ believe this to be true, and enslaved to the degree that I am made to
+ realize that it is not.
- — Isaiah Berlin
+ — Isaiah Berlin
- The fact that the vast majority of the population accepts, and is
- made to accept, this society does not render it less irrational and
- less reprehensible.
+ The fact that the vast majority of the population accepts, and is made to
+ accept, this society does not render it less irrational and less
+ reprehensible.
- — Herbert Marcuse, “One-Dimensional Man”, p. xliv
+ — Herbert Marcuse, “One-Dimensional Man”, p. xliv
- The things of everyday life [must be] lifted out of the realm of the
- self-evident. (…) That which is “natural” must assume the features
- of the extraordinary. Only in this manner can the laws of cause and
- effect reveal themselves.
+ The things of everyday life [must be] lifted out of the realm of the
+ self-evident. (…) That which is “natural” must assume the features of the
+ extraordinary. Only in this manner can the laws of cause and effect reveal
+ themselves.
- — Bertolt Brecht, “Schriften zum Theater” (Berlin and Frankfurt,
- Suhrkamp, 1957), p. 7, 9.
+ — Bertolt Brecht, “Schriften zum Theater” (Berlin and Frankfurt, Suhrkamp,
+ 1957), p. 7, 9.
The Story of the Mathematician
- This is a very short story used as an example by Rahel Jaeggi in
- “Alienation” which I find a stunningly good illustration of the
- problems I refer to.
+This is a very short story used as an example by Rahel Jaeggi in “Alienation”
+which I find a stunningly good illustration of the problems I refer to.
- A young academic takes up his first position. At the same time he
- and his girlfriend decide to marry. That makes sense “because of the
- taxes.” A short time later his wife becomes pregnant. Since large
- apartments in the city are expensive and hard to find, they decide
- to move to a suburb. After all, life outside the city will be
- “better for the child.” The man, a gifted mathematician, who until
- then has led a slightly chaotic life, oscillating between too much
- night life and an obsessive immersion in work, is now confronted
- with a completely new situation. All of a sudden, and without him
- having really noticed it, his life is now, as it were, “on track.”
- One thing seems to follow ineluctably from another. And in a
- creeping, almost unnoticeable process his life acquires all the
- attributes of a completely normal suburban existence. Would he, who
- earlier ate fast food most of the time and relied on convenience
- stores for picking up milk and toilet paper as the need arose, ever
- have thought that he would one day drive every Saturday morning to
- the shopping mall to buy supplies for the week and fill the freezer?
- Could he ever have imagined that he would hurry home from work on
- Friday because the lawn needed to be mowed before the barbecue? At
- first he and his wife hardly notice that their conversations are
- increasingly limited to their child and the organization of
- household chores. Sometimes, however, he is overcome by a feeling of
- unreality. Something is wrong here. While many envy him for the
- beautiful suburban house he lives in, he is not really at home in
- this situation. The life he leads, which, as it seems to him, has so
- suddenly tightened around him—one could almost say “rearranged”
- him—seems, in a strange way, not to be his own life. Everything is
- as if it could not be any other way; everything happens with a
- certain inevitability. And in spite of this—or perhaps precisely
- because of it—it remains in a crucial respect alien to him. To what
- extent is this life “not really” his own? To what extent is he, in
- this life that he leads, alienated from himself?
+ A young academic takes up his first position. At the same time he and his
+ girlfriend decide to marry. That makes sense “because of the taxes.” A
+ short time later his wife becomes pregnant. Since large apartments in the
+ city are expensive and hard to find, they decide to move to a suburb. After
+ all, life outside the city will be “better for the child.” The man, a
+ gifted mathematician, who until then has led a slightly chaotic life,
+ oscillating between too much night life and an obsessive immersion in work,
+ is now confronted with a completely new situation. All of a sudden, and
+ without him having really noticed it, his life is now, as it were, “on
+ track.” One thing seems to follow ineluctably from another. And in a
+ creeping, almost unnoticeable process his life acquires all the attributes
+ of a completely normal suburban existence. Would he, who earlier ate fast
+ food most of the time and relied on convenience stores for picking up milk
+ and toilet paper as the need arose, ever have thought that he would one day
+ drive every Saturday morning to the shopping mall to buy supplies for the
+ week and fill the freezer? Could he ever have imagined that he would hurry
+ home from work on Friday because the lawn needed to be mowed before the
+ barbecue? At first he and his wife hardly notice that their conversations
+ are increasingly limited to their child and the organization of household
+ chores. Sometimes, however, he is overcome by a feeling of unreality.
+ Something is wrong here. While many envy him for the beautiful suburban
+ house he lives in, he is not really at home in this situation. The life he
+ leads, which, as it seems to him, has so suddenly tightened around him—one
+ could almost say “rearranged” him—seems, in a strange way, not to be his
+ own life. Everything is as if it could not be any other way; everything
+ happens with a certain inevitability. And in spite of this—or perhaps
+ precisely because of it—it remains in a crucial respect alien to him. To
+ what extent is this life “not really” his own? To what extent is he, in
+ this life that he leads, alienated from himself?
- Each individual aspect of his life (…) has not really been decided
- on. Thus, his situation is in fact “out of control” in a certain
- sense, and (…) it is a situation for which no one can genuinely be
- held responsible. This does not merely mean that he has not acted,
- or has not availed himself of his possibilities for acting, but that
- he has not even understood his situation as one in which action is
- called for or possible; it does not merely mean that he has not
- decided something for himself, or has not led his life himself, but
- that he has been incapable of understanding or regarding it as
- something he can or must lead.
+ Each individual aspect of his life (…) has not really been decided on.
+ Thus, his situation is in fact “out of control” in a certain sense, and (…)
+ it is a situation for which no one can genuinely be held responsible. This
+ does not merely mean that he has not acted, or has not availed himself of
+ his possibilities for acting, but that he has not even understood his
+ situation as one in which action is called for or possible; it does not
+ merely mean that he has not decided something for himself, or has not led
+ his life himself, but that he has been incapable of understanding or
+ regarding it as something he can or must lead.
- — Rahel Jaeggi, “Alienation”
+ — Rahel Jaeggi, “Alienation”
- [58]XXIIVV webring © 2010 Vlad-Stefan Harbuz. Article text and media is
- [59]CC-BY-SA 4.0 unless otherwise specified. All other rights reserved.
+[59] XXIIVV webring © 2010 Vlad-Stefan Harbuz. Article text and media is [60]
+CC-BY-SA 4.0 unless otherwise specified. All other rights reserved.
-References
+References:
- Visible links:
- 1. https://vladh.net/about
- 2. https://vladh.net/music
- 3. https://vladh.net/photos
- 4. https://vladh.net/books
- 5. https://vladh.net/index.xml
- 6. https://vladh.net/wage-labour-resources
- 7. https://vladh.net/alternatives-to-wage-labour
- 8. https://vladh.net/the-epistemic-implications-of-ai-assistants
- 9. https://vladh.net/our-schools-should-teach-communication
- 10. https://vladh.net/voting-regardless-of-citizenship
- 11. https://vladh.net/apologies
- 12. https://vladh.net/manifesto
- 13. https://vladh.net/hare
- 14. https://vladh.net/implementing-regular-expressions-in-hare
- 15. https://vladh.net/peony
- 16. https://vladh.net/game-engine-skeletal-animation
- 17. https://vladh.net/clumsycomputer
- 18. https://vladh.net/submodule
- 19. https://vladh.net/vegvisir
- 20. https://vladh.net/pstr
- 21. https://vladh.net/dithering
- 22. https://vladh.net/japanese-recommendations
- 23. https://vladh.net/german-nouns
- 24. https://vladh.net/most-minimal-uk-address
- 25. https://vladh.net/about
- 26. https://vladh.net/music
- 27. https://vladh.net/photos
- 28. https://vladh.net/books
- 29. https://vladh.net/index.xml
- 30. https://vladh.net/wage-labour-resources
- 31. https://vladh.net/alternatives-to-wage-labour
- 32. https://vladh.net/the-epistemic-implications-of-ai-assistants
- 33. https://vladh.net/our-schools-should-teach-communication
- 34. https://vladh.net/voting-regardless-of-citizenship
- 35. https://vladh.net/apologies
- 36. https://vladh.net/manifesto
- 37. https://vladh.net/hare
- 38. https://vladh.net/implementing-regular-expressions-in-hare
- 39. https://vladh.net/peony
- 40. https://vladh.net/game-engine-skeletal-animation
- 41. https://vladh.net/clumsycomputer
- 42. https://vladh.net/submodule
- 43. https://vladh.net/vegvisir
- 44. https://vladh.net/pstr
- 45. https://vladh.net/dithering
- 46. https://vladh.net/japanese-recommendations
- 47. https://vladh.net/german-nouns
- 48. https://vladh.net/most-minimal-uk-address
- 49. https://harpers.org/archive/1932/10/in-praise-of-idleness/
- 50. https://www.goodreads.com/book/show/36531574-bullshit-jobs
- 51. https://www.goodreads.com/book/show/50364458-the-tyranny-of-merit
- 52. https://theanarchistlibrary.org/library/bob-black-the-abolition-of-work
- 53. https://www.goodreads.com/book/show/49098225-another-now
- 54. https://www.goodreads.com/book/show/36490332-talking-to-my-daughter-about-the-economy
- 55. https://www.goodreads.com/en/book/show/19144936
- 56. http://xenopraxis.net/readings/adorno_freetime.pdf
- 57. https://vladh.net/alternatives-to-wage-labour
- 58. https://webring.xxiivv.com/#vladh
- 59. https://creativecommons.org/licenses/by-sa/4.0/
-
- Hidden links:
- 61. https://vladh.net/
+[1] https://vladh.net/
+[2] https://vladh.net/about
+[3] https://vladh.net/music
+[4] https://vladh.net/photos
+[5] https://vladh.net/books
+[6] https://vladh.net/index.xml
+[7] https://vladh.net/wage-labour-resources
+[8] https://vladh.net/alternatives-to-wage-labour
+[9] https://vladh.net/the-epistemic-implications-of-ai-assistants
+[10] https://vladh.net/our-schools-should-teach-communication
+[11] https://vladh.net/voting-regardless-of-citizenship
+[12] https://vladh.net/apologies
+[13] https://vladh.net/manifesto
+[14] https://vladh.net/hare
+[15] https://vladh.net/implementing-regular-expressions-in-hare
+[16] https://vladh.net/peony
+[17] https://vladh.net/game-engine-skeletal-animation
+[18] https://vladh.net/clumsycomputer
+[19] https://vladh.net/submodule
+[20] https://vladh.net/vegvisir
+[21] https://vladh.net/pstr
+[22] https://vladh.net/dithering
+[23] https://vladh.net/japanese-recommendations
+[24] https://vladh.net/german-nouns
+[25] https://vladh.net/most-minimal-uk-address
+[26] https://vladh.net/about
+[27] https://vladh.net/music
+[28] https://vladh.net/photos
+[29] https://vladh.net/books
+[30] https://vladh.net/index.xml
+[31] https://vladh.net/wage-labour-resources
+[32] https://vladh.net/alternatives-to-wage-labour
+[33] https://vladh.net/the-epistemic-implications-of-ai-assistants
+[34] https://vladh.net/our-schools-should-teach-communication
+[35] https://vladh.net/voting-regardless-of-citizenship
+[36] https://vladh.net/apologies
+[37] https://vladh.net/manifesto
+[38] https://vladh.net/hare
+[39] https://vladh.net/implementing-regular-expressions-in-hare
+[40] https://vladh.net/peony
+[41] https://vladh.net/game-engine-skeletal-animation
+[42] https://vladh.net/clumsycomputer
+[43] https://vladh.net/submodule
+[44] https://vladh.net/vegvisir
+[45] https://vladh.net/pstr
+[46] https://vladh.net/dithering
+[47] https://vladh.net/japanese-recommendations
+[48] https://vladh.net/german-nouns
+[49] https://vladh.net/most-minimal-uk-address
+[50] https://harpers.org/archive/1932/10/in-praise-of-idleness/
+[51] https://www.goodreads.com/book/show/36531574-bullshit-jobs
+[52] https://www.goodreads.com/book/show/50364458-the-tyranny-of-merit
+[53] https://theanarchistlibrary.org/library/bob-black-the-abolition-of-work
+[54] https://www.goodreads.com/book/show/49098225-another-now
+[55] https://www.goodreads.com/book/show/36490332-talking-to-my-daughter-about-the-economy
+[56] https://www.goodreads.com/en/book/show/19144936
+[57] http://xenopraxis.net/readings/adorno_freetime.pdf
+[58] https://vladh.net/alternatives-to-wage-labour
+[59] https://webring.xxiivv.com/#vladh
+[60] https://creativecommons.org/licenses/by-sa/4.0/
diff --git a/static/archive/warpspire-com-bhv7lv.txt b/static/archive/warpspire-com-bhv7lv.txt
index 66cda09..a02404a 100644
--- a/static/archive/warpspire-com-bhv7lv.txt
+++ b/static/archive/warpspire-com-bhv7lv.txt
@@ -1,333 +1,323 @@
- #[1]alternate
+[1]
- * [2]Now
- * [3]Giving
- * [4]Offsets
- * [5]About Me
+ • [2]Now
+ • [3]Giving
+ • [4]Offsets
+ • [5]About Me
Some Favorite Reads From 2022
- January 15, 2023
+January 15, 2023
- Another year, and another [6]blog post (singular). Oh well. I always
- have aspirations to publish more! But you know, one of the joys of
- being semi-retired is not having to do anything. You know, it’s been a
- hard few years. So I tried to take it easy on myself in 2022. I spent a
- lot of time exploring, a lot of time reflecting, and a good bit of time
- just doing whatever felt right at the time.
+Another year, and another [6]blog post (singular). Oh well. I always have
+aspirations to publish more! But you know, one of the joys of being
+semi-retired is not having to do anything. You know, it’s been a hard few
+years. So I tried to take it easy on myself in 2022. I spent a lot of time
+exploring, a lot of time reflecting, and a good bit of time just doing whatever
+felt right at the time.
- For example, going on a road trip with my mountain bike
+For example, going on a road trip with my mountain bike
- Recently I’ve been reflecting on some of my favorite things from last
- year. Maybe as a way to focus on the positive. Maybe as a way to keep
- track of time in our time sick world. Maybe just to get back into the
- habit of writing. So here’s some of my favorite reads of 2022.
- __________________________________________________________________
+Recently I’ve been reflecting on some of my favorite things from last year.
+Maybe as a way to focus on the positive. Maybe as a way to keep track of time
+in our time sick world. Maybe just to get back into the habit of writing. So
+here’s some of my favorite reads of 2022.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Books
- I really enjoy reading, but this year I kind of gave myself a pass on
- anything too serious — mostly sticking to my trusty home base
- of science fiction.
- * [7][this-is-how-you-lose-the-time-war.jpg]
+I really enjoy reading, but this year I kind of gave myself a pass on anything
+too serious — mostly sticking to my trusty home base of science fiction.
-This is How You Lose The Time War
- * [8][rendevous-with-rama.jpg]
+ • [7] [this-is-ho]
-Rendevous with Rama
- * [9][elder-race.jpg]
+ This is How You Lose The Time War
-Elder Race
- * [10][artifact-space.jpg]
+ • [8] [rendevous-]
-Artifact Space
+ Rendevous with Rama
+
+ • [9] [elder-race]
+
+ Elder Race
+
+ • [10] [artifact-s]
+
+ Artifact Space
Amal El-Mohtar and Max Gladstone’s [11]This is How You Lose the Time War
- From the publisher:
+From the publisher:
- Among the ashes of a dying world, an agent of the Commandment finds
- a letter. It reads: Burn before reading.
+ Among the ashes of a dying world, an agent of the Commandment finds a
+ letter. It reads: Burn before reading.
- Thus begins an unlikely correspondence between two rival agents
- hellbent on securing the best possible future for their warring
- factions. Now, what began as a taunt, a battlefield boast, becomes
- something more. Something epic. Something romantic. Something that
- could change the past and the future.
+ Thus begins an unlikely correspondence between two rival agents hellbent on
+ securing the best possible future for their warring factions. Now, what
+ began as a taunt, a battlefield boast, becomes something more. Something
+ epic. Something romantic. Something that could change the past and the
+ future.
- I fucking loved this book. I started it based on a recommendation from
- a friend, and didn’t really look into it much before I started. This
- book is much less about the plot (which is a play off The End of
- Eternity) and more about the writing and world building. The best way I
- could describe it is a spy story told through love letters in a poetic
- universe.
+I fucking loved this book. I started it based on a recommendation from a
+friend, and didn’t really look into it much before I started. This book is much
+less about the plot (which is a play off The End of Eternity) and more about
+the writing and world building. The best way I could describe it is a spy story
+told through love letters in a poetic universe.
- Think of birds as a comms channel I can open and close seasonally;
- fellow operatives relate their work to me at the equinoxes; Garden
- blooms more brightly in my belly. There’s enough traffic that it’s a
- simple matter to disguise incoming and outgoing correspondence,
- misdirect, hide in plain sight.
+ Think of birds as a comms channel I can open and close seasonally; fellow
+ operatives relate their work to me at the equinoxes; Garden blooms more
+ brightly in my belly. There’s enough traffic that it’s a simple matter to
+ disguise incoming and outgoing correspondence, misdirect, hide in plain
+ sight.
- It’s also a short read, which was a nice breath of fresh air after
- finishing off the Dune series prior to picking this one up. I have a
- feeling this is going to be one of my most recommended books going
- forward.
+It’s also a short read, which was a nice breath of fresh air after finishing
+off the Dune series prior to picking this one up. I have a feeling this is
+going to be one of my most recommended books going forward.
Arthur C. Clarke’s [12]Rendevous with Rama
- From the publisher:
+From the publisher:
- An enormous cylindrical object has entered Earth’s solar system on a
- collision course with the sun. A team of astronauts are sent to
- explore the mysterious craft, which the denizens of the solar system
- name Rama. What they find is astonishing evidence of a civilization
- far more advanced than ours. They find an interior stretching over
- fifty kilometers; a forbidding cylindrical sea; mysterious and
- inaccessible buildings; and strange machine-animal hybrids, or
- “biots,” that inhabit the ship. But what they don’t find is an alien
- presence. So who–and where–are the Ramans?
+ An enormous cylindrical object has entered Earth’s solar system on a
+ collision course with the sun. A team of astronauts are sent to explore the
+ mysterious craft, which the denizens of the solar system name Rama. What
+ they find is astonishing evidence of a civilization far more advanced than
+ ours. They find an interior stretching over fifty kilometers; a forbidding
+ cylindrical sea; mysterious and inaccessible buildings; and strange
+ machine-animal hybrids, or “biots,” that inhabit the ship. But what they
+ don’t find is an alien presence. So who–and where–are the Ramans?
- I’d never read the Rama books before, so when I heard that Denis
- Villeneuve was going to be [13]tackling Rendevous with Rama, I took the
- opportunity to read the whole series (Rendevous with Rama, Rama II, The
- Garden of Rama, and Rama Revealed).
+I’d never read the Rama books before, so when I heard that Denis Villeneuve was
+going to be [13]tackling Rendevous with Rama, I took the opportunity to read
+the whole series (Rendevous with Rama, Rama II, The Garden of Rama, and Rama
+Revealed).
- Rendevous with Rama is a fantastically Clarke book. A team of highly
- trained professionals all work together to explore a mysterious object
- in space. Does much more need to be said? This book went down like a
- peanut butter and jelly sandwich. My only criticism is that it left me
- wanting for was more.
+Rendevous with Rama is a fantastically Clarke book. A team of highly trained
+professionals all work together to explore a mysterious object in space. Does
+much more need to be said? This book went down like a peanut butter and jelly
+sandwich. My only criticism is that it left me wanting for was more.
- Rama is a cosmic egg, being warmed by the fires of the Sun. It may
- hatch at any moment.
+ Rama is a cosmic egg, being warmed by the fires of the Sun. It may hatch at
+ any moment.
- And unfortunately, there is more.
+And unfortunately, there is more.
- Clarke teamed up with Gentry Lee to write three more novels — Rama II,
- The Garden of Rama, and Rama Revealed and I all I can say is: I do not
- recommend them. They are upsetting in very odd child-bride wedding
- night kinds of ways.
+Clarke teamed up with Gentry Lee to write three more novels — Rama II, The
+Garden of Rama, and Rama Revealed and I all I can say is: I do not recommend
+them. They are upsetting in very odd child-bride wedding night kinds of ways.
Adrian Tchaikovsky’s [14]Elder Race
- From the publisher:
+From the publisher:
- A junior anthropologist on a distant planet must help the locals he
- has sworn to study to save a planet from an unbeatable foe.
+ A junior anthropologist on a distant planet must help the locals he has
+ sworn to study to save a planet from an unbeatable foe.
- I loved Tchaikovsky’s Children of Time, so when I heard Jason Snell
- offer up Elder Race on The Incomperable, I decided to give it a go. I
- absolutely love the premise of this book. It’s a singular story told
- from two different viewpoints, one of them science fiction, and the
- other fantasy — both happening in parallel — because the two main
- characters don’t share enough dialect to explain themselves to each
- other.
+I loved Tchaikovsky’s Children of Time, so when I heard Jason Snell offer up
+Elder Race on The Incomperable, I decided to give it a go. I absolutely love
+the premise of this book. It’s a singular story told from two different
+viewpoints, one of them science fiction, and the other fantasy — both happening
+in parallel — because the two main characters don’t share enough dialect to
+explain themselves to each other.
- They think I’m a wizard. They think I’m a fucking wizard. That’s
- what I am to them, some weird goblin man from another time with
- magic powers. And I literally do not have the language to tell them
- otherwise. I say, “scientist,” “scholar,” but when I speak to them,
- in their language, these are both cognates for “wizard.” I imagine
- myself standing there speaking to Lyn and saying, “I’m not a wizard;
- I’m a wizard, or at best a wizard.” It’s not funny.
+ They think I’m a wizard. They think I’m a fucking wizard. That’s what I am
+ to them, some weird goblin man from another time with magic powers. And I
+ literally do not have the language to tell them otherwise. I say,
+ “scientist,” “scholar,” but when I speak to them, in their language, these
+ are both cognates for “wizard.” I imagine myself standing there speaking to
+ Lyn and saying, “I’m not a wizard; I’m a wizard, or at best a wizard.” It’s
+ not funny.
- And who doesn’t love an old, cranky wizard anthropologist?
+And who doesn’t love an old, cranky wizard anthropologist?
Miles Cameron’s [15]Artifact Space
- From the publisher:
+From the publisher:
- Out in the darkness of space, something is targeting the Greatships.
+ Out in the darkness of space, something is targeting the Greatships.
- With their vast cargo holds and a crew that could fill a city, the
- Greatships are the lifeblood of human occupied space, transporting
- an unimaginable volume - and value - of goods from City, the
- greatest human orbital, all the way to Tradepoint at the other, to
- trade for xenoglas with an unknowable alien species.
+ With their vast cargo holds and a crew that could fill a city, the
+ Greatships are the lifeblood of human occupied space, transporting an
+ unimaginable volume - and value - of goods from City, the greatest human
+ orbital, all the way to Tradepoint at the other, to trade for xenoglas with
+ an unknowable alien species.
- This was another recommendation from a friend, and I’m glad I picked it
- up. At it’s core, it’s about highly competent people all working
- together, pushing their limits, and achieving success. It’s the kind of
- genre someone once described to me as competency porn — Star Trek: The
- Next Generation being the ultimate example.
+This was another recommendation from a friend, and I’m glad I picked it up. At
+it’s core, it’s about highly competent people all working together, pushing
+their limits, and achieving success. It’s the kind of genre someone once
+described to me as competency porn — Star Trek: The Next Generation being the
+ultimate example.
- There was very little drama in Space Operations. In fact, every
- station projected an elaborate aura of calm, as if they were
- competing to be dry and emotionless. No one swore, no one spat, no
- one was angry or afraid. Nbaro loved it.
+ There was very little drama in Space Operations. In fact, every station
+ projected an elaborate aura of calm, as if they were competing to be dry
+ and emotionless. No one swore, no one spat, no one was angry or afraid.
+ Nbaro loved it.
- This book pulls from a lot of familiar ideas — the Greatships are an
- obvious call back to Battlestars, while a lot of the socialist themes
- call back to Star Trek’s economy. My biggest criticism of this book is
- the maddening way Cameron switches back and forth between using
- character’s first and last names — even within the same scene! It makes
- it incredibly difficult to keep track of who is who with such a large
- cast, and toward the end I caught myself not even remembering who a
- certain person was.
+This book pulls from a lot of familiar ideas — the Greatships are an obvious
+call back to Battlestars, while a lot of the socialist themes call back to Star
+Trek’s economy. My biggest criticism of this book is the maddening way Cameron
+switches back and forth between using character’s first and last names — even
+within the same scene! It makes it incredibly difficult to keep track of who is
+who with such a large cast, and toward the end I caught myself not even
+remembering who a certain person was.
Dennis E. Taylor’s [16]Heaven’s River (Audiobook)
- From the publisher:
+From the publisher:
- More than a hundred years ago, Bender set out for the stars and was
- never heard from again. There has been no trace of him despite
- numerous searches by his clone-mates. Now Bob is determined to
- organize an expedition to learn Bender’s fate—whatever the cost.
+ More than a hundred years ago, Bender set out for the stars and was never
+ heard from again. There has been no trace of him despite numerous searches
+ by his clone-mates. Now Bob is determined to organize an expedition to
+ learn Bender’s fate—whatever the cost.
- The Bobiverse is probably my favorite audiobook series of all time.
- It’s all a part of a grand space opera spanning the galaxy… but also
- pretty sarcastic and silly? Ray Porter does an amazing job of narrating
- these books, and is a large part of why I enjoy them so much.
+The Bobiverse is probably my favorite audiobook series of all time. It’s all a
+part of a grand space opera spanning the galaxy… but also pretty sarcastic and
+silly? Ray Porter does an amazing job of narrating these books, and is a large
+part of why I enjoy them so much.
- Heaven’s River finds a way to pull the series back from the infinite
- and focuses back down on a single planet for a great little beaver
- adventure.
+Heaven’s River finds a way to pull the series back from the infinite and
+focuses back down on a single planet for a great little beaver adventure.
- Well, space beavers.
- __________________________________________________________________
+Well, space beavers.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Even More Books
- Neal Stephenson’s [17]Termination Shock: Okay, I actually like
- Stephenson, and this is a very good book about the inevitable future of
- Geoengineering and it’s political consequences. Coupled with a very
- weird Queen fetish. It’s weird. Weird enough to take away from the
- story line. But if the climate angle of the book interests you — I
- highly recommend [18]After Geoengineering as a follow-up.
+Neal Stephenson’s [17]Termination Shock: Okay, I actually like Stephenson, and
+this is a very good book about the inevitable future of Geoengineering and it’s
+political consequences. Coupled with a very weird Queen fetish. It’s weird.
+Weird enough to take away from the story line. But if the climate angle of the
+book interests you — I highly recommend [18]After Geoengineering as a
+follow-up.
- Baoshu’s [19]The Redemption of Time: A semi-official 4th book of the
- Three Body Problem. This is a great continuation of the series, and a
- good way to answer some lingering questions about the Trisolarians.
+Baoshu’s [19]The Redemption of Time: A semi-official 4th book of the Three Body
+Problem. This is a great continuation of the series, and a good way to answer
+some lingering questions about the Trisolarians.
- Frank Herbert’s [20]Heretics of Dune (Dune 5): I was a little shocked
- at how much I loved this book. I mean, I love Dune. But this one ended
- up being one of my favorites of the series. Great new characters, new
- technologies, and a whole new set of powers for the Atreides genetics.
+Frank Herbert’s [20]Heretics of Dune (Dune 5): I was a little shocked at how
+much I loved this book. I mean, I love Dune. But this one ended up being one of
+my favorites of the series. Great new characters, new technologies, and a whole
+new set of powers for the Atreides genetics.
- Adrian Tchaikovsky’s [21]Children of Time: This was actually a re-read
- in preparation of reading Children of Ruin and the upcoming Children of
- Memory. What can I say? It’s one of my favorite science fiction books
- of all time — even if only for the worldbuilding. Sentient spiders?
- Sentient spiders!
- __________________________________________________________________
+Adrian Tchaikovsky’s [21]Children of Time: This was actually a re-read in
+preparation of reading Children of Ruin and the upcoming Children of Memory.
+What can I say? It’s one of my favorite science fiction books of all time —
+even if only for the worldbuilding. Sentient spiders? Sentient spiders!
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Newsletters
Alex Steffen’s [22]The Snap Forward
- From [23]Discontinuity is the Job:
+From [23]Discontinuity is the Job:
- To be alive right now is to find ourselves flattened against the
- fact that the entire human world—our cities and infrastructure, our
- economy and education system, our farms and factories, our laws and
- politics—was built for a different planet.
+ To be alive right now is to find ourselves flattened against the fact that
+ the entire human world—our cities and infrastructure, our economy and
+ education system, our farms and factories, our laws and politics—was built
+ for a different planet.
- I can’t remember exactly how I stumbled on Alex Steffen’s The Snap
- Forward but the idea instantly clicked with me. His newsletter focuses
- on how climate has affected our infrastructure, our society, and our
- relationship to the world. I love his newsletter because it makes me
- feel more sane in a world that keeps trying to sell a new carbon offset
- marketplace as the solution.
+I can’t remember exactly how I stumbled on Alex Steffen’s The Snap Forward but
+the idea instantly clicked with me. His newsletter focuses on how climate has
+affected our infrastructure, our society, and our relationship to the world. I
+love his newsletter because it makes me feel more sane in a world that keeps
+trying to sell a new carbon offset marketplace as the solution.
- From [24]Tempo, Timing, and the Translucence of the Future
+From [24]Tempo, Timing, and the Translucence of the Future
- The tempo of change, and our refusal to acknowledge its
- acceleration, has turned our visions of continuity, stability and
- value into fantasy worlds. We’re cosplaying people who live in past
- decades before discontinuity ate our societies.
+ The tempo of change, and our refusal to acknowledge its acceleration, has
+ turned our visions of continuity, stability and value into fantasy worlds.
+ We’re cosplaying people who live in past decades before discontinuity ate
+ our societies.
- I wouldn’t classify The Snap Forward as doomerism, either. It’s a focus
- on accepting the world as it is and looking for solutions within that
- framework. Even if all emissions were cut to zero tomorrow, we’d still
- be facing a myriad of very challenging futures. What do we do with that
- knowledge? How do we prepare for the transapocalyptic now?
+I wouldn’t classify The Snap Forward as doomerism, either. It’s a focus on
+accepting the world as it is and looking for solutions within that framework.
+Even if all emissions were cut to zero tomorrow, we’d still be facing a myriad
+of very challenging futures. What do we do with that knowledge? How do we
+prepare for the transapocalyptic now?
Matt Levine’s [25]Money Stuff
- I’ve been reading Money Stuff for a few years now, and I can’t really
- put my thumb on why I love it so much. Sure, it’s about finance… but
- kind of the weird stuff in finance. More about the cogs of the
- machinery and the weird personalities in the news than it is about
- whether the S&P 500 is going to go up or down next week.
+I’ve been reading Money Stuff for a few years now, and I can’t really put my
+thumb on why I love it so much. Sure, it’s about finance… but kind of the weird
+stuff in finance. More about the cogs of the machinery and the weird
+personalities in the news than it is about whether the S&P 500 is going to go
+up or down next week.
- From [26]FTX’s Balance Sheet Was Bad:
+From [26]FTX’s Balance Sheet Was Bad:
- But then there is the “Hidden, poorly internally labeled ‘fiat@’
- account,” with a balance of negative $8 billion. I don’t actually
- think that you’re supposed to subtract that number from net equity —
- though I do not know how this balance sheet is supposed to work! —
- but it doesn’t matter. If you try to calculate the equity of a
- balance sheet with an entry for HIDDEN POORLY INTERNALLY LABELED
- ACCOUNT, Microsoft Clippy will appear before you in the flesh,
- bloodshot and staggering, with a knife in his little paper-clip
- hand, saying “just what do you think you’re doing Dave?” You cannot
- apply ordinary arithmetic to numbers in a cell labeled “HIDDEN
- POORLY INTERNALLY LABELED ACCOUNT.” The result of adding or
- subtracting those numbers with ordinary numbers is not a number; it
- is prison.
+ But then there is the “Hidden, poorly internally labeled ‘fiat@’ account,”
+ with a balance of negative $8 billion. I don’t actually think that you’re
+ supposed to subtract that number from net equity — though I do not know how
+ this balance sheet is supposed to work! — but it doesn’t matter. If you try
+ to calculate the equity of a balance sheet with an entry for HIDDEN POORLY
+ INTERNALLY LABELED ACCOUNT, Microsoft Clippy will appear before you in the
+ flesh, bloodshot and staggering, with a knife in his little paper-clip
+ hand, saying “just what do you think you’re doing Dave?” You cannot apply
+ ordinary arithmetic to numbers in a cell labeled “HIDDEN POORLY INTERNALLY
+ LABELED ACCOUNT.” The result of adding or subtracting those numbers with
+ ordinary numbers is not a number; it is prison.
- It’s an understatement to say I don’t love finance, but I do enjoy me
- some Money Stuff.
- __________________________________________________________________
+It’s an understatement to say I don’t love finance, but I do enjoy me some
+Money Stuff.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
What’s Next?
- I’ve really been enjoying re-visiting some of my favorite authors and
- finishing off big series I never quite got around to. Last year I
- finally finished off the whole of Frank Herbert’s Dune (never having
- read 5 & 6 before), and this year I’m getting the itch to do the same
- for Foundation. To be frank, I don’t even remember where I ended with
- that series. But it does feel like a good opportunity to maybe just
- re-visit the entirety of the Asimov Universe… [27]in chronological
- order. I’m also getting a terrible itch to revisit a bunch of
- Vonnegut’s work after watching the excellent [28]Unstuck in Time. But I
- like new authors too!
+I’ve really been enjoying re-visiting some of my favorite authors and finishing
+off big series I never quite got around to. Last year I finally finished off
+the whole of Frank Herbert’s Dune (never having read 5 & 6 before), and this
+year I’m getting the itch to do the same for Foundation. To be frank, I don’t
+even remember where I ended with that series. But it does feel like a good
+opportunity to maybe just re-visit the entirety of the Asimov Universe… [27]in
+chronological order. I’m also getting a terrible itch to revisit a bunch of
+Vonnegut’s work after watching the excellent [28]Unstuck in Time. But I like
+new authors too!
- I’m also interested in finding more books and newsletters about… I
- guess you’d call it urban design. Stuff like [29]Strong Towns and other
- sources of how to adapt our cities into resilient communities. I
- actually have background in city planning from my Civil Engineering
- days, but I feel like there’s been a big surge in new thinking that
- goes farther than the YIMBY/NIMBY noise of the past decade.
+I’m also interested in finding more books and newsletters about… I guess you’d
+call it urban design. Stuff like [29]Strong Towns and other sources of how to
+adapt our cities into resilient communities. I actually have background in city
+planning from my Civil Engineering days, but I feel like there’s been a big
+surge in new thinking that goes farther than the YIMBY/NIMBY noise of the past
+decade.
- Have some recommendations? Hit me up on Mastadon:
- [30]@kneath@indieweb.social.
+Have some recommendations? Hit me up on Mastadon: [30]@kneath@indieweb.social.
- Est. 2003 • Do Hard Things • Build. Learn. Explore.
+Est. 2003 • Do Hard Things • Build. Learn. Explore.
-References
- Visible links:
- 1. http://warpspire.com/feed/
- 2. https://warpspire.com/now
- 3. https://warpspire.com/giving
- 4. https://warpspire.com/offset
- 5. https://warpspire.com/about
- 6. https://warpspire.com/posts/money-pit
- 7. https://bookshop.org/p/books/this-is-how-you-lose-the-time-war-amal-el-mohtar/18270911?aid=13508&ean=9781534430990&gclid=CjwKCAiAy_CcBhBeEiwAcoMRHMYspqPk88ZoP8--CUUbXYfJi5-1npSPEUSq-QroPTijJK-cIC1CAxoCIGsQAvD_BwE&listref=this-is-how-you-lose-the-time-war
- 8. https://bookshop.org/p/books/rendezvous-with-rama-arthur-c-clarke/8296887?ean=9780358380221
- 9. https://bookshop.org/p/books/elder-race-adrian-tchaikovsky/15877279
- 10. https://bookshop.org/p/books/artifact-space-miles-cameron/18367466?ean=9781473232617
- 11. https://bookshop.org/p/books/this-is-how-you-lose-the-time-war-amal-el-mohtar/18270911?aid=13508&ean=9781534430990&gclid=CjwKCAiAy_CcBhBeEiwAcoMRHMYspqPk88ZoP8--CUUbXYfJi5-1npSPEUSq-QroPTijJK-cIC1CAxoCIGsQAvD_BwE&listref=this-is-how-you-lose-the-time-war
- 12. https://bookshop.org/p/books/rendezvous-with-rama-arthur-c-clarke/8296887?ean=9780358380221
- 13. https://www.hollywoodreporter.com/movies/movie-news/denis-villeneuve-rendezvous-with-rama-movie-1235062337/
- 14. https://bookshop.org/p/books/elder-race-adrian-tchaikovsky/15877279
- 15. https://bookshop.org/p/books/artifact-space-miles-cameron/18367466?ean=9781473232617
- 16. https://www.amazon.com/Heavens-River-Bobiverse-Book-4/dp/B088C51F5H/ref=tmm_aud_swatch_0?_encoding=UTF8&qid=&sr=
- 17. https://bookshop.org/p/books/termination-shock-neal-stephenson/18272978?ean=9780063028067
- 18. https://bookshop.org/books/after-geoengineering-climate-tragedy-repair-and-restoration/9781788730365
- 19. https://bookshop.org/p/books/the-redemption-of-time-a-three-body-problem-novel-baoshu/6986329?ean=9781250306005
- 20. https://bookshop.org/p/books/heretics-of-dune-frank-herbert/7513860?ean=9780593098264
- 21. https://bookshop.org/p/books/children-of-time-adrian-tchaikovsky/113411?ean=9780316452502
- 22. https://alexsteffen.substack.com/
- 23. https://alexsteffen.substack.com/p/discontinuity-is-the-job
- 24. https://alexsteffen.substack.com/p/tempo-timing-and-the-translucence
- 25. https://www.bloomberg.com/account/newsletters/money-stuff
- 26. https://newsletters.feedbinusercontent.com/818/8185a1196937308adee75e80f544a29a36b34a5f.html
- 27. https://gist.github.com/kneath/27a2772f5e1871e3c314ef05a4cacd44
- 28. https://www.vonnegutmovie.com/
- 29. https://www.strongtowns.org/
- 30. https://indieweb.social/@kneath
+References:
- Hidden links:
- 32. https://warpspire.com/
+[1] https://warpspire.com/
+[2] https://warpspire.com/now
+[3] https://warpspire.com/giving
+[4] https://warpspire.com/offset
+[5] https://warpspire.com/about
+[6] https://warpspire.com/posts/money-pit
+[7] https://bookshop.org/p/books/this-is-how-you-lose-the-time-war-amal-el-mohtar/18270911?aid=13508&ean=9781534430990&gclid=CjwKCAiAy_CcBhBeEiwAcoMRHMYspqPk88ZoP8--CUUbXYfJi5-1npSPEUSq-QroPTijJK-cIC1CAxoCIGsQAvD_BwE&listref=this-is-how-you-lose-the-time-war
+[8] https://bookshop.org/p/books/rendezvous-with-rama-arthur-c-clarke/8296887?ean=9780358380221
+[9] https://bookshop.org/p/books/elder-race-adrian-tchaikovsky/15877279
+[10] https://bookshop.org/p/books/artifact-space-miles-cameron/18367466?ean=9781473232617
+[11] https://bookshop.org/p/books/this-is-how-you-lose-the-time-war-amal-el-mohtar/18270911?aid=13508&ean=9781534430990&gclid=CjwKCAiAy_CcBhBeEiwAcoMRHMYspqPk88ZoP8--CUUbXYfJi5-1npSPEUSq-QroPTijJK-cIC1CAxoCIGsQAvD_BwE&listref=this-is-how-you-lose-the-time-war
+[12] https://bookshop.org/p/books/rendezvous-with-rama-arthur-c-clarke/8296887?ean=9780358380221
+[13] https://www.hollywoodreporter.com/movies/movie-news/denis-villeneuve-rendezvous-with-rama-movie-1235062337/
+[14] https://bookshop.org/p/books/elder-race-adrian-tchaikovsky/15877279
+[15] https://bookshop.org/p/books/artifact-space-miles-cameron/18367466?ean=9781473232617
+[16] https://www.amazon.com/Heavens-River-Bobiverse-Book-4/dp/B088C51F5H/ref=tmm_aud_swatch_0?_encoding=UTF8&qid=&sr=
+[17] https://bookshop.org/p/books/termination-shock-neal-stephenson/18272978?ean=9780063028067
+[18] https://bookshop.org/books/after-geoengineering-climate-tragedy-repair-and-restoration/9781788730365
+[19] https://bookshop.org/p/books/the-redemption-of-time-a-three-body-problem-novel-baoshu/6986329?ean=9781250306005
+[20] https://bookshop.org/p/books/heretics-of-dune-frank-herbert/7513860?ean=9780593098264
+[21] https://bookshop.org/p/books/children-of-time-adrian-tchaikovsky/113411?ean=9780316452502
+[22] https://alexsteffen.substack.com/
+[23] https://alexsteffen.substack.com/p/discontinuity-is-the-job
+[24] https://alexsteffen.substack.com/p/tempo-timing-and-the-translucence
+[25] https://www.bloomberg.com/account/newsletters/money-stuff
+[26] https://newsletters.feedbinusercontent.com/818/8185a1196937308adee75e80f544a29a36b34a5f.html
+[27] https://gist.github.com/kneath/27a2772f5e1871e3c314ef05a4cacd44
+[28] https://www.vonnegutmovie.com/
+[29] https://www.strongtowns.org/
+[30] https://indieweb.social/@kneath
diff --git a/static/archive/world-hey-com-ivvqlb.txt b/static/archive/world-hey-com-ivvqlb.txt
index 117fc2f..ae14a77 100644
--- a/static/archive/world-hey-com-ivvqlb.txt
+++ b/static/archive/world-hey-com-ivvqlb.txt
@@ -1,103 +1,104 @@
- #[1]Feed
+[1] [avatar-fb3]
- [2][avatar-fb368b1ee9b185dc2a09b03eabdb61678dd55244]
+David Heinemeier Hansson
- David Heinemeier Hansson
-
- May 4, 2023
+May 4, 2023
Even Amazon can't make sense of serverless or microservices
- The Prime Video team at Amazon has published a rather [3]remarkable
- case study on their decision to dump their serverless, microservices
- architecture and replace it with a monolith instead. This move saved
- them a staggering 90%(!!) on operating costs, and simplified the system
- too. What a win!
- But beyond celebrating their good sense, I think there's a bigger point
- here that applies to our entire industry. Here's the telling bit:
+The Prime Video team at Amazon has published a rather [2]remarkable case study
+on their decision to dump their serverless, microservices architecture and
+replace it with a monolith instead. This move saved them a staggering 90%(!!)
+on operating costs, and simplified the system too. What a win!
- "We designed our initial solution as a distributed system using
- serverless components... In theory, this would allow us to scale
- each service component independently. However, the way we used some
- components caused us to hit a hard scaling limit at around 5% of the
- expected load."
+But beyond celebrating their good sense, I think there's a bigger point here
+that applies to our entire industry. Here's the telling bit:
- That really sums up so much of the microservices craze that was tearing
- through the tech industry for a while: IN THEORY. Now the real-world
- results of all this theory are finally in, and it's clear that in
- practice, microservices pose perhaps the biggest siren song for
- needlessly complicating your system. And serverless only makes it
- worse.
- What makes this story unique is that Amazon was the original poster
- child for service-oriented architectures. The far more reasonable prior
- to microservices. An organizational pattern for dealing with
- intra-company communication at crazy scale when API calls beat
- scheduling coordination meetings.
- SOA makes perfect sense at the scale of Amazon. No single team could
- ever hope to know or understand everything needed to steer such a fleet
- of supertankers. Making teams coordinate via published APIs was a
- stroke of genius.
- But, as with many good ideas, this pattern turned toxic as soon as it
- was adopted outside its original context, and wreaked havoc once it got
- pushed into the internals of single-application architectures. That's
- how we got microservices.
- In many ways, microservices is a zombie architecture. Another strain of
- an intellectual contagion that just refuses to die. It's been eating
- brains since the dark days of J2EE (remote server beans, anyone??)
- through the [4]WS-Deathstar nonsense, and now in the form of
- microservices and serverless.
- But this third wave seems finally to have crested. I wrote an ode to
- [5]The Majestic Monolith way back in 2016. Kelsey Hightower, one of the
- leading voices behind Kubernetes, [6]put it beautifully in 2020:
- "We’re gonna break [the monolith] up and somehow find the
- engineering discipline we never had in the first place... Now you
- went from writing bad code to building bad infrastructure.
- Because it drives a lot of new spend, it drives a lot of new hiring…
- So a lot of people get addicted to all the flourishment of money,
- and marketing, and it’s just a lot of buzz that people are attaching
- their assignment to, when honestly it’s not gonna necessarily solve
- their problem."
+ "We designed our initial solution as a distributed system using serverless
+ components... In theory, this would allow us to scale each service
+ component independently. However, the way we used some components caused us
+ to hit a hard scaling limit at around 5% of the expected load."
- Bingo. Replacing method calls and module separations with network
- invocations and service partitioning within a single, coherent team and
- application is madness in almost all cases.
- I'm happy that we beat back the zombie onslaught of that terrible idea
- for the third time in my living memory, but we still need to stay
- vigilant that we'll eventually have to do it again. Some bad ideas
- simply refuse to die no matter how many times you kill them. All you
- can do is recognize when they rise from the dead once more, and keep
- your retorical shotgun locked and loaded.
- About David Heinemeier Hansson
- Made [7]Basecamp and [8]HEY for the underdogs as co-owner and CTO of
- [9]37signals. Created [10]Ruby on Rails. Wrote [11]REWORK, [12]It
- Doesn't Have to Be Crazy at Work, and [13]REMOTE. Won at Le Mans as a
- [14]racing driver. Fought the big tech monopolies as an [15]antitrust
- advocate. Invested in [16]Danish startups.
+That really sums up so much of the microservices craze that was tearing through
+the tech industry for a while: IN THEORY. Now the real-world results of all
+this theory are finally in, and it's clear that in practice, microservices pose
+perhaps the biggest siren song for needlessly complicating your system. And
+serverless only makes it worse.
- Subscribe to get future posts via email (or grab the [17]RSS feed)
- ____________________ (BUTTON) Subscribe
+What makes this story unique is that Amazon was the original poster child for
+service-oriented architectures. The far more reasonable prior to microservices.
+An organizational pattern for dealing with intra-company communication at crazy
+scale when API calls beat scheduling coordination meetings.
- [18]Sent to the world with HEY
+SOA makes perfect sense at the scale of Amazon. No single team could ever hope
+to know or understand everything needed to steer such a fleet of supertankers.
+Making teams coordinate via published APIs was a stroke of genius.
-References
+But, as with many good ideas, this pattern turned toxic as soon as it was
+adopted outside its original context, and wreaked havoc once it got pushed into
+the internals of single-application architectures. That's how we got
+microservices.
- 1. https://world.hey.com/dhh/feed.atom
- 2. https://world.hey.com/dhh
- 3. https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90
- 4. https://www.flickr.com/photos/psd/1428661128/
- 5. https://m.signalvnoise.com/the-majestic-monolith/
- 6. https://changelog.com/posts/monoliths-are-the-future
- 7. https://www.basecamp.com/
- 8. https://www.hey.com/
- 9. https://37signals.com/
- 10. https://rubyonrails.org/
- 11. https://www.amazon.com/Rework-Jason-Fried/dp/0307463745
- 12. https://www.amazon.com/Doesnt-Have-Be-Crazy-Work/dp/0062874780
- 13. https://www.amazon.com/Remote-Office-Not-Required/dp/0804137501
- 14. https://www.youtube.com/watch?v=iNQl0x6WS3M
- 15. https://dhh.dk/#antitrust
- 16. https://dhh.dk/#investor
- 17. https://world.hey.com/dhh/feed.atom
- 18. https://www.hey.com/world/?utm_source=hw-web
+In many ways, microservices is a zombie architecture. Another strain of an
+intellectual contagion that just refuses to die. It's been eating brains since
+the dark days of J2EE (remote server beans, anyone??) through the [3]
+WS-Deathstar nonsense, and now in the form of microservices and serverless.
+
+But this third wave seems finally to have crested. I wrote an ode to [4]The
+Majestic Monolith way back in 2016. Kelsey Hightower, one of the leading voices
+behind Kubernetes, [5]put it beautifully in 2020:
+
+
+ "We’re gonna break [the monolith] up and somehow find the engineering
+ discipline we never had in the first place... Now you went from writing bad
+ code to building bad infrastructure.
+
+ Because it drives a lot of new spend, it drives a lot of new hiring… So a
+ lot of people get addicted to all the flourishment of money, and marketing,
+ and it’s just a lot of buzz that people are attaching their assignment to,
+ when honestly it’s not gonna necessarily solve their problem."
+
+
+Bingo. Replacing method calls and module separations with network invocations
+and service partitioning within a single, coherent team and application is
+madness in almost all cases.
+
+I'm happy that we beat back the zombie onslaught of that terrible idea for the
+third time in my living memory, but we still need to stay vigilant that we'll
+eventually have to do it again. Some bad ideas simply refuse to die no matter
+how many times you kill them. All you can do is recognize when they rise from
+the dead once more, and keep your retorical shotgun locked and loaded.
+
+About David Heinemeier Hansson
+
+Made [6]Basecamp and [7]HEY for the underdogs as co-owner and CTO of [8]
+37signals. Created [9]Ruby on Rails. Wrote [10]REWORK, [11]It Doesn't Have to
+Be Crazy at Work, and [12]REMOTE. Won at Le Mans as a [13]racing driver. Fought
+the big tech monopolies as an [14]antitrust advocate. Invested in [15]Danish
+startups.
+Subscribe to get future posts via email (or grab the [16]RSS feed)
+[17][ ] Subscribe
+[19]Sent to the world with HEY
+
+
+References:
+
+[1] https://world.hey.com/dhh
+[2] https://www.primevideotech.com/video-streaming/scaling-up-the-prime-video-audio-video-monitoring-service-and-reducing-costs-by-90
+[3] https://www.flickr.com/photos/psd/1428661128/
+[4] https://m.signalvnoise.com/the-majestic-monolith/
+[5] https://changelog.com/posts/monoliths-are-the-future
+[6] https://www.basecamp.com/
+[7] https://www.hey.com/
+[8] https://37signals.com/
+[9] https://rubyonrails.org/
+[10] https://www.amazon.com/Rework-Jason-Fried/dp/0307463745
+[11] https://www.amazon.com/Doesnt-Have-Be-Crazy-Work/dp/0062874780
+[12] https://www.amazon.com/Remote-Office-Not-Required/dp/0804137501
+[13] https://www.youtube.com/watch?v=iNQl0x6WS3M
+[14] https://dhh.dk/#antitrust
+[15] https://dhh.dk/#investor
+[16] https://world.hey.com/dhh/feed.atom
+[19] https://www.hey.com/world/?utm_source=hw-web
diff --git a/static/archive/www-annahavron-com-34fw9w.txt b/static/archive/www-annahavron-com-34fw9w.txt
index 7a821ec..2bba9e0 100644
--- a/static/archive/www-annahavron-com-34fw9w.txt
+++ b/static/archive/www-annahavron-com-34fw9w.txt
@@ -1,287 +1,284 @@
- #[1]RSS Feed
-
- [2]
- 0
-
- [3]Skip to Content
- [4]Anna Havron
-
- [5]Articles
- [6]Blog
- [7]Articles by Topic
- [8]Sort Your Signals
- [9]About
- [10]Subscribe
- [11]Site Notes
- [12]About this site
- [13]Privacy Policy
- (BUTTON) Open Menu Close Menu
- [14]Anna Havron
-
- [15]Articles
- [16]Blog
- [17]Articles by Topic
- [18]Sort Your Signals
- [19]About
- [20]Subscribe
- [21]Site Notes
- [22]About this site
- [23]Privacy Policy
- (BUTTON) Open Menu Close Menu
-
- Folder: Articles
- [24]Back
- Blog
- Articles by Topic
- Sort Your Signals
- About
- Subscribe
- Folder: Site Notes
- [25]Back
- About this site
- Privacy Policy
+[1]
+0
+[2] Skip to Content
+[3]Anna Havron
+[4] Articles
+[5] Blog
+[6] Articles by Topic
+[7] Sort Your Signals
+[8] About
+[9] Subscribe
+[10] Site Notes
+[11] About this site
+[12] Privacy Policy
+Open Menu Close Menu
+[14]Anna Havron
+[15] Articles
+[16] Blog
+[17] Articles by Topic
+[18] Sort Your Signals
+[19] About
+[20] Subscribe
+[21] Site Notes
+[22] About this site
+[23] Privacy Policy
+Open Menu Close Menu
+[25]
+Folder: Articles
+[26] Back
+[27]
+Blog
+[28]
+Articles by Topic
+[29]
+Sort Your Signals
+[30]
+About
+[31]
+Subscribe
+[32]
+Folder: Site Notes
+[33] Back
+[34]
+About this site
+[35]
+Privacy Policy
What Do You Want to Make Real in the World?
- Mar 29
- Written By [26]Anna Havron
+Mar 29
+Written By [36]Anna Havron
- Often the question that drives people’s initial interest in
- productivity is: “How am I going to get everything done?”
+Often the question that drives people’s initial interest in productivity is:
+“How am I going to get everything done?”
- For me, at least, that was true: I got to a point where my life was too
- complicated for me to manage it without a productivity system. And so I
- learned about systems for managing time and information and tasks and
- goals and projects.
+For me, at least, that was true: I got to a point where my life was too
+complicated for me to manage it without a productivity system. And so I learned
+about systems for managing time and information and tasks and goals and
+projects.
- These systems have allowed me to get a lot more done, than I could have
- without them.
+These systems have allowed me to get a lot more done, than I could have without
+them.
- But the danger is that we might too easily substitute getting things
- done — checking off tasks, chores, projects — for living a life of
- depth and resonance.
+But the danger is that we might too easily substitute getting things done —
+checking off tasks, chores, projects — for living a life of depth and
+resonance.
- For example, I want to take a couple of hours [27]for an adventure to
- visit a heron rookery nearby, so I can see dozens of Great Blue herons
- nesting.
+For example, I want to take a couple of hours [37]for an adventure to visit a
+heron rookery nearby, so I can see dozens of Great Blue herons nesting.
- But nesting season for herons coincides with my busiest time of the
- year.
+But nesting season for herons coincides with my busiest time of the year.
- If I tell myself that I need to get everything done before I take time
- to see this, nesting season will be over. I will miss the experience of
- seeing them. (And I still won’t get everything done; I can always think
- of more that I would like to have done, than I can actually do.)
+If I tell myself that I need to get everything done before I take time to see
+this, nesting season will be over. I will miss the experience of seeing them.
+(And I still won’t get everything done; I can always think of more that I would
+like to have done, than I can actually do.)
Stop Asking Yourself How You’ll Get Everything Done
- Most productivity and organizational systems are geared toward the
- world of work, paid or unpaid.
+Most productivity and organizational systems are geared toward the world of
+work, paid or unpaid.
- Few talk about managing your time so that you can pursue important
- relationships and activities that feed your spirit, but not your bank
- account. (Laura Vanderkam’s recent book, Tranquility by Tuesday, is one
- exception to this.)
+Few talk about managing your time so that you can pursue important
+relationships and activities that feed your spirit, but not your bank account.
+(Laura Vanderkam’s recent book, Tranquility by Tuesday, is one exception to
+this.)
- But what we call “leisure activities,” non-work or chore activities,
- non-productive activities in the economic sense, are the very
- activities you might look back on as the most important to cultivating
- a well-lived life: a life where you’ve had rich relationships, where
- you’ve taken time to create things that gave you pleasure to create,
- where you’ve taken time to contribute your energy and efforts to make
- this world a better place.
+But what we call “leisure activities,” non-work or chore activities,
+non-productive activities in the economic sense, are the very activities you
+might look back on as the most important to cultivating a well-lived life: a
+life where you’ve had rich relationships, where you’ve taken time to create
+things that gave you pleasure to create, where you’ve taken time to contribute
+your energy and efforts to make this world a better place.
- Sometimes the belief that you must finish everything on the list,
- whether it’s paid work tasks or chores around the house, robs you of
- leisure time: “But I can’t stop working until I get everything done!”
+Sometimes the belief that you must finish everything on the list, whether it’s
+paid work tasks or chores around the house, robs you of leisure time: “But I
+can’t stop working until I get everything done!”
- Part of the solution for this is using time management techniques such
- as [28]paying yourself first.
+Part of the solution for this is using time management techniques such as [38]
+paying yourself first.
- But part of it is also reframing the question.
+But part of it is also reframing the question.
Ask Instead: What Do You Want to Make Real in the World?
- What if, instead of asking yourself, “What do I need to get done,” you
- ask yourself: “What do I want to make real, in this world?”
+What if, instead of asking yourself, “What do I need to get done,” you ask
+yourself: “What do I want to make real, in this world?”
- What do you want to make real?
+What do you want to make real?
- What do you want to bring from your imagination, into real life?
+What do you want to bring from your imagination, into real life?
- What do you want to make real, that you can experience? Hiking the
- Appalachian Trail from Georgia to Maine? Having clean socks on a
- predictable basis (seriously, that is one of mine)? (Next level: having
- clean socks on a regular basis, while you are hiking the Appalachian
- Trail.)
+What do you want to make real, that you can experience? Hiking the Appalachian
+Trail from Georgia to Maine? Having clean socks on a predictable basis
+(seriously, that is one of mine)? (Next level: having clean socks on a regular
+basis, while you are hiking the Appalachian Trail.)
- What do you want to make real that other people can enjoy or use —
- learning to play music, starting a non-profit program, creating a
- useful app?
+What do you want to make real that other people can enjoy or use — learning to
+play music, starting a non-profit program, creating a useful app?
- What do you want to make real, that makes this world a better place:
- provide [29]housing for purple martins so they can keep migrating to
- North America; provide housing for human beings, so all can live with
- dignity?
+What do you want to make real, that makes this world a better place: provide
+[39]housing for purple martins so they can keep migrating to North America;
+provide housing for human beings, so all can live with dignity?
- We will all have different things that we deeply want to become real,
- in this world. We will all have different experiences and
- accomplishments that we hope to look back on, at the end of a
- well-lived life.
+We will all have different things that we deeply want to become real, in this
+world. We will all have different experiences and accomplishments that we hope
+to look back on, at the end of a well-lived life.
- I personally believe that if everyone took one thing they wanted to see
- changed in this world, and worked toward making that one thing real;
- that we would all be much better off.
+I personally believe that if everyone took one thing they wanted to see changed
+in this world, and worked toward making that one thing real; that we would all
+be much better off.
-Making Things Real in the World Can Take a Lot of Effort; or, Almost No
-Effort at All
+Making Things Real in the World Can Take a Lot of Effort; or, Almost No Effort
+at All
- Lately my key productivity question to myself is: what do I want to
- make real, in this world?
+Lately my key productivity question to myself is: what do I want to make real,
+in this world?
- What do I want to make real, today?
+What do I want to make real, today?
- This can be very small! The other day what I most wanted to make real,
- was some clean socks. (Doing the laundry, a care task I dislike, is
- much more satisfying for me when I cheer myself on, saying, “You go,
- Anna, giving yourself clean socks, good for you!”)
+This can be very small! The other day what I most wanted to make real, was some
+clean socks. (Doing the laundry, a care task I dislike, is much more satisfying
+for me when I cheer myself on, saying, “You go, Anna, giving yourself clean
+socks, good for you!”)
- I also want to write a book, which is a lot more work than throwing a
- load of wash into a machine.
+I also want to write a book, which is a lot more work than throwing a load of
+wash into a machine.
- To make my book real in the world, I’m going to have to put in
- consistent thought and effort over time. The same is true for making
- things real like starting your own business, learning a trade,
- socializing a dog to become a beloved part of the family.
+To make my book real in the world, I’m going to have to put in consistent
+thought and effort over time. The same is true for making things real like
+starting your own business, learning a trade, socializing a dog to become a
+beloved part of the family.
- But some things that are important to you, and that bring you a lot of
- joy, you can make real without much trouble at all.
+But some things that are important to you, and that bring you a lot of joy, you
+can make real without much trouble at all.
Making Things Real is About Responding to Opportunities
- When I was a child, I lived in the Southwest of the U.S., and in
- northern New England: places where cherry blossom trees don’t grow.
+When I was a child, I lived in the Southwest of the U.S., and in northern New
+England: places where cherry blossom trees don’t grow.
- Every year during the spring I would see the Cherry Blossom Festival
- pictures in Washington, DC, and I thought that those trees looked like
- blooming clouds, banks of flowering clouds, on the banks of the
- Potomac. I dreamed of seeing them in real life.
+Every year during the spring I would see the Cherry Blossom Festival pictures
+in Washington, DC, and I thought that those trees looked like blooming clouds,
+banks of flowering clouds, on the banks of the Potomac. I dreamed of seeing
+them in real life.
- It wasn’t until my thirties that I got to experience the Cherry Blossom
- Festival in Washington, DC, in real life rather than in my imagination.
+It wasn’t until my thirties that I got to experience the Cherry Blossom
+Festival in Washington, DC, in real life rather than in my imagination.
- That memory of walking under hundreds of flowering cherry trees, with
- dark rain clouds overhead playing up the lightness of those short-lived
- blossoms, remains one of the most vividly piercing things I have ever
- experienced.
+That memory of walking under hundreds of flowering cherry trees, with dark rain
+clouds overhead playing up the lightness of those short-lived blossoms, remains
+one of the most vividly piercing things I have ever experienced.
- By that time, we lived in an area where cherry trees could grow.
- However, our house already had such a large old maple shading the yard
- that we couldn’t plant other trees.
+By that time, we lived in an area where cherry trees could grow. However, our
+house already had such a large old maple shading the yard that we couldn’t
+plant other trees.
- One day, a storm came and toppled our maple tree.
+One day, a storm came and toppled our maple tree.
- I was saddened to see it go, but realized that now our small yard had
- enough sun and space to plant a Yoshino cherry tree, just like the ones
- in Washington, DC.
+I was saddened to see it go, but realized that now our small yard had enough
+sun and space to plant a Yoshino cherry tree, just like the ones in Washington,
+DC.
- And so we did.
+And so we did.
- Here it is!
+cherry blossom branches with a blue sky behind them
- It took less than a day to plant it. That was fourteen years ago.
+Here it is!
- Now, it is full grown.
+It took less than a day to plant it. That was fourteen years ago.
- I can see blossoming branches from my bedroom window, nodding in the
- breezes, with birds flying in and out of them, and wild solitary bees
- burrowing into the blossoms. Yoshino cherry trees bloom even before
- dandelions bloom.
+Now, it is full grown.
- Being able to see the cherry blossoms each spring, from a flowering
- tree in our own yard, from my bedroom window no less, is — for me — one
- of the best things I have ever made real in the world.
+I can see blossoming branches from my bedroom window, nodding in the breezes,
+with birds flying in and out of them, and wild solitary bees burrowing into the
+blossoms. Yoshino cherry trees bloom even before dandelions bloom.
- And it was hardly any work at all.
- __________________________________________________________________
+Being able to see the cherry blossoms each spring, from a flowering tree in our
+own yard, from my bedroom window no less, is — for me — one of the best things
+I have ever made real in the world.
- Copy and share - [30]the link is here. Never miss a post from
- annahavron.com! [31]Subscribe here to get blog posts via email.
- __________________________________________________________________
+And it was hardly any work at all.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+Copy and share - [40]the link is here. Never miss a post from annahavron.com!
+[41]Subscribe here to get blog posts via email.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
References
- Vanderkam, L. (2022) Tranquility by Tuesday: 9 ways to calm the chaos
- and make time for what matters. New York: Portfolio.
+Vanderkam, L. (2022) Tranquility by Tuesday: 9 ways to calm the chaos and make
+time for what matters. New York: Portfolio.
- Byington, C. (2016) Purple Martins: The Bird That Relies on Human-Built
- Nests, Cool Green Science, 12 September. Available at:
- https://blog.nature.org/2016/09/12/purple-martins-the-bird-that-relies-
- on-human-built-nests/ (Accessed: 28 March 2023).
+Byington, C. (2016) Purple Martins: The Bird That Relies on Human-Built Nests,
+Cool Green Science, 12 September. Available at: https://blog.nature.org/2016/09
+/12/purple-martins-the-bird-that-relies-on-human-built-nests/ (Accessed: 28
+March 2023).
- [32]Anna Havron
- Previous
- Previous
+[42] Anna Havron
+[43]
+Previous
+Previous
City Hawk
- Next
- Next
+[44]
+Next
+Next
Prioritize Your Time By Pretending It Is Money
- © 2024 Anna Havron. All rights reserved. | [33]Privacy policy |
- [34]Subsc[35]ribe
+© 2024 Anna Havron. All rights reserved. | [45]Privacy policy | [46]Subsc[47]
+ribe
-References
- Visible links:
- 1. http://feeds.feedburner.com/AnnaHavron
- 2. https://www.annahavron.com/cart
- 3. https://www.annahavron.com/blog/what-do-you-want-to-make-real-in-the-world#page
- 4. https://www.annahavron.com/
- 5. https://www.annahavron.com/articles
- 6. https://www.annahavron.com/
- 7. https://www.annahavron.com/articles-by-topic
- 8. https://www.annahavron.com/sort-your-signals-from-the-noise
- 9. https://www.annahavron.com/about
- 10. https://www.annahavron.com/subscribe
- 11. https://www.annahavron.com/site-notes
- 12. https://www.annahavron.com/about-this-site
- 13. https://www.annahavron.com/privacy-policy
- 14. https://www.annahavron.com/
- 15. https://www.annahavron.com/articles
- 16. https://www.annahavron.com/
- 17. https://www.annahavron.com/articles-by-topic
- 18. https://www.annahavron.com/sort-your-signals-from-the-noise
- 19. https://www.annahavron.com/about
- 20. https://www.annahavron.com/subscribe
- 21. https://www.annahavron.com/site-notes
- 22. https://www.annahavron.com/about-this-site
- 23. https://www.annahavron.com/privacy-policy
- 24. https://www.annahavron.com/
- 25. https://www.annahavron.com/
- 26. https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
- 27. https://www.annahavron.com/blog/big-adventure-little-adventure
- 28. https://www.annahavron.com/blog/prioritize-by-thinking-of-your-time-as-if-it-were-money
- 29. https://blog.nature.org/2016/09/12/purple-martins-the-bird-that-relies-on-human-built-nests/
- 30. https://www.annahavron.com/blog/what-do-you-want-to-make-real-in-the-world
- 31. https://www.annahavron.com/subscribe
- 32. https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
- 33. https://www.annahavron.com/privacy-policy
- 34. https://www.annahavron.com/subscribe
- 35. https://www.annahavron.com/subscribe
+References:
- Hidden links:
- 37. https://www.annahavron.com/articles
- 38. https://www.annahavron.com/
- 39. https://www.annahavron.com/articles-by-topic
- 40. https://www.annahavron.com/sort-your-signals-from-the-noise
- 41. https://www.annahavron.com/about
- 42. https://www.annahavron.com/subscribe
- 43. https://www.annahavron.com/site-notes
- 44. https://www.annahavron.com/about-this-site
- 45. https://www.annahavron.com/privacy-policy
- 46. https://www.annahavron.com/blog/city-hawk
- 47. https://www.annahavron.com/blog/prioritize-by-thinking-of-your-time-as-if-it-were-money
+[1] https://www.annahavron.com/cart
+[2] https://www.annahavron.com/blog/what-do-you-want-to-make-real-in-the-world#page
+[3] https://www.annahavron.com/
+[4] https://www.annahavron.com/articles
+[5] https://www.annahavron.com/
+[6] https://www.annahavron.com/articles-by-topic
+[7] https://www.annahavron.com/sort-your-signals-from-the-noise
+[8] https://www.annahavron.com/about
+[9] https://www.annahavron.com/subscribe
+[10] https://www.annahavron.com/site-notes
+[11] https://www.annahavron.com/about-this-site
+[12] https://www.annahavron.com/privacy-policy
+[14] https://www.annahavron.com/
+[15] https://www.annahavron.com/articles
+[16] https://www.annahavron.com/
+[17] https://www.annahavron.com/articles-by-topic
+[18] https://www.annahavron.com/sort-your-signals-from-the-noise
+[19] https://www.annahavron.com/about
+[20] https://www.annahavron.com/subscribe
+[21] https://www.annahavron.com/site-notes
+[22] https://www.annahavron.com/about-this-site
+[23] https://www.annahavron.com/privacy-policy
+[25] https://www.annahavron.com/articles
+[26] https://www.annahavron.com/
+[27] https://www.annahavron.com/
+[28] https://www.annahavron.com/articles-by-topic
+[29] https://www.annahavron.com/sort-your-signals-from-the-noise
+[30] https://www.annahavron.com/about
+[31] https://www.annahavron.com/subscribe
+[32] https://www.annahavron.com/site-notes
+[33] https://www.annahavron.com/
+[34] https://www.annahavron.com/about-this-site
+[35] https://www.annahavron.com/privacy-policy
+[36] https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
+[37] https://www.annahavron.com/blog/big-adventure-little-adventure
+[38] https://www.annahavron.com/blog/prioritize-by-thinking-of-your-time-as-if-it-were-money
+[39] https://blog.nature.org/2016/09/12/purple-martins-the-bird-that-relies-on-human-built-nests/
+[40] https://www.annahavron.com/blog/what-do-you-want-to-make-real-in-the-world
+[41] https://www.annahavron.com/subscribe
+[42] https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
+[43] https://www.annahavron.com/blog/city-hawk
+[44] https://www.annahavron.com/blog/prioritize-by-thinking-of-your-time-as-if-it-were-money
+[45] https://www.annahavron.com/privacy-policy
+[46] https://www.annahavron.com/subscribe
+[47] https://www.annahavron.com/subscribe
diff --git a/static/archive/www-annahavron-com-8hj07z.txt b/static/archive/www-annahavron-com-8hj07z.txt
index 21e9169..e46739e 100644
--- a/static/archive/www-annahavron-com-8hj07z.txt
+++ b/static/archive/www-annahavron-com-8hj07z.txt
@@ -1,130 +1,134 @@
- #[1]RSS Feed
-
- [2]
- 0
-
- [3]Skip to Content
- [4]Anna Havron
-
- [5]Articles
- [6]Blog
- [7]Articles by Topic
- [8]Sort Your Signals
- [9]About
- [10]Subscribe
- [11]Site Notes
- [12]About this site
- [13]Privacy Policy
- (BUTTON) Open Menu Close Menu
- [14]Anna Havron
-
- [15]Articles
- [16]Blog
- [17]Articles by Topic
- [18]Sort Your Signals
- [19]About
- [20]Subscribe
- [21]Site Notes
- [22]About this site
- [23]Privacy Policy
- (BUTTON) Open Menu Close Menu
-
- Folder: Articles
- [24]Back
- Blog
- Articles by Topic
- Sort Your Signals
- About
- Subscribe
- Folder: Site Notes
- [25]Back
- About this site
- Privacy Policy
+[1]
+0
+[2] Skip to Content
+[3]Anna Havron
+[4] Articles
+[5] Blog
+[6] Articles by Topic
+[7] Sort Your Signals
+[8] About
+[9] Subscribe
+[10] Site Notes
+[11] About this site
+[12] Privacy Policy
+Open Menu Close Menu
+[14]Anna Havron
+[15] Articles
+[16] Blog
+[17] Articles by Topic
+[18] Sort Your Signals
+[19] About
+[20] Subscribe
+[21] Site Notes
+[22] About this site
+[23] Privacy Policy
+Open Menu Close Menu
+[25]
+Folder: Articles
+[26] Back
+[27]
+Blog
+[28]
+Articles by Topic
+[29]
+Sort Your Signals
+[30]
+About
+[31]
+Subscribe
+[32]
+Folder: Site Notes
+[33] Back
+[34]
+About this site
+[35]
+Privacy Policy
Why Have a Values Plan?
- May 26
- Written By [26]Anna Havron
+May 26
+Written By [36]Anna Havron
- Sharing [27]a talk I gave last week, as one of the presenters at
- [28]micro.blog’s annual [29]Micro Camp.
+Sharing [37]a talk I gave last week, as one of the presenters at [38]
+micro.blog’s annual [39]Micro Camp.
- Bonus: for those of you who like to make cocktails at home, find out
- the real reason behind the Chartreuse shortage!
+Bonus: for those of you who like to make cocktails at home, find out the real
+reason behind the Chartreuse shortage!
- Yes, this is the sine qua non of a first world problem.
+Yes, this is the sine qua non of a first world problem.
- For its makers, it also became an interesting values definition
- problem.
+For its makers, it also became an interesting values definition problem.
- Extra bonus: a drawing I just made now, to go with the talk:
+Extra bonus: a drawing I just made now, to go with the talk:
- Bonus to the bonus bonus:
+[project]
- Here’s [30]the handout I made to go with the talk.
+Bonus to the bonus bonus:
- [31]Anna Havron
+Here’s [40]the handout I made to go with the talk.
- Previous
- Previous
+
+
+[41] Anna Havron
+[42]
+Previous
+Previous
Holding the Space
- Next
- Next
+[43]
+Next
+Next
Professional Wild Birds
- © 2024 Anna Havron. All rights reserved. | [32]Privacy policy |
- [33]Subsc[34]ribe
+© 2024 Anna Havron. All rights reserved. | [44]Privacy policy | [45]Subsc[46]
+ribe
-References
- Visible links:
- 1. http://feeds.feedburner.com/AnnaHavron
- 2. https://www.annahavron.com/cart
- 3. https://www.annahavron.com/blog/why-have-a-values-plan#page
- 4. https://www.annahavron.com/
- 5. https://www.annahavron.com/articles
- 6. https://www.annahavron.com/
- 7. https://www.annahavron.com/articles-by-topic
- 8. https://www.annahavron.com/sort-your-signals-from-the-noise
- 9. https://www.annahavron.com/about
- 10. https://www.annahavron.com/subscribe
- 11. https://www.annahavron.com/site-notes
- 12. https://www.annahavron.com/about-this-site
- 13. https://www.annahavron.com/privacy-policy
- 14. https://www.annahavron.com/
- 15. https://www.annahavron.com/articles
- 16. https://www.annahavron.com/
- 17. https://www.annahavron.com/articles-by-topic
- 18. https://www.annahavron.com/sort-your-signals-from-the-noise
- 19. https://www.annahavron.com/about
- 20. https://www.annahavron.com/subscribe
- 21. https://www.annahavron.com/site-notes
- 22. https://www.annahavron.com/about-this-site
- 23. https://www.annahavron.com/privacy-policy
- 24. https://www.annahavron.com/
- 25. https://www.annahavron.com/
- 26. https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
- 27. https://www.youtube.com/watch?v=GSqMacBblq8
- 28. https://micro.blog/
- 29. https://micro.camp/
- 30. https://static1.squarespace.com/static/5f64c2a45a59eb66a7264992/t/6468cc1048157b44f53b2e08/1684589584608/Handout+and+worksheet+for+making+a+values+plan,+Micro+Camp+2023.pdf
- 31. https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
- 32. https://www.annahavron.com/privacy-policy
- 33. https://www.annahavron.com/subscribe
- 34. https://www.annahavron.com/subscribe
+References:
- Hidden links:
- 36. https://www.annahavron.com/articles
- 37. https://www.annahavron.com/
- 38. https://www.annahavron.com/articles-by-topic
- 39. https://www.annahavron.com/sort-your-signals-from-the-noise
- 40. https://www.annahavron.com/about
- 41. https://www.annahavron.com/subscribe
- 42. https://www.annahavron.com/site-notes
- 43. https://www.annahavron.com/about-this-site
- 44. https://www.annahavron.com/privacy-policy
- 45. https://www.annahavron.com/blog/holding-the-space
- 46. https://www.annahavron.com/blog/professional-wild-birds
+[1] https://www.annahavron.com/cart
+[2] https://www.annahavron.com/blog/why-have-a-values-plan#page
+[3] https://www.annahavron.com/
+[4] https://www.annahavron.com/articles
+[5] https://www.annahavron.com/
+[6] https://www.annahavron.com/articles-by-topic
+[7] https://www.annahavron.com/sort-your-signals-from-the-noise
+[8] https://www.annahavron.com/about
+[9] https://www.annahavron.com/subscribe
+[10] https://www.annahavron.com/site-notes
+[11] https://www.annahavron.com/about-this-site
+[12] https://www.annahavron.com/privacy-policy
+[14] https://www.annahavron.com/
+[15] https://www.annahavron.com/articles
+[16] https://www.annahavron.com/
+[17] https://www.annahavron.com/articles-by-topic
+[18] https://www.annahavron.com/sort-your-signals-from-the-noise
+[19] https://www.annahavron.com/about
+[20] https://www.annahavron.com/subscribe
+[21] https://www.annahavron.com/site-notes
+[22] https://www.annahavron.com/about-this-site
+[23] https://www.annahavron.com/privacy-policy
+[25] https://www.annahavron.com/articles
+[26] https://www.annahavron.com/
+[27] https://www.annahavron.com/
+[28] https://www.annahavron.com/articles-by-topic
+[29] https://www.annahavron.com/sort-your-signals-from-the-noise
+[30] https://www.annahavron.com/about
+[31] https://www.annahavron.com/subscribe
+[32] https://www.annahavron.com/site-notes
+[33] https://www.annahavron.com/
+[34] https://www.annahavron.com/about-this-site
+[35] https://www.annahavron.com/privacy-policy
+[36] https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
+[37] https://www.youtube.com/watch?v=GSqMacBblq8
+[38] https://micro.blog/
+[39] https://micro.camp/
+[40] https://static1.squarespace.com/static/5f64c2a45a59eb66a7264992/t/6468cc1048157b44f53b2e08/1684589584608/Handout+and+worksheet+for+making+a+values+plan%2C+Micro+Camp+2023.pdf
+[41] https://www.annahavron.com/?author=5f64c2a1f52bd37e36682a0d
+[42] https://www.annahavron.com/blog/holding-the-space
+[43] https://www.annahavron.com/blog/professional-wild-birds
+[44] https://www.annahavron.com/privacy-policy
+[45] https://www.annahavron.com/subscribe
+[46] https://www.annahavron.com/subscribe
diff --git a/static/archive/www-artofmanliness-com-6lxmwc.txt b/static/archive/www-artofmanliness-com-6lxmwc.txt
index 4b7c606..552fb08 100644
--- a/static/archive/www-artofmanliness-com-6lxmwc.txt
+++ b/static/archive/www-artofmanliness-com-6lxmwc.txt
@@ -1,550 +1,475 @@
- #[1]alternate [2]alternate [3]alternate
+Menu [1] logo [2]podcast
+[3][ ]
+[4][Submit]
+ • [5] Get Style
+ □ [6]Clothing
+ □ [7]Accessories
+ □ [8]Facial Hair
+ □ [9]Ties
+ • [10] Get Strong
+ □ [11]Fitness
+ □ [12]Health
+ □ [13]Program Review
+ • [14] Get Social
+ □ [15]Family
+ □ [16]Fatherhood
+ □ [17]Relationships
+ □ [18]Social Skills
+ • [19] Get Skilled
+ □ [20]How To
+ □ [21]Manly Know-How
+ □ [22]Outdoor/Survival
+ • [23]Podcast
+ • [24]Books
+ • Find more of the Art of Manliness:
+
+ instagram icon [25]Instagram
+ feedly icon [26]Feedly
+ facebook icon [27]Facebook
+ twitter icon [28]Twitter
+ youtube icon [29]YouTube
+ • [30][ ] cross [31][SUBMIT]
+ Search
+
+ • [32] Clothing
+ • [33] Accessories
+ • [34] Facial Hair
+ • [35] Ties
+
+[36] [lazy] [37]3 Ways to Wear a Henley Shirt [38] [lazy] [39]A Man’s Guide to
+the Oxford Shirt [40] [lazy] [41]Skill of the Week: Instantly Recognize a
+Quality Suit [42] [lazy] [43]How to Get the Stink Out of Synthetic Workout
+Shirts
+[44] [lazy] [45]Did Commandos Go Commando? [46] [lazy] [47]A Man’s Guide to
+Fragrance: How to Choose and Wear Cologne [48] [lazy] [49]My Go-To Sunglasses
+for Summer [50] [lazy] [51]How to Pick the Perfect Men’s Wedding Ring
+[52] [lazy] [53]Your No-Nonsense Guide to Choosing the Right Beard Style [54]
+[lazy] [55]How to Grow a Beard: The One and True Guide [56] [lazy] [57]Beard
+Oil FAQs: Answering All Your Pressing Beardly Questions [58] [lazy] [59]Beard
+Grooming 101: The Lowdown on Products and Routine
+[60] [lazy] [61]Skill of the Week: Tie a Scarf 5 Different Ways [62] * [63]How
+to Tie a Tie [64] [lazy] [65]Skill of the Week: Tie the Half-Windsor Necktie
+Knot [66] [lazy] [67]How to Match a Shirt and Tie
+
+[68]Browse all Get Style
+
+ • [69] Fitness
+ • [70] Health
+ • [71] Program Review
+
+[72] [lazy] [73]Podcast #955: The Power of NEAT — Move a Little to Lose a Lot
+[74] [lazy] [75]Podcast #767: Fat Loss Made Simple [76] [lazy] [77]Legendary
+Bodybuilder Mike Mentzer’s Heavy Duty Method for Maximum Muscle Growth [78]
+[lazy] [79]Podcast #939: What Lifting Ancient Stones Can Teach You About Being
+a Man
+[80] [lazy] [81]What You Can Learn About Shedding Pounds From the Vacation
+Weight Loss Paradox [82] [lazy] [83]You Need to Eat More Fiber [84] [lazy] [85]
+Silencing the Ring: Proven Strategies for Tinnitus Relief [86] [lazy] [87]
+Podcast #947: Turn Your Anxiety Into a Strength
+[88] [lazy] [89]The Insanely Difficult Standards of History’s Hardest P.E.
+Program [90] [lazy] [91]Which Fitness Program Is Right for You? [92] [lazy]
+[93]A Review of the MovNat Workshop [94] [lazy] [95]Strengthen Your Tribe: A
+Report on the Atomic Athlete Vanguard
+
+[96]Browse all Get Strong
+
+ • [97] Family
+ • [98] Fatherhood
+ • [99] Relationships
+ • [100] Social Skills
+
+[101] [lazy] [102]Podcast #946: Counterintuitive Ideas About Marriage, Family,
+and Kids [103] [lazy] [104]The Best Riddles for Kids (With Answers!) [105]
+[lazy] [106]Podcast #858: The Affectionate, Ambiguous, and Surprisingly
+Ambivalent Relationship Between Siblings [107] [lazy] [108]How to Fight
+Entitlement and Develop Gratitude in Your Kids
+[109] [lazy] [110]How to Parent-Teacher Conference [111] [lazy] [112]5 Ways
+Fathers Hugely Influence Their Daughters [113] [lazy] [114]Sunday Firesides: We
+Shouldn’t (and Should) Be Friends With Our Kids [115] [lazy] [116]What to Do
+When Your Kid Lies to You
+[117] [lazy] [118]Sunday Firesides: Can We Finally Stop Blaming the Puritans?
+[119] [lazy] [120]Sunday Firesides: The Sit-in-Silence Relationship Test [121]
+[lazy] [122]Sunday Firesides: Treat People as Ends, Not Means [123] [lazy]
+[124]Podcast #919: Advice on Making Love Last . . . From a Divorce Lawyer
+[125] [lazy] [126]Podcast #957: How Curiosity Conversations Can Supercharge
+Your Success [127] [lazy] [128]Podcast #837: The Cues That Make You Charismatic
+[129] [lazy] [130]Podcast #938: Social Skills as the Road to Character [131]
+[lazy] [132]Podcast #915: Finally Learn to Say No
+
+[133]Browse all Get Social
+
+ • [134] How To
+ • [135] Manly Know-How
+ • [136] Outdoor/Survival
+
+[137] [lazy] [138]Skill of the Week: Wrap a Gift [139] [lazy] [140]How to
+De-Ice Your Windshield Easily and Effectively [141] [lazy] [142]Skill of the
+Week: Paint a Room [143] [lazy] [144]Skill of the Week: Store and Stack
+Firewood
+[145] [lazy] [146]Skill of the Week: Build a Cozy Fireplace Fire (That Won’t
+Make Your House Smoky) [147] [lazy] [148]How to Adjust Your Car Mirrors to
+Eliminate Blind Spots [149] [lazy] [150]Skill of the Week: Throw a Perfect
+Football Spiral [151] [lazy] [152]What’s the Difference Between Gas Octanes?
+[153] [lazy] [154]Skill of the Week: How to Build a Quinzee Snow Shelter [155]
+[lazy] [156]Skill of the Week: Survive an Earthquake [157] [lazy] [158]Two
+Things You Should Be Doing to Take Better Care of Your Camping Gear [159]
+[lazy] [160]Skill of the Week: How to Emergency Rappel
+
+[161]Browse all Get Skilled
+
+in: [167]Advice, [168]Character, [169]Sunday Firesides
+
+Brett & Kate McKay • October 29, 2022
+
+Sunday Firesides: To-Dos, the Rent We Pay For Living
+
+[To-Dos-Rent-for-Living-3]
+
+[170] [171] [172] [173] [174]
+
+You probably brushed your teeth this morning. And will do so tonight. And 730
+more times in the year to come.
+
+As soon as the last load of laundry is folded, it’s time to put in another
+wash. As soon as you’re done eating and cleaning up one meal, it’s time to
+start making the next.
+
+There is a constantly replenishing supply of new texts and emails to answer,
+bills to pay, stuff to buy, bookings to make, forms to fill out.
+
+Whenever you cross one to-do off the list, you add a couple more on.
+
+Whatever you did the day before, you have to wake up and do it all over again.
+
+The relentless slog of life’s maintenance work can feel tiresome, burdensome,
+annoying.
+
+It can feel like you’re Sisyphus, pushing a boulder up a hill, only to have it
+roll back down, ready to be pushed up once more.
- IFRAME: [4]https://www.googletagmanager.com/ns.html?id=GTM-KXJGHMC
+Yet we should be glad to continually find this boulder resting at our feet.
- Menu [5]logo [6]podcast ____________________
- Submit
+Drudgery and chores are the rent we pay for living.
- * [7]Get Style
- + [8]Clothing
- + [9]Accessories
- + [10]Facial Hair
- + [11]Ties
- * [12]Get Strong
- + [13]Fitness
- + [14]Health
- + [15]Program Review
- * [16]Get Social
- + [17]Family
- + [18]Fatherhood
- + [19]Relationships
- + [20]Social Skills
- * [21]Get Skilled
- + [22]How To
- + [23]Manly Know-How
- + [24]Outdoor/Survival
- * [25]Podcast
- * [26]Books
- * Find more of the Art of Manliness:
- instagram icon [27]Instagram
- feedly icon [28]Feedly
- facebook icon [29]Facebook
- twitter icon [30]Twitter
- youtube icon [31]YouTube
- * ____________________ cross Submit
- Search
+While we inhabit mortal existence, this rent is due every day.
- * [32]Clothing
- * [33]Accessories
- * [34]Facial Hair
- * [35]Ties
+It’s not a fine, but a fee.
- [36]3 Ways to Wear a Henley Shirt
+A ticket to continue to ride.
- [37]A Man’s Guide to the Oxford Shirt
+To-dos keep our world spinning, and signal that we continue to exist on a
+spinning world.
- [38]Skill of the Week: Instantly Recognize a Quality Suit
+We ought then to appreciate having one more task-filled day before there comes
+a knock on the door from a sickle-carrying landlord, bearing an eviction notice
+in hand.
- [39]How to Get the Stink Out of Synthetic Workout Shirts
-
- [40]Did Commandos Go Commando?
-
- [41]A Man’s Guide to Fragrance: How to Choose and Wear Cologne
-
- [42]My Go-To Sunglasses for Summer
-
- [43]How to Pick the Perfect Men’s Wedding Ring
-
- [44]Your No-Nonsense Guide to Choosing the Right Beard Style
-
- [45]How to Grow a Beard: The One and True Guide
-
- [46]Beard Oil FAQs: Answering All Your Pressing Beardly Questions
-
- [47]Beard Grooming 101: The Lowdown on Products and Routine
-
- [48]Skill of the Week: Tie a Scarf 5 Different Ways
-
- [49]How to Tie a Tie
-
- [50]Skill of the Week: Tie the Half-Windsor Necktie Knot
-
- [51]How to Match a Shirt and Tie
-
- [52]Browse all Get Style
- * [53]Fitness
- * [54]Health
- * [55]Program Review
-
- [56]Podcast #955: The Power of NEAT — Move a Little to Lose a Lot
-
- [57]Podcast #767: Fat Loss Made Simple
-
- [58]Legendary Bodybuilder Mike Mentzer’s Heavy Duty Method for Maximum
- Muscle Growth
-
- [59]Podcast #939: What Lifting Ancient Stones Can Teach You About Being
- a Man
-
- [60]What You Can Learn About Shedding Pounds From the Vacation Weight
- Loss Paradox
-
- [61]You Need to Eat More Fiber
-
- [62]Silencing the Ring: Proven Strategies for Tinnitus Relief
-
- [63]Podcast #947: Turn Your Anxiety Into a Strength
-
- [64]The Insanely Difficult Standards of History’s Hardest P.E. Program
-
- [65]Which Fitness Program Is Right for You?
-
- [66]A Review of the MovNat Workshop
-
- [67]Strengthen Your Tribe: A Report on the Atomic Athlete Vanguard
-
- [68]Browse all Get Strong
- * [69]Family
- * [70]Fatherhood
- * [71]Relationships
- * [72]Social Skills
-
- [73]Podcast #946: Counterintuitive Ideas About Marriage, Family, and
- Kids
-
- [74]The Best Riddles for Kids (With Answers!)
-
- [75]Podcast #858: The Affectionate, Ambiguous, and Surprisingly
- Ambivalent Relationship Between Siblings
-
- [76]How to Fight Entitlement and Develop Gratitude in Your Kids
-
- [77]How to Parent-Teacher Conference
-
- [78]5 Ways Fathers Hugely Influence Their Daughters
-
- [79]Sunday Firesides: We Shouldn’t (and Should) Be Friends With Our
- Kids
-
- [80]What to Do When Your Kid Lies to You
-
- [81]Sunday Firesides: Can We Finally Stop Blaming the Puritans?
-
- [82]Sunday Firesides: The Sit-in-Silence Relationship Test
-
- [83]Sunday Firesides: Treat People as Ends, Not Means
-
- [84]Podcast #919: Advice on Making Love Last . . . From a Divorce
- Lawyer
-
- [85]Podcast #957: How Curiosity Conversations Can Supercharge Your
- Success
-
- [86]Podcast #837: The Cues That Make You Charismatic
-
- [87]Podcast #938: Social Skills as the Road to Character
-
- [88]Podcast #915: Finally Learn to Say No
-
- [89]Browse all Get Social
- * [90]How To
- * [91]Manly Know-How
- * [92]Outdoor/Survival
-
- [93]Skill of the Week: Wrap a Gift
-
- [94]How to De-Ice Your Windshield Easily and Effectively
-
- [95]Skill of the Week: Paint a Room
-
- [96]Skill of the Week: Store and Stack Firewood
-
- [97]Skill of the Week: Build a Cozy Fireplace Fire (That Won’t Make
- Your House Smoky)
-
- [98]How to Adjust Your Car Mirrors to Eliminate Blind Spots
-
- [99]Skill of the Week: Throw a Perfect Football Spiral
-
- [100]What’s the Difference Between Gas Octanes?
-
- [101]Skill of the Week: How to Build a Quinzee Snow Shelter
-
- [102]Skill of the Week: Survive an Earthquake
-
- [103]Two Things You Should Be Doing to Take Better Care of Your Camping
- Gear
-
- [104]Skill of the Week: How to Emergency Rappel
-
- [105]Browse all Get Skilled
-
- in: [106]Advice, [107]Character, [108]Sunday Firesides
-
- Brett & Kate McKay • October 29, 2022
-
- Sunday Firesides: To-Dos, the Rent We Pay For Living
-
- You probably brushed your teeth this morning. And will do so tonight.
- And 730 more times in the year to come.
-
- As soon as the last load of laundry is folded, it’s time to put in
- another wash. As soon as you’re done eating and cleaning up one meal,
- it’s time to start making the next.
-
- There is a constantly replenishing supply of new texts and emails to
- answer, bills to pay, stuff to buy, bookings to make, forms to fill
- out.
-
- Whenever you cross one to-do off the list, you add a couple more on.
-
- Whatever you did the day before, you have to wake up and do it all over
- again.
-
- The relentless slog of life’s maintenance work can feel tiresome,
- burdensome, annoying.
-
- It can feel like you’re Sisyphus, pushing a boulder up a hill, only to
- have it roll back down, ready to be pushed up once more.
-
- Yet we should be glad to continually find this boulder resting at our
- feet.
-
- Drudgery and chores are the rent we pay for living.
-
- While we inhabit mortal existence, this rent is due every day.
-
- It’s not a fine, but a fee.
-
- A ticket to continue to ride.
-
- To-dos keep our world spinning, and signal that we continue to exist on
- a spinning world.
-
- We ought then to appreciate having one more task-filled day before
- there comes a knock on the door from a sickle-carrying landlord,
- bearing an eviction notice in hand.
-
- Yes, we should be very glad indeed to have a full list of to-dos before
- us. Because the only solution for clearing your slate of all unfinished
- business, lies six feet underground.
+Yes, we should be very glad indeed to have a full list of to-dos before us.
+Because the only solution for clearing your slate of all unfinished business,
+lies six feet underground.
Related Posts
- * [109]Sunday Firesides: Stop Living Life "Paycheck to Paycheck"
- * [110]Sunday Firesides: Yours Sincerely
- * [111]Sunday Firesides: Love Endures
- * [112]Sunday Firesides: Die Red
- * [113]Sunday Firesides: Dependence to Independence
- * [114]Sunday Firesides: Relationships Over Willpower
+ • [175][paycheck]
+ [176]Sunday Firesides: Stop Living Life "Paycheck to Paycheck"
+ • [177][sincerely-feat]
+ [178]Sunday Firesides: Yours Sincerely
+ • [179][Love-Endures-BLANK]
+ [180]Sunday Firesides: Love Endures
+ • [181][Die-Red-Header-BLANK]
+ [182]Sunday Firesides: Die Red
+ • [183][baby-fireside]
+ [184]Sunday Firesides: Dependence to Independence
+ • [185][rel-feat]
+ [186]Sunday Firesides: Relationships Over Willpower
- [115]Previous [116]Next
+[187] Previous [188]Next
+document
- document
+Never miss an update
- Never miss an update
+Subscribe to the AoM Newsletter
- Subscribe to the AoM Newsletter
- ____________________
- ____________________
- Daily [ ] Weekly [ ]
- I agree to the [117]privacy policy terms. [ ]
- Subscribe
+[189][ ]
+[190][ ]
+Daily [191][ ] Weekly [192][ ]
+I agree to the [193]privacy policy terms. [194][ ]
+[196][Subscribe]
+Want to start taking action on the content you read on AoM?
- teddy teddy icon
+[197]Join the Strenuous Life
+[198]Learn More
+document
- Want to start taking action on the content you read on AoM?
- [118]Join the Strenuous Life
- [119]Learn More
+Never miss an update
- document
+Subscribe to the AoM Newsletter
- Never miss an update
+[199][ ]
+[200][ ]
+Daily [201][ ] Weekly [202][ ]
+I agree to the [203]privacy policy terms. [204][ ]
+[206][Subscribe]
+podcast [207] podcast icon [208] Podcast #959
- Subscribe to the AoM Newsletter
- ____________________
- ____________________
- Daily [ ] Weekly [ ]
- I agree to the [120]privacy policy terms. [ ]
- Subscribe
+Come Alive Again by Having More Fun
- podcast
-
- [121]podcast icon
-
- [122]Podcast #958
+[209] podcast icon [210] Podcast #958
An Insider’s Guide to the Rise of the American Mafia
- [123]podcast icon
-
- [124]Podcast #957
+[211] podcast icon [212] Podcast #957
How Curiosity Conversations Can Supercharge Your Success
- [125]podcast icon
-
- [126]Podcast #956
+[213] podcast icon [214] Podcast #956
Feeling Depressed and Discombobulated? Social Acceleration May Be to Blame
- [127]podcast icon
+[215]View all
- [128]Podcast #955
+Related
-The Power of NEAT — Move a Little to Lose a Lot
+Articles///
- [129]View all
-
- Related
-
- Articles///
- [130]
+[216]
Podcast #958: An Insider’s Guide to the Rise of the American Mafia
- [131]
+[217]
Sunday Firesides: First Day, Worst Day
- [132]
+[218]
Rage, Rage Against the Dying Back of the Brain
- [133]
+[219]
-Podcast #956: Feeling Depressed and Discombobulated? Social Acceleration May
-Be to Blame
+Podcast #956: Feeling Depressed and Discombobulated? Social Acceleration May Be
+to Blame
- [134]View all
+[220]View all
- Get Daily Updates
- [135]Text MANLY to (918) 393-3049
+Get Daily Updates
+[221]Text MANLY to (918) 393-3049
+The Art of Manliness
+Copyright © 2024 All Rights Reserved
- The Art of Manliness
- Copyright © 2024 All Rights Reserved
+ • [222]Contact
+ • [223]Legal
+ • [224]About
+ • [225]All Topics
+ • [226]Archives
- * [136]Contact
- * [137]Legal
- * [138]About
- * [139]All Topics
- * [140]Archives
+The Art of Manliness participates in affiliate marketing programs, which means
+we get paid commissions on editorially chosen products purchased through our
+links. We only recommend products we genuinely like, and purchases made through
+our links support our mission and the free content we publish here on AoM.
- The Art of Manliness participates in affiliate marketing programs,
- which means we get paid commissions on editorially chosen products
- purchased through our links. We only recommend products we genuinely
- like, and purchases made through our links support our mission and the
- free content we publish here on AoM.
-References
+References:
- Visible links:
- 1. https://www.artofmanliness.com/app-json/wp/v2/posts/173682
- 2. https://www.artofmanliness.com/app-json/oembed/1.0/embed?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 3. https://www.artofmanliness.com/app-json/oembed/1.0/embed?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/&format=xml
- 4. https://www.googletagmanager.com/ns.html?id=GTM-KXJGHMC
- 5. https://www.artofmanliness.com/
- 6. https://www.artofmanliness.com/podcast
- 7. https://www.artofmanliness.com/style/
- 8. https://www.artofmanliness.com/style/clothing/
- 9. https://www.artofmanliness.com/style/accessories/
- 10. https://www.artofmanliness.com/style/facial-hair/
- 11. https://www.artofmanliness.com/style/ties/
- 12. https://www.artofmanliness.com/health-fitness/
- 13. https://www.artofmanliness.com/health-fitness/fitness/
- 14. https://www.artofmanliness.com/health-fitness/health/
- 15. https://www.artofmanliness.com/health-fitness/program-review/
- 16. https://www.artofmanliness.com/people/
- 17. https://www.artofmanliness.com/people/family/
- 18. https://www.artofmanliness.com/people/fatherhood/
- 19. https://www.artofmanliness.com/people/relationships/
- 20. https://www.artofmanliness.com/people/social-skills/
- 21. https://www.artofmanliness.com/skills/
- 22. https://www.artofmanliness.com/skills/how-to/
- 23. https://www.artofmanliness.com/skills/manly-know-how/
- 24. https://www.artofmanliness.com/skills/outdoor-survival/
- 25. https://www.artofmanliness.com/podcast/
- 26. https://store.artofmanliness.com/collections/books/
- 27. https://www.instagram.com/artofmanliness/
- 28. https://feedly.com/i/subscription/feed/http://feeds2.feedburner.com/TheArtOfManliness
- 29. https://www.facebook.com/artofmanliness/
- 30. https://twitter.com/artofmanliness
- 31. https://www.youtube.com/user/artofmanliness
- 32. https://www.artofmanliness.com/style/clothing/
- 33. https://www.artofmanliness.com/style/accessories/
- 34. https://www.artofmanliness.com/style/facial-hair/
- 35. https://www.artofmanliness.com/style/ties/
- 36. https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
- 37. https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
- 38. https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
- 39. https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
- 40. https://www.artofmanliness.com/style/did-commandos-go-commando/
- 41. https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
- 42. https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
- 43. https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
- 44. https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
- 45. https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
- 46. https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
- 47. https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
- 48. https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
- 49. https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
- 50. https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
- 51. https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
- 52. https://www.artofmanliness.com/style/
- 53. https://www.artofmanliness.com/health-fitness/fitness/
- 54. https://www.artofmanliness.com/health-fitness/health/
- 55. https://www.artofmanliness.com/health-fitness/program-review/
- 56. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 57. https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
- 58. https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
- 59. https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
- 60. https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
- 61. https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
- 62. https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
- 63. https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
- 64. https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
- 65. https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
- 66. https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
- 67. https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
- 68. https://www.artofmanliness.com/health-fitness/
- 69. https://www.artofmanliness.com/people/family/
- 70. https://www.artofmanliness.com/people/fatherhood/
- 71. https://www.artofmanliness.com/people/relationships/
- 72. https://www.artofmanliness.com/people/social-skills/
- 73. https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
- 74. https://www.artofmanliness.com/people/family/riddles-for-kids/
- 75. https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
- 76. https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
- 77. https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
- 78. https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
- 79. https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
- 80. https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
- 81. https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
- 82. https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
- 83. https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
- 84. https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
- 85. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 86. https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
- 87. https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
- 88. https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
- 89. https://www.artofmanliness.com/people/
- 90. https://www.artofmanliness.com/skills/how-to/
- 91. https://www.artofmanliness.com/skills/manly-know-how/
- 92. https://www.artofmanliness.com/skills/outdoor-survival/
- 93. https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
- 94. https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
- 95. https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
- 96. https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
- 97. https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
- 98. https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
- 99. https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
- 100. https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
- 101. https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
- 102. https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
- 103. https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
- 104. https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
- 105. https://www.artofmanliness.com/skills/
- 106. https://www.artofmanliness.com/character/advice/
- 107. https://www.artofmanliness.com/character/
- 108. https://www.artofmanliness.com/sunday-firesides/
- 109. https://www.artofmanliness.com/character/advice/sunday-firesides-stop-living-life-paycheck-to-paycheck/
- 110. https://www.artofmanliness.com/character/advice/sunday-firesides-yours-sincerely/
- 111. https://www.artofmanliness.com/character/advice/sunday-firesides-love-endures/
- 112. https://www.artofmanliness.com/character/advice/sunday-firesides-die-red/
- 113. https://www.artofmanliness.com/character/advice/sunday-firesides-dependence-to-independence/
- 114. https://www.artofmanliness.com/people/relationships/sunday-firesides-relationships-over-willpower/
- 115. https://www.artofmanliness.com/career-wealth/career/you-are-kind-of-your-job/
- 116. https://www.artofmanliness.com/character/manly-lessons/men-without-chests/
- 117. https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 118. https://strenuouslife.co/
- 119. https://strenuouslife.co/
- 120. https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 121. https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
- 122. https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
- 123. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 124. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 125. https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
- 126. https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
- 127. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 128. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 129. https://www.artofmanliness.com/podcast/
- 130. https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
- 131. https://www.artofmanliness.com/character/advice/sunday-firesides-first-day-worst-day/
- 132. https://www.artofmanliness.com/character/knowledge-of-men/rage-rage-against-the-dying-back-of-the-brain/
- 133. https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
- 134. https://www.artofmanliness.com/character/advice/
- 135. https://my.community.com/artofmanliness?t=manly
- 136. https://www.artofmanliness.com/contact/
- 137. https://www.artofmanliness.com/privacy-policy/
- 138. https://www.artofmanliness.com/about-2/
- 139. https://www.artofmanliness.com/all-topics/
- 140. https://www.artofmanliness.com/archives/
-
- Hidden links:
- 142. https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
- 143. https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
- 144. https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
- 145. https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
- 146. https://www.artofmanliness.com/style/did-commandos-go-commando/
- 147. https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
- 148. https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
- 149. https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
- 150. https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
- 151. https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
- 152. https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
- 153. https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
- 154. https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
- 155. https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
- 156. https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
- 157. https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
- 158. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 159. https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
- 160. https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
- 161. https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
- 162. https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
- 163. https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
- 164. https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
- 165. https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
- 166. https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
- 167. https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
- 168. https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
- 169. https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
- 170. https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
- 171. https://www.artofmanliness.com/people/family/riddles-for-kids/
- 172. https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
- 173. https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
- 174. https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
- 175. https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
- 176. https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
- 177. https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
- 178. https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
- 179. https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
- 180. https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
- 181. https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
- 182. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 183. https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
- 184. https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
- 185. https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
- 186. https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
- 187. https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
- 188. https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
- 189. https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
- 190. https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
- 191. https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
- 192. https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
- 193. https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
- 194. https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
- 195. https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
- 196. https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
- 197. https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
- 198. https://getpocket.com/edit?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 199. https://www.facebook.com/sharer.php?u=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 200. https://pinterest.com/pin/create/link/?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 201. https://twitter.com/intent/tweet?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
- 202. https://www.artofmanliness.com/cdn-cgi/l/email-protection#3f005d505b4602574b4b4f4c051010484848115e4d4b5059525e515356515a4c4c115c5052105c575e4d5e5c4b5a4d105e5b49565c5a104c4a515b5e461259564d5a4c565b5a4c124b50125b504c124b575a124d5a514b12485a124f5e461259504d1253564956515810
- 203. https://www.artofmanliness.com/character/advice/sunday-firesides-stop-living-life-paycheck-to-paycheck/
- 204. https://www.artofmanliness.com/character/advice/sunday-firesides-yours-sincerely/
- 205. https://www.artofmanliness.com/character/advice/sunday-firesides-love-endures/
- 206. https://www.artofmanliness.com/character/advice/sunday-firesides-die-red/
- 207. https://www.artofmanliness.com/character/advice/sunday-firesides-dependence-to-independence/
- 208. https://www.artofmanliness.com/people/relationships/sunday-firesides-relationships-over-willpower/
+[1] https://www.artofmanliness.com/
+[2] https://www.artofmanliness.com/podcast
+[5] https://www.artofmanliness.com/style/
+[6] https://www.artofmanliness.com/style/clothing/
+[7] https://www.artofmanliness.com/style/accessories/
+[8] https://www.artofmanliness.com/style/facial-hair/
+[9] https://www.artofmanliness.com/style/ties/
+[10] https://www.artofmanliness.com/health-fitness/
+[11] https://www.artofmanliness.com/health-fitness/fitness/
+[12] https://www.artofmanliness.com/health-fitness/health/
+[13] https://www.artofmanliness.com/health-fitness/program-review/
+[14] https://www.artofmanliness.com/people/
+[15] https://www.artofmanliness.com/people/family/
+[16] https://www.artofmanliness.com/people/fatherhood/
+[17] https://www.artofmanliness.com/people/relationships/
+[18] https://www.artofmanliness.com/people/social-skills/
+[19] https://www.artofmanliness.com/skills/
+[20] https://www.artofmanliness.com/skills/how-to/
+[21] https://www.artofmanliness.com/skills/manly-know-how/
+[22] https://www.artofmanliness.com/skills/outdoor-survival/
+[23] https://www.artofmanliness.com/podcast/
+[24] https://store.artofmanliness.com/collections/books/
+[25] https://www.instagram.com/artofmanliness/
+[26] https://feedly.com/i/subscription/feed/http%3A//feeds2.feedburner.com/TheArtOfManliness
+[27] https://www.facebook.com/artofmanliness/
+[28] https://twitter.com/artofmanliness
+[29] https://www.youtube.com/user/artofmanliness
+[32] https://www.artofmanliness.com/style/clothing/
+[33] https://www.artofmanliness.com/style/accessories/
+[34] https://www.artofmanliness.com/style/facial-hair/
+[35] https://www.artofmanliness.com/style/ties/
+[36] https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
+[37] https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
+[38] https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
+[39] https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
+[40] https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
+[41] https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
+[42] https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
+[43] https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
+[44] https://www.artofmanliness.com/style/did-commandos-go-commando/
+[45] https://www.artofmanliness.com/style/did-commandos-go-commando/
+[46] https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
+[47] https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
+[48] https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
+[49] https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
+[50] https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
+[51] https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
+[52] https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
+[53] https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
+[54] https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
+[55] https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
+[56] https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
+[57] https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
+[58] https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
+[59] https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
+[60] https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
+[61] https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
+[62] https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
+[63] https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
+[64] https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
+[65] https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
+[66] https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
+[67] https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
+[68] https://www.artofmanliness.com/style/
+[69] https://www.artofmanliness.com/health-fitness/fitness/
+[70] https://www.artofmanliness.com/health-fitness/health/
+[71] https://www.artofmanliness.com/health-fitness/program-review/
+[72] https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
+[73] https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
+[74] https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
+[75] https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
+[76] https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
+[77] https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
+[78] https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
+[79] https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
+[80] https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
+[81] https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
+[82] https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
+[83] https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
+[84] https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
+[85] https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
+[86] https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
+[87] https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
+[88] https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
+[89] https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
+[90] https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
+[91] https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
+[92] https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
+[93] https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
+[94] https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
+[95] https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
+[96] https://www.artofmanliness.com/health-fitness/
+[97] https://www.artofmanliness.com/people/family/
+[98] https://www.artofmanliness.com/people/fatherhood/
+[99] https://www.artofmanliness.com/people/relationships/
+[100] https://www.artofmanliness.com/people/social-skills/
+[101] https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
+[102] https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
+[103] https://www.artofmanliness.com/people/family/riddles-for-kids/
+[104] https://www.artofmanliness.com/people/family/riddles-for-kids/
+[105] https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
+[106] https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
+[107] https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
+[108] https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
+[109] https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
+[110] https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
+[111] https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
+[112] https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
+[113] https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
+[114] https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
+[115] https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
+[116] https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
+[117] https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
+[118] https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
+[119] https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
+[120] https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
+[121] https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
+[122] https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
+[123] https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
+[124] https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
+[125] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[126] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[127] https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
+[128] https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
+[129] https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
+[130] https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
+[131] https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
+[132] https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
+[133] https://www.artofmanliness.com/people/
+[134] https://www.artofmanliness.com/skills/how-to/
+[135] https://www.artofmanliness.com/skills/manly-know-how/
+[136] https://www.artofmanliness.com/skills/outdoor-survival/
+[137] https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
+[138] https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
+[139] https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
+[140] https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
+[141] https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
+[142] https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
+[143] https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
+[144] https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
+[145] https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
+[146] https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
+[147] https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
+[148] https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
+[149] https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
+[150] https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
+[151] https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
+[152] https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
+[153] https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
+[154] https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
+[155] https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
+[156] https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
+[157] https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
+[158] https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
+[159] https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
+[160] https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
+[161] https://www.artofmanliness.com/skills/
+[167] https://www.artofmanliness.com/character/advice/
+[168] https://www.artofmanliness.com/character/
+[169] https://www.artofmanliness.com/sunday-firesides/
+[170] https://getpocket.com/edit?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
+[171] https://www.facebook.com/sharer.php?u=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
+[172] https://pinterest.com/pin/create/link/?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
+[173] https://twitter.com/intent/tweet?url=https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/
+[174] https://www.artofmanliness.com/cdn-cgi/l/email-protection#27184548435e1a4f535357541d08085050500946555348414a46494b4e494254540944484a08444f46554644534255084643514e44420854524943465e0a414e5542544e4342540a53480a4348540a534f420a554249530a50420a57465e0a4148550a4b4e514e494008
+[175] https://www.artofmanliness.com/character/advice/sunday-firesides-stop-living-life-paycheck-to-paycheck/
+[176] https://www.artofmanliness.com/character/advice/sunday-firesides-stop-living-life-paycheck-to-paycheck/
+[177] https://www.artofmanliness.com/character/advice/sunday-firesides-yours-sincerely/
+[178] https://www.artofmanliness.com/character/advice/sunday-firesides-yours-sincerely/
+[179] https://www.artofmanliness.com/character/advice/sunday-firesides-love-endures/
+[180] https://www.artofmanliness.com/character/advice/sunday-firesides-love-endures/
+[181] https://www.artofmanliness.com/character/advice/sunday-firesides-die-red/
+[182] https://www.artofmanliness.com/character/advice/sunday-firesides-die-red/
+[183] https://www.artofmanliness.com/character/advice/sunday-firesides-dependence-to-independence/
+[184] https://www.artofmanliness.com/character/advice/sunday-firesides-dependence-to-independence/
+[185] https://www.artofmanliness.com/people/relationships/sunday-firesides-relationships-over-willpower/
+[186] https://www.artofmanliness.com/people/relationships/sunday-firesides-relationships-over-willpower/
+[187] https://www.artofmanliness.com/career-wealth/career/you-are-kind-of-your-job/
+[188] https://www.artofmanliness.com/character/manly-lessons/men-without-chests/
+[193] https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/#
+[197] https://strenuouslife.co/
+[198] https://strenuouslife.co/
+[203] https://www.artofmanliness.com/character/advice/sunday-firesides-to-dos-the-rent-we-pay-for-living/#
+[207] https://www.artofmanliness.com/living/leisure/podcast-959-come-alive-again-by-having-more-fun/
+[208] https://www.artofmanliness.com/living/leisure/podcast-959-come-alive-again-by-having-more-fun/
+[209] https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
+[210] https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
+[211] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[212] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[213] https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
+[214] https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
+[215] https://www.artofmanliness.com/podcast/
+[216] https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
+[217] https://www.artofmanliness.com/character/advice/sunday-firesides-first-day-worst-day/
+[218] https://www.artofmanliness.com/character/knowledge-of-men/rage-rage-against-the-dying-back-of-the-brain/
+[219] https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
+[220] https://www.artofmanliness.com/character/advice/
+[221] https://my.community.com/artofmanliness?t=manly
+[222] https://www.artofmanliness.com/contact/
+[223] https://www.artofmanliness.com/privacy-policy/
+[224] https://www.artofmanliness.com/about-2/
+[225] https://www.artofmanliness.com/all-topics/
+[226] https://www.artofmanliness.com/archives/
diff --git a/static/archive/www-artofmanliness-com-rx8ary.txt b/static/archive/www-artofmanliness-com-rx8ary.txt
index 735869c..b79aef8 100644
--- a/static/archive/www-artofmanliness-com-rx8ary.txt
+++ b/static/archive/www-artofmanliness-com-rx8ary.txt
@@ -1,880 +1,784 @@
- #[1]alternate [2]alternate [3]alternate
-
- IFRAME: [4]https://www.googletagmanager.com/ns.html?id=GTM-KXJGHMC
-
- Menu [5]logo [6]podcast ____________________
- Submit
-
- * [7]Get Style
- + [8]Clothing
- + [9]Accessories
- + [10]Facial Hair
- + [11]Ties
- * [12]Get Strong
- + [13]Fitness
- + [14]Health
- + [15]Program Review
- * [16]Get Social
- + [17]Family
- + [18]Fatherhood
- + [19]Relationships
- + [20]Social Skills
- * [21]Get Skilled
- + [22]How To
- + [23]Manly Know-How
- + [24]Outdoor/Survival
- * [25]Podcast
- * [26]Books
- * Find more of the Art of Manliness:
- instagram icon [27]Instagram
- feedly icon [28]Feedly
- facebook icon [29]Facebook
- twitter icon [30]Twitter
- youtube icon [31]YouTube
- * ____________________ cross Submit
- Search
-
- * [32]Clothing
- * [33]Accessories
- * [34]Facial Hair
- * [35]Ties
-
- [36]3 Ways to Wear a Henley Shirt
-
- [37]A Man’s Guide to the Oxford Shirt
-
- [38]Skill of the Week: Instantly Recognize a Quality Suit
-
- [39]How to Get the Stink Out of Synthetic Workout Shirts
-
- [40]Did Commandos Go Commando?
-
- [41]A Man’s Guide to Fragrance: How to Choose and Wear Cologne
-
- [42]My Go-To Sunglasses for Summer
-
- [43]How to Pick the Perfect Men’s Wedding Ring
-
- [44]Your No-Nonsense Guide to Choosing the Right Beard Style
-
- [45]How to Grow a Beard: The One and True Guide
-
- [46]Beard Oil FAQs: Answering All Your Pressing Beardly Questions
-
- [47]Beard Grooming 101: The Lowdown on Products and Routine
-
- [48]Skill of the Week: Tie a Scarf 5 Different Ways
-
- [49]How to Tie a Tie
-
- [50]Skill of the Week: Tie the Half-Windsor Necktie Knot
-
- [51]How to Match a Shirt and Tie
-
- [52]Browse all Get Style
- * [53]Fitness
- * [54]Health
- * [55]Program Review
-
- [56]Podcast #955: The Power of NEAT — Move a Little to Lose a Lot
-
- [57]Podcast #767: Fat Loss Made Simple
-
- [58]Legendary Bodybuilder Mike Mentzer’s Heavy Duty Method for Maximum
- Muscle Growth
-
- [59]Podcast #939: What Lifting Ancient Stones Can Teach You About Being
- a Man
-
- [60]What You Can Learn About Shedding Pounds From the Vacation Weight
- Loss Paradox
-
- [61]You Need to Eat More Fiber
-
- [62]Silencing the Ring: Proven Strategies for Tinnitus Relief
-
- [63]Podcast #947: Turn Your Anxiety Into a Strength
-
- [64]The Insanely Difficult Standards of History’s Hardest P.E. Program
-
- [65]Which Fitness Program Is Right for You?
-
- [66]A Review of the MovNat Workshop
-
- [67]Strengthen Your Tribe: A Report on the Atomic Athlete Vanguard
-
- [68]Browse all Get Strong
- * [69]Family
- * [70]Fatherhood
- * [71]Relationships
- * [72]Social Skills
-
- [73]Podcast #946: Counterintuitive Ideas About Marriage, Family, and
- Kids
-
- [74]The Best Riddles for Kids (With Answers!)
-
- [75]Podcast #858: The Affectionate, Ambiguous, and Surprisingly
- Ambivalent Relationship Between Siblings
-
- [76]How to Fight Entitlement and Develop Gratitude in Your Kids
-
- [77]How to Parent-Teacher Conference
-
- [78]5 Ways Fathers Hugely Influence Their Daughters
-
- [79]Sunday Firesides: We Shouldn’t (and Should) Be Friends With Our
- Kids
-
- [80]What to Do When Your Kid Lies to You
-
- [81]Sunday Firesides: Can We Finally Stop Blaming the Puritans?
-
- [82]Sunday Firesides: The Sit-in-Silence Relationship Test
-
- [83]Sunday Firesides: Treat People as Ends, Not Means
-
- [84]Podcast #919: Advice on Making Love Last . . . From a Divorce
- Lawyer
-
- [85]Podcast #957: How Curiosity Conversations Can Supercharge Your
- Success
-
- [86]Podcast #837: The Cues That Make You Charismatic
-
- [87]Podcast #938: Social Skills as the Road to Character
-
- [88]Podcast #915: Finally Learn to Say No
-
- [89]Browse all Get Social
- * [90]How To
- * [91]Manly Know-How
- * [92]Outdoor/Survival
-
- [93]Skill of the Week: Wrap a Gift
-
- [94]How to De-Ice Your Windshield Easily and Effectively
-
- [95]Skill of the Week: Paint a Room
-
- [96]Skill of the Week: Store and Stack Firewood
-
- [97]Skill of the Week: Build a Cozy Fireplace Fire (That Won’t Make
- Your House Smoky)
-
- [98]How to Adjust Your Car Mirrors to Eliminate Blind Spots
-
- [99]Skill of the Week: Throw a Perfect Football Spiral
-
- [100]What’s the Difference Between Gas Octanes?
-
- [101]Skill of the Week: How to Build a Quinzee Snow Shelter
-
- [102]Skill of the Week: Survive an Earthquake
-
- [103]Two Things You Should Be Doing to Take Better Care of Your Camping
- Gear
-
- [104]Skill of the Week: How to Emergency Rappel
-
- [105]Browse all Get Skilled
-
- in: [106]Behavior, [107]Character
-
- Brett & Kate McKay • September 5, 2023 • Last updated: September 9,
- 2023
-
- Exit, Voice, Loyalty, Neglect: Why People Leave, Stay, or Try to Burn It All
- Down
-
- When someone is dissatisfied with a product, group, or relationship,
- how do they remedy that dissatisfaction?
-
- A German economist and political scientist, Albert Hirschman, laid out
- a theory of how people respond to dissatisfaction in his influential
- treatise [108]Exit, Voice, Loyalty: Responses to Decline in Firms,
- Organizations, and States.
-
- Hirschman observed that people who find themselves in diminishing,
- less-than-ideal circumstances have three options: 1) leave the
- declining group, company, or relationship (exit), 2) express discontent
- to improve the situation (voice), or 3) stay in the organization and
- passively hope things get better (loyalty).
-
- Since the initial publication of Exit, Voice, Loyalty in 1970, other
- social scientists have added a fourth option to Hirschman’s framework:
- neglect.
-
- Which option a person exercises will depend on many factors, and the
- path they choose can help reverse, stem, or exacerbate a group’s
- deterioration.
-
- The exit, voice, loyalty, neglect (EVLN) framework will help you
- understand why people stay in or leave a relationship (including
- friendships), why people stay in or leave a job, why people stay in or
- leave a church, and many more of life’s interpersonal and institutional
- dynamics.
-
- Let’s unpack it.
+Menu [1] logo [2]podcast
+[3][ ]
+[4][Submit]
+ • [5] Get Style
+ □ [6]Clothing
+ □ [7]Accessories
+ □ [8]Facial Hair
+ □ [9]Ties
+ • [10] Get Strong
+ □ [11]Fitness
+ □ [12]Health
+ □ [13]Program Review
+ • [14] Get Social
+ □ [15]Family
+ □ [16]Fatherhood
+ □ [17]Relationships
+ □ [18]Social Skills
+ • [19] Get Skilled
+ □ [20]How To
+ □ [21]Manly Know-How
+ □ [22]Outdoor/Survival
+ • [23]Podcast
+ • [24]Books
+ • Find more of the Art of Manliness:
+
+ instagram icon [25]Instagram
+ feedly icon [26]Feedly
+ facebook icon [27]Facebook
+ twitter icon [28]Twitter
+ youtube icon [29]YouTube
+ • [30][ ] cross [31][SUBMIT]
+ Search
+
+ • [32] Clothing
+ • [33] Accessories
+ • [34] Facial Hair
+ • [35] Ties
+
+[36] [lazy] [37]3 Ways to Wear a Henley Shirt [38] [lazy] [39]A Man’s Guide to
+the Oxford Shirt [40] [lazy] [41]Skill of the Week: Instantly Recognize a
+Quality Suit [42] [lazy] [43]How to Get the Stink Out of Synthetic Workout
+Shirts
+[44] [lazy] [45]Did Commandos Go Commando? [46] [lazy] [47]A Man’s Guide to
+Fragrance: How to Choose and Wear Cologne [48] [lazy] [49]My Go-To Sunglasses
+for Summer [50] [lazy] [51]How to Pick the Perfect Men’s Wedding Ring
+[52] [lazy] [53]Your No-Nonsense Guide to Choosing the Right Beard Style [54]
+[lazy] [55]How to Grow a Beard: The One and True Guide [56] [lazy] [57]Beard
+Oil FAQs: Answering All Your Pressing Beardly Questions [58] [lazy] [59]Beard
+Grooming 101: The Lowdown on Products and Routine
+[60] [lazy] [61]Skill of the Week: Tie a Scarf 5 Different Ways [62] * [63]How
+to Tie a Tie [64] [lazy] [65]Skill of the Week: Tie the Half-Windsor Necktie
+Knot [66] [lazy] [67]How to Match a Shirt and Tie
+
+[68]Browse all Get Style
+
+ • [69] Fitness
+ • [70] Health
+ • [71] Program Review
+
+[72] [lazy] [73]Podcast #955: The Power of NEAT — Move a Little to Lose a Lot
+[74] [lazy] [75]Podcast #767: Fat Loss Made Simple [76] [lazy] [77]Legendary
+Bodybuilder Mike Mentzer’s Heavy Duty Method for Maximum Muscle Growth [78]
+[lazy] [79]Podcast #939: What Lifting Ancient Stones Can Teach You About Being
+a Man
+[80] [lazy] [81]What You Can Learn About Shedding Pounds From the Vacation
+Weight Loss Paradox [82] [lazy] [83]You Need to Eat More Fiber [84] [lazy] [85]
+Silencing the Ring: Proven Strategies for Tinnitus Relief [86] [lazy] [87]
+Podcast #947: Turn Your Anxiety Into a Strength
+[88] [lazy] [89]The Insanely Difficult Standards of History’s Hardest P.E.
+Program [90] [lazy] [91]Which Fitness Program Is Right for You? [92] [lazy]
+[93]A Review of the MovNat Workshop [94] [lazy] [95]Strengthen Your Tribe: A
+Report on the Atomic Athlete Vanguard
+
+[96]Browse all Get Strong
+
+ • [97] Family
+ • [98] Fatherhood
+ • [99] Relationships
+ • [100] Social Skills
+
+[101] [lazy] [102]Podcast #946: Counterintuitive Ideas About Marriage, Family,
+and Kids [103] [lazy] [104]The Best Riddles for Kids (With Answers!) [105]
+[lazy] [106]Podcast #858: The Affectionate, Ambiguous, and Surprisingly
+Ambivalent Relationship Between Siblings [107] [lazy] [108]How to Fight
+Entitlement and Develop Gratitude in Your Kids
+[109] [lazy] [110]How to Parent-Teacher Conference [111] [lazy] [112]5 Ways
+Fathers Hugely Influence Their Daughters [113] [lazy] [114]Sunday Firesides: We
+Shouldn’t (and Should) Be Friends With Our Kids [115] [lazy] [116]What to Do
+When Your Kid Lies to You
+[117] [lazy] [118]Sunday Firesides: Can We Finally Stop Blaming the Puritans?
+[119] [lazy] [120]Sunday Firesides: The Sit-in-Silence Relationship Test [121]
+[lazy] [122]Sunday Firesides: Treat People as Ends, Not Means [123] [lazy]
+[124]Podcast #919: Advice on Making Love Last . . . From a Divorce Lawyer
+[125] [lazy] [126]Podcast #957: How Curiosity Conversations Can Supercharge
+Your Success [127] [lazy] [128]Podcast #837: The Cues That Make You Charismatic
+[129] [lazy] [130]Podcast #938: Social Skills as the Road to Character [131]
+[lazy] [132]Podcast #915: Finally Learn to Say No
+
+[133]Browse all Get Social
+
+ • [134] How To
+ • [135] Manly Know-How
+ • [136] Outdoor/Survival
+
+[137] [lazy] [138]Skill of the Week: Wrap a Gift [139] [lazy] [140]How to
+De-Ice Your Windshield Easily and Effectively [141] [lazy] [142]Skill of the
+Week: Paint a Room [143] [lazy] [144]Skill of the Week: Store and Stack
+Firewood
+[145] [lazy] [146]Skill of the Week: Build a Cozy Fireplace Fire (That Won’t
+Make Your House Smoky) [147] [lazy] [148]How to Adjust Your Car Mirrors to
+Eliminate Blind Spots [149] [lazy] [150]Skill of the Week: Throw a Perfect
+Football Spiral [151] [lazy] [152]What’s the Difference Between Gas Octanes?
+[153] [lazy] [154]Skill of the Week: How to Build a Quinzee Snow Shelter [155]
+[lazy] [156]Skill of the Week: Survive an Earthquake [157] [lazy] [158]Two
+Things You Should Be Doing to Take Better Care of Your Camping Gear [159]
+[lazy] [160]Skill of the Week: How to Emergency Rappel
+
+[161]Browse all Get Skilled
+
+in: [167]Behavior, [168]Character
+
+Brett & Kate McKay • September 5, 2023 • Last updated: September 9, 2023
+
+Exit, Voice, Loyalty, Neglect: Why People Leave, Stay, or Try to Burn It All
+Down
+
+[evln]
+
+[169] [170] [171] [172] [173]
+
+When someone is dissatisfied with a product, group, or relationship, how do
+they remedy that dissatisfaction?
+
+A German economist and political scientist, Albert Hirschman, laid out a theory
+of how people respond to dissatisfaction in his influential treatise [174]Exit,
+Voice, Loyalty: Responses to Decline in Firms, Organizations, and States.
+
+Hirschman observed that people who find themselves in diminishing,
+less-than-ideal circumstances have three options: 1) leave the declining group,
+company, or relationship (exit), 2) express discontent to improve the situation
+(voice), or 3) stay in the organization and passively hope things get better
+(loyalty).
+
+Since the initial publication of Exit, Voice, Loyalty in 1970, other social
+scientists have added a fourth option to Hirschman’s framework: neglect.
+
+Which option a person exercises will depend on many factors, and the path they
+choose can help reverse, stem, or exacerbate a group’s deterioration.
+
+The exit, voice, loyalty, neglect (EVLN) framework will help you understand why
+people stay in or leave a relationship (including friendships), why people stay
+in or leave a job, why people stay in or leave a church, and many more of
+life’s interpersonal and institutional dynamics.
+
+Let’s unpack it.
Exit, Voice, Loyalty, Neglect
- I read Hirschman’s book a few months ago and went on a deep dive into
- related research that’s been done since it was published. The EVLN
- framework has become a fundamental mental model in my brain. It’s a
- decidedly simple paradigm and is something people already intuitively
- know, but once you see it spelled out explicitly, you start to see it
- everywhere.
+I read Hirschman’s book a few months ago and went on a deep dive into related
+research that’s been done since it was published. The EVLN framework has become
+a fundamental mental model in my brain. It’s a decidedly simple paradigm and is
+something people already intuitively know, but once you see it spelled out
+explicitly, you start to see it everywhere.
Exit
- The exit option is exercised when an individual is dissatisfied with
- something and decides to quit it altogether.
+The exit option is exercised when an individual is dissatisfied with something
+and decides to quit it altogether.
- You use the exit option all the time as a consumer. If you’re
- dissatisfied with shaving cream brand A, you stop using it and start
- using shaving cream brand B.
+You use the exit option all the time as a consumer. If you’re dissatisfied with
+shaving cream brand A, you stop using it and start using shaving cream brand
+B.
- You can also use the exit option when dissatisfied with a job,
- relationship, or group.
+You can also use the exit option when dissatisfied with a job, relationship, or
+group.
- Not happy with your job? You can quit it.
+Not happy with your job? You can quit it.
- Not happy with your relationship? You can break up.
+Not happy with your relationship? You can break up.
- Not happy with the state of your congregation? You can stop going to
- that church and start going to another.
+Not happy with the state of your congregation? You can stop going to that
+church and start going to another.
- What’s interesting about the exit option is that it often accelerates
- decline in groups. According to Hirschman, the people most sensitive to
- a decrease in quality are typically those with the most resources,
- skills, and talents that could be used to effectuate improvement. The
- people who are the least sensitive to quality usually have fewer
- resources, skills, and talents. When the people who have resources
- leave, it results in a “brain drain.” With fewer well-resourced
- members, the quality of the group further declines; it thus has even
- more trouble attracting new members (especially well-resourced ones);
- as a result, even more people leave. Things go from bad to worse, and
- the group or organization enters a death spiral that can be difficult
- or impossible to recover from.
+What’s interesting about the exit option is that it often accelerates decline
+in groups. According to Hirschman, the people most sensitive to a decrease in
+quality are typically those with the most resources, skills, and talents that
+could be used to effectuate improvement. The people who are the least sensitive
+to quality usually have fewer resources, skills, and talents. When the people
+who have resources leave, it results in a “brain drain.” With fewer
+well-resourced members, the quality of the group further declines; it thus has
+even more trouble attracting new members (especially well-resourced ones); as a
+result, even more people leave. Things go from bad to worse, and the group or
+organization enters a death spiral that can be difficult or impossible to
+recover from.
- To illustrate this phenomenon, Hirschman uses the example of parents
- pulling their kids out of public schools and putting them into private
- schools. According to Hirschman, affluent parents are much more
- sensitive to education quality than less affluent parents. It’s not
- that less affluent parents don’t care about their children’s education;
- they just don’t have the luxury of being hyper-sensitive to deficits in
- quality. Because they know that private school isn’t an option for
- them, they don’t spend as much time wondering if the grass is greener
- at another school as affluent parents do.
+To illustrate this phenomenon, Hirschman uses the example of parents pulling
+their kids out of public schools and putting them into private schools.
+According to Hirschman, affluent parents are much more sensitive to education
+quality than less affluent parents. It’s not that less affluent parents don’t
+care about their children’s education; they just don’t have the luxury of being
+hyper-sensitive to deficits in quality. Because they know that private school
+isn’t an option for them, they don’t spend as much time wondering if the grass
+is greener at another school as affluent parents do.
- Because school is a matter of optionality for wealthy parents, they
- notice perceived flaws in their children’s education more acutely. If
- these parents become dissatisfied with the education being offered in a
- public school, they’ll switch their child over to a private school.
- When these affluent families leave a public school, they take their
- resources, and their possibly greater propensity to push for
- improvement, with them. As a result, the struggles of the public school
- deepen.
+Because school is a matter of optionality for wealthy parents, they notice
+perceived flaws in their children’s education more acutely. If these parents
+become dissatisfied with the education being offered in a public school,
+they’ll switch their child over to a private school. When these affluent
+families leave a public school, they take their resources, and their possibly
+greater propensity to push for improvement, with them. As a result, the
+struggles of the public school deepen.
Voice
- Sometimes people find themselves in a situation where they’re
- dissatisfied with a group or relationship, but they don’t want to leave
- it. They still see good in it. It’s still working for them on some
- level, or they see potential for how it could work if things were done
- differently. They may feel they can do more good being an agent on the
- inside than being a critic on the outside.
+Sometimes people find themselves in a situation where they’re dissatisfied with
+a group or relationship, but they don’t want to leave it. They still see good
+in it. It’s still working for them on some level, or they see potential for how
+it could work if things were done differently. They may feel they can do more
+good being an agent on the inside than being a critic on the outside.
- In these cases, people may decide to stay around and exercise the voice
- option — complaining, offering feedback, and agitating for change to
- improve things.
+In these cases, people may decide to stay around and exercise the voice option
+— complaining, offering feedback, and agitating for change to improve things.
- An unhappy employee can talk to his boss about changing the company’s
- culture.
+An unhappy employee can talk to his boss about changing the company’s culture.
- An unhappy husband can tell his wife about his concerns for the
- relationship, or together they can talk to a therapist.
+An unhappy husband can tell his wife about his concerns for the relationship,
+or together they can talk to a therapist.
- An unhappy customer can contact customer support to raise concerns and
- seek redress.
+An unhappy customer can contact customer support to raise concerns and seek
+redress.
- Unhappy parents can talk to their child’s teacher about an issue with
- their kid or join the PTA to advocate for broader changes.
+Unhappy parents can talk to their child’s teacher about an issue with their kid
+or join the PTA to advocate for broader changes.
Loyalty
- While Hirschman clearly defined exit and voice, he was ambiguous about
- loyalty. It’s one of the biggest criticisms he received for his work.
- Many social scientists since Hirschman have described loyalty as a
- “passively positive” response in the face of dissatisfaction. Instead
- of taking action (exit or voice), the loyal customer, employee, spouse,
- or church member will stay aboard and not raise a stink, hoping things
- will get better on their own if they wait long enough.
+While Hirschman clearly defined exit and voice, he was ambiguous about loyalty.
+It’s one of the biggest criticisms he received for his work. Many social
+scientists since Hirschman have described loyalty as a “passively positive”
+response in the face of dissatisfaction. Instead of taking action (exit or
+voice), the loyal customer, employee, spouse, or church member will stay aboard
+and not raise a stink, hoping things will get better on their own if they wait
+long enough.
- Take an employee dissatisfied with his job. Maybe he’s decided he can’t
- quit, and perhaps he’s also decided that voicing his concerns to his
- boss will only increase the animosity between them. So he chooses to
- stay with the company, thinking, “Well, maybe things will improve.
- Maybe we’ll get a new supervisor. Maybe I’ll get moved to a new
- division. I’ll just keep working and wait and see.”
+Take an employee dissatisfied with his job. Maybe he’s decided he can’t quit,
+and perhaps he’s also decided that voicing his concerns to his boss will only
+increase the animosity between them. So he chooses to stay with the company,
+thinking, “Well, maybe things will improve. Maybe we’ll get a new supervisor.
+Maybe I’ll get moved to a new division. I’ll just keep working and wait and
+see.”
Neglect
- Social scientist [109]Carly Rusbult added a fourth option to
- Hirschman’s exit/voice/loyalty options for dealing with
- dissatisfaction: neglect.
+Social scientist [175]Carly Rusbult added a fourth option to Hirschman’s exit/
+voice/loyalty options for dealing with dissatisfaction: neglect.
- Neglect is similar to loyalty in that the dissatisfied person decides
- to stay on board with the declining job, relationship, or group, but
- instead of thinking things might improve if they’re patient, the person
- who adopts the neglect option has decided things won’t get better and
- chooses to take a “negative passive” approach to the situation by
- putting in less effort or not taking action to prevent the relationship
- or group from further falling apart.
+Neglect is similar to loyalty in that the dissatisfied person decides to stay
+on board with the declining job, relationship, or group, but instead of
+thinking things might improve if they’re patient, the person who adopts the
+neglect option has decided things won’t get better and chooses to take a
+“negative passive” approach to the situation by putting in less effort or not
+taking action to prevent the relationship or group from further falling apart.
- Rather than helping an ineffectual organization continue to limp feebly
- along, this individual stays but withdraws their support, with the idea
- that by letting the group collapse, its leadership will finally be
- forced to take action to change and improve it. The neglect approach
- is: “I’m not going to actively put out fires. I’m just going to let
- this thing burn to the ground so we can start fresh.”
+Rather than helping an ineffectual organization continue to limp feebly along,
+this individual stays but withdraws their support, with the idea that by
+letting the group collapse, its leadership will finally be forced to take
+action to change and improve it. The neglect approach is: “I’m not going to
+actively put out fires. I’m just going to let this thing burn to the ground so
+we can start fresh.”
- Consider the overworked church member in a struggling congregation.
- He’s juggling multiple roles and dealing with a cadre of difficult
- people. Leaving isn’t an option because his wife grew up in that church
- and would never consider it. He knows raising his concerns to
- leadership would be ineffective because he tried that in the past. So
- exit and voice are off the table.
+Consider the overworked church member in a struggling congregation. He’s
+juggling multiple roles and dealing with a cadre of difficult people. Leaving
+isn’t an option because his wife grew up in that church and would never
+consider it. He knows raising his concerns to leadership would be ineffective
+because he tried that in the past. So exit and voice are off the table.
- He also doesn’t think things will get better if he sticks around and
- just keeps plugging away. Goodbye loyalty.
+He also doesn’t think things will get better if he sticks around and just keeps
+plugging away. Goodbye loyalty.
- Hello, neglect.
+Hello, neglect.
- This burned-out church member may start doing the bare minimum in his
- responsibilities, if that. He’ll say no to requests for his time,
- money, and talent. If he sees an issue or problem, he won’t do anything
- to correct it. He thinks that those who remain loyal are only
- perpetuating a state of dysfunction. By withholding his help, he hopes
- to push the congregation to a critical level of failure, which will
- require the leadership to fix the underlying issues.
+This burned-out church member may start doing the bare minimum in his
+responsibilities, if that. He’ll say no to requests for his time, money, and
+talent. If he sees an issue or problem, he won’t do anything to correct it. He
+thinks that those who remain loyal are only perpetuating a state of
+dysfunction. By withholding his help, he hopes to push the congregation to a
+critical level of failure, which will require the leadership to fix the
+underlying issues.
Predictors of Response to Dissatisfaction
- So, in the face of dissatisfaction, people can respond with exit,
- voice, loyalty, or neglect.
+So, in the face of dissatisfaction, people can respond with exit, voice,
+loyalty, or neglect.
- A person in declining circumstances conducts an explicit or implicit
- cost/benefit analysis in figuring out which path to take.
+A person in declining circumstances conducts an explicit or implicit cost/
+benefit analysis in figuring out which path to take.
- In [110]Predicting Exit, Voice, Loyalty, and Neglect, researchers
- Michael Withey and William Cooper fleshed out the factors that go into
- this analysis when people consider how to respond to dissatisfaction:
+In [176]Predicting Exit, Voice, Loyalty, and Neglect, researchers Michael
+Withey and William Cooper fleshed out the factors that go into this analysis
+when people consider how to respond to dissatisfaction:
Cost of the Action
- Exit, voice, loyalty, and neglect all come with costs, both direct and
- indirect.
+Exit, voice, loyalty, and neglect all come with costs, both direct and
+indirect.
- Exiting a job can result in the loss of income and health benefits;
- divorcing a spouse can result in emotional and financial distress;
- leaving a church can result in spiritual and social isolation.
+Exiting a job can result in the loss of income and health benefits; divorcing a
+spouse can result in emotional and financial distress; leaving a church can
+result in spiritual and social isolation.
- Raising your voice at work could create rancor with your boss; speaking
- up in a marriage could create resentment with your spouse.
+Raising your voice at work could create rancor with your boss; speaking up in a
+marriage could create resentment with your spouse.
- Whether you’re exiting or using your voice, there can also be a loss in
- the thing humans hold most dear: status. In leaving or dissenting, you
- risk jeopardizing your identity.
+Whether you’re exiting or using your voice, there can also be a loss in the
+thing humans hold most dear: status. In leaving or dissenting, you risk
+jeopardizing your identity.
- Staying loyal to a relationship or organization comes with costs, too.
- If you keep your job in a toxic office, you’ll have to continue to
- weather the stress and debasement that comes with going to work each
- day. Same thing with staying in a struggling, conflict-ridden marriage
- or church.
+Staying loyal to a relationship or organization comes with costs, too. If you
+keep your job in a toxic office, you’ll have to continue to weather the stress
+and debasement that comes with going to work each day. Same thing with staying
+in a struggling, conflict-ridden marriage or church.
- If you decide to be neglectful in your job, it could result in
- discipline or blocked opportunities. Neglect in a marriage will only
- lead to increased resentment and tension.
+If you decide to be neglectful in your job, it could result in discipline or
+blocked opportunities. Neglect in a marriage will only lead to increased
+resentment and tension.
- The exit option tends to have the most dramatic consequences, and is
- thus much more reluctantly exercised and typically used as a last
- resort.
+The exit option tends to have the most dramatic consequences, and is thus much
+more reluctantly exercised and typically used as a last resort.
- But there’s no option in the EVLN framework that doesn’t carry
- downsides; each has its own pros and cons, and part of how people weigh
- their choices comes down to which path they think has more of the
- former and less of the latter.
+But there’s no option in the EVLN framework that doesn’t carry downsides; each
+has its own pros and cons, and part of how people weigh their choices comes
+down to which path they think has more of the former and less of the latter.
Efficacy of the Response
- In deciding between exit, voice, loyalty, and neglect, people will also
- consider which response will be the most effective at resolving their
- dissatisfaction.
+In deciding between exit, voice, loyalty, and neglect, people will also
+consider which response will be the most effective at resolving their
+dissatisfaction.
- A big factor in whether someone thinks a particular response will be
- effective is whether they believe there’s hope for improvement. If
- someone has this hope, they’re more likely to choose voice or loyalty;
- if they don’t, they’re more likely to choose exit or neglect. If an
- unhappy employee thinks things would be a lot better at work if their
- supervisor moved on, and there’s a rumor they’ll soon be replaced, the
- employee is more likely to stick around. If a church member thinks
- their concerns will be listened to and addressed, they’re more likely
- to stay and raise their voice; if they think their concerns will be
- dismissed, they’re more likely to leave.
+A big factor in whether someone thinks a particular response will be effective
+is whether they believe there’s hope for improvement. If someone has this hope,
+they’re more likely to choose voice or loyalty; if they don’t, they’re more
+likely to choose exit or neglect. If an unhappy employee thinks things would be
+a lot better at work if their supervisor moved on, and there’s a rumor they’ll
+soon be replaced, the employee is more likely to stick around. If a church
+member thinks their concerns will be listened to and addressed, they’re more
+likely to stay and raise their voice; if they think their concerns will be
+dismissed, they’re more likely to leave.
- A significant element in whether someone has hope for a better future
- is their prior satisfaction with the group or relationship. If
- someone’s marriage is struggling now, but was great for the first
- decade, they’re more apt to keep working on it and believe there’s a
- chance of returning to those happier times. If someone’s marriage was
- rocky from the start, they’re more likely to choose divorce.
+A significant element in whether someone has hope for a better future is their
+prior satisfaction with the group or relationship. If someone’s marriage is
+struggling now, but was great for the first decade, they’re more apt to keep
+working on it and believe there’s a chance of returning to those happier times.
+If someone’s marriage was rocky from the start, they’re more likely to choose
+divorce.
Internal vs. External Locus of Control
- If an individual has an internal locus of control, they’re more likely
- to choose a response that’s proactive. That is, if they believe they
- have control over their actions and outcomes, they’re more likely to
- use voice or exit.
+If an individual has an internal locus of control, they’re more likely to
+choose a response that’s proactive. That is, if they believe they have control
+over their actions and outcomes, they’re more likely to use voice or exit.
- Someone who has an external locus of control — a belief that their life
- is controlled by external circumstances — is more likely to passively
- endure a bad situation (loyalty or neglect).
+Someone who has an external locus of control — a belief that their life is
+controlled by external circumstances — is more likely to passively endure a bad
+situation (loyalty or neglect).
Attractiveness of Alternatives
- If someone feels like there are better options outside their current
- job/relationship/church, they’re more likely to leave.
+If someone feels like there are better options outside their current job/
+relationship/church, they’re more likely to leave.
- If someone’s in a job they dislike and has been fielding hiring
- interest from another employer, they’re more likely to quit.
+If someone’s in a job they dislike and has been fielding hiring interest from
+another employer, they’re more likely to quit.
- If, on the other hand, someone feels they won’t be able to do much
- better in an alternate situation, they’re more likely to exercise the
- options of voice, loyalty, and neglect.
+If, on the other hand, someone feels they won’t be able to do much better in an
+alternate situation, they’re more likely to exercise the options of voice,
+loyalty, and neglect.
- An individual who’s sixty and in a so-so marriage may not feel bullish
- about their prospects of finding another partner and decide they’d
- rather be with someone, anyone, than alone.
+An individual who’s sixty and in a so-so marriage may not feel bullish about
+their prospects of finding another partner and decide they’d rather be with
+someone, anyone, than alone.
Commitment
- The decision to go, stay, or otherwise is also rooted in one’s inner
- values.
+The decision to go, stay, or otherwise is also rooted in one’s inner values.
- Someone in an unhappy marriage who’s deeply committed to the sanctity
- of the marriage vow is more likely to choose therapy over divorce.
+Someone in an unhappy marriage who’s deeply committed to the sanctity of the
+marriage vow is more likely to choose therapy over divorce.
- Someone who is disturbed by recent trends in their church but deeply
- believes in the tenets of their faith is more likely to stay than
- exit.
+Someone who is disturbed by recent trends in their church but deeply believes
+in the tenets of their faith is more likely to stay than exit.
- Someone who prizes loyalty will stay longer in a job they dislike than
- someone who doesn’t.
+Someone who prizes loyalty will stay longer in a job they dislike than someone
+who doesn’t.
Will Someone Choose Exit, Voice, Loyalty, or Neglect?
- In a series of studies, Withey and Cooper used the above factors to
- create a rubric that helps predict which response a dissatisfied
- employee will use. It likely carries over to people dissatisfied with
- other situations as well:
+In a series of studies, Withey and Cooper used the above factors to create a
+rubric that helps predict which response a dissatisfied employee will use. It
+likely carries over to people dissatisfied with other situations as well:
- Exit More Likely When:
- * costs of exit are low
- * costs of voice are high
- * prior satisfaction is low
- * belief in improvement is low
- * commitment is low
- * attractive alternatives are available
- * individual has an internal locus of control
+Exit More Likely When:
- Voice More Likely When:
- * costs of exit are high
- * costs of voice are low
- * prior satisfaction is high
- * belief in improvement is high
- * commitment is high
- * attractive alternatives are not available
- * individual has an internal locus of control
+ • costs of exit are low
+ • costs of voice are high
+ • prior satisfaction is low
+ • belief in improvement is low
+ • commitment is low
+ • attractive alternatives are available
+ • individual has an internal locus of control
- Loyalty More Likely When:
- * costs of exit are high
- * costs of voice are high
- * prior satisfaction is high
- * belief in the likelihood of improvement is high
- * commitment is high
- * attractive alternatives are not available
- * individual has an external locus of control
+Voice More Likely When:
- Neglect More Likely When:
- * costs of exit are high
- * costs of voice are high
- * prior satisfaction is low
- * belief in the likelihood of improvement is low
- * commitment is low
- * attractive alternatives are not available
- * individual has an external locus of control
+ • costs of exit are high
+ • costs of voice are low
+ • prior satisfaction is high
+ • belief in improvement is high
+ • commitment is high
+ • attractive alternatives are not available
+ • individual has an internal locus of control
- Something that Withey and Cooper didn’t explore, but Hirschman did, is
- the phenomenon of people who exercise the option of exit and voice.
+Loyalty More Likely When:
- Hirschman argued that you see people use both exit and voice in
- situations where even if they leave a group due to dissatisfaction,
- they’re still affected by the group’s actions.
+ • costs of exit are high
+ • costs of voice are high
+ • prior satisfaction is high
+ • belief in the likelihood of improvement is high
+ • commitment is high
+ • attractive alternatives are not available
+ • individual has an external locus of control
- You see this phenomenon with people who become disaffected with a
- church or religion. They may leave a faith, but they still have friends
- and family members who belong to it. Because the disaffected individual
- still interacts with these people, whose faith informs these
- interactions, the disaffected person is still impacted by the faith,
- even if they no longer practice it. At the same time, an individual who
- leaves a religion may feel that the religion damaged them somehow, and,
- though they have removed themselves from its direct influence, they
- don’t want to see other people get hurt in the same way.
+Neglect More Likely When:
- Consequently, people who leave a religion sometimes become its most
- vocal critics.
+ • costs of exit are high
+ • costs of voice are high
+ • prior satisfaction is low
+ • belief in the likelihood of improvement is low
+ • commitment is low
+ • attractive alternatives are not available
+ • individual has an external locus of control
+
+Something that Withey and Cooper didn’t explore, but Hirschman did, is the
+phenomenon of people who exercise the option of exit and voice.
+
+Hirschman argued that you see people use both exit and voice in situations
+where even if they leave a group due to dissatisfaction, they’re still affected
+by the group’s actions.
+
+You see this phenomenon with people who become disaffected with a church or
+religion. They may leave a faith, but they still have friends and family
+members who belong to it. Because the disaffected individual still interacts
+with these people, whose faith informs these interactions, the disaffected
+person is still impacted by the faith, even if they no longer practice it. At
+the same time, an individual who leaves a religion may feel that the religion
+damaged them somehow, and, though they have removed themselves from its direct
+influence, they don’t want to see other people get hurt in the same way.
+
+Consequently, people who leave a religion sometimes become its most vocal
+critics.
Conclusion
- As I mentioned at the start, once I learned about the exit, voice,
- loyalty, and neglect paradigm, I started to see it everywhere. If
- you’re a business owner, it can help explain why customers react to a
- dissatisfying experience the way they do. If you’re in a bad
- relationship, it can help you think about what action you want to take.
- If you’re a leader in a church, it can help you figure out why some
- people leave your congregation while others stick around.
+As I mentioned at the start, once I learned about the exit, voice, loyalty, and
+neglect paradigm, I started to see it everywhere. If you’re a business owner,
+it can help explain why customers react to a dissatisfying experience the way
+they do. If you’re in a bad relationship, it can help you think about what
+action you want to take. If you’re a leader in a church, it can help you figure
+out why some people leave your congregation while others stick around.
- It can also help you understand why struggling groups often continue to
- struggle: If a group loses enough good people, it’s apt to enter a
- death spiral.
+It can also help you understand why struggling groups often continue to
+struggle: If a group loses enough good people, it’s apt to enter a death
+spiral.
- As you go about dealing with people in all kinds of situations, the
- ELVN framework is one mental model you’ll want to keep in your back
- pocket.
+As you go about dealing with people in all kinds of situations, the ELVN
+framework is one mental model you’ll want to keep in your back pocket.
Related Posts
- * [111]Manvotional: The Right Kind of People
- * [112]How to Develop a Manly Voice [VIDEO]
- * [113]Podcast #506: How to Improve Your Speaking Voice
- * [114]Develop a Strong He-Man Voice by Using the Voice Nature Gave
- You
- * [115]Sunday Firesides: You Are Not Responsible for Other People's
- Feelings
- * [116]Sunday Firesides: Why Bad Things Happen to Good People
- (According to a Stoic)
+ • [177][man]
+ [178]Manvotional: The Right Kind of People
+ • [179][manly-voice]
+ [180]How to Develop a Manly Voice [VIDEO]
+ • [181][voice]
+ [182]Podcast #506: How to Improve Your Speaking Voice
+ • [183][he7]
+ [184]Develop a Strong He-Man Voice by Using the Voice Nature Gave You
+ • [185][Other-Peoples-Feelings-Header-BLANK]
+ [186]Sunday Firesides: You Are Not Responsible for Other People's Feelings
+ • [187][Bad-to-Good-BLANK]
+ [188]Sunday Firesides: Why Bad Things Happen to Good People (According to a
+ Stoic)
- [117]Previous [118]Next
+[189] Previous [190]Next
+document
- document
+Never miss an update
- Never miss an update
+Subscribe to the AoM Newsletter
- Subscribe to the AoM Newsletter
- ____________________
- ____________________
- Daily [ ] Weekly [ ]
- I agree to the [119]privacy policy terms. [ ]
- Subscribe
+[191][ ]
+[192][ ]
+Daily [193][ ] Weekly [194][ ]
+I agree to the [195]privacy policy terms. [196][ ]
+[198][Subscribe]
+Want to start taking action on the content you read on AoM?
- teddy teddy icon
+[199]Join the Strenuous Life
+[200]Learn More
+document
- Want to start taking action on the content you read on AoM?
- [120]Join the Strenuous Life
- [121]Learn More
+Never miss an update
- document
+Subscribe to the AoM Newsletter
- Never miss an update
+[201][ ]
+[202][ ]
+Daily [203][ ] Weekly [204][ ]
+I agree to the [205]privacy policy terms. [206][ ]
+[208][Subscribe]
+podcast [209] podcast icon [210] Podcast #959
- Subscribe to the AoM Newsletter
- ____________________
- ____________________
- Daily [ ] Weekly [ ]
- I agree to the [122]privacy policy terms. [ ]
- Subscribe
+Come Alive Again by Having More Fun
- podcast
-
- [123]podcast icon
-
- [124]Podcast #958
+[211] podcast icon [212] Podcast #958
An Insider’s Guide to the Rise of the American Mafia
- [125]podcast icon
-
- [126]Podcast #957
+[213] podcast icon [214] Podcast #957
How Curiosity Conversations Can Supercharge Your Success
- [127]podcast icon
-
- [128]Podcast #956
+[215] podcast icon [216] Podcast #956
Feeling Depressed and Discombobulated? Social Acceleration May Be to Blame
- [129]podcast icon
+[217]View all
- [130]Podcast #955
+Related
-The Power of NEAT — Move a Little to Lose a Lot
+Articles///
- [131]View all
-
- Related
-
- Articles///
- [132]
+[218]
Podcast #958: An Insider’s Guide to the Rise of the American Mafia
- [133]
+[219]
Sunday Firesides: First Day, Worst Day
- [134]
+[220]
Rage, Rage Against the Dying Back of the Brain
- [135]
+[221]
-Podcast #956: Feeling Depressed and Discombobulated? Social Acceleration May
-Be to Blame
+Podcast #956: Feeling Depressed and Discombobulated? Social Acceleration May Be
+to Blame
- [136]View all
+[222]View all
- Get Daily Updates
- [137]Text MANLY to (918) 393-3049
+Get Daily Updates
+[223]Text MANLY to (918) 393-3049
+The Art of Manliness
+Copyright © 2024 All Rights Reserved
- The Art of Manliness
- Copyright © 2024 All Rights Reserved
+ • [224]Contact
+ • [225]Legal
+ • [226]About
+ • [227]All Topics
+ • [228]Archives
- * [138]Contact
- * [139]Legal
- * [140]About
- * [141]All Topics
- * [142]Archives
+The Art of Manliness participates in affiliate marketing programs, which means
+we get paid commissions on editorially chosen products purchased through our
+links. We only recommend products we genuinely like, and purchases made through
+our links support our mission and the free content we publish here on AoM.
- The Art of Manliness participates in affiliate marketing programs,
- which means we get paid commissions on editorially chosen products
- purchased through our links. We only recommend products we genuinely
- like, and purchases made through our links support our mission and the
- free content we publish here on AoM.
-References
+References:
- Visible links:
- 1. https://www.artofmanliness.com/app-json/wp/v2/posts/178403
- 2. https://www.artofmanliness.com/app-json/oembed/1.0/embed?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 3. https://www.artofmanliness.com/app-json/oembed/1.0/embed?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/&format=xml
- 4. https://www.googletagmanager.com/ns.html?id=GTM-KXJGHMC
- 5. https://www.artofmanliness.com/
- 6. https://www.artofmanliness.com/podcast
- 7. https://www.artofmanliness.com/style/
- 8. https://www.artofmanliness.com/style/clothing/
- 9. https://www.artofmanliness.com/style/accessories/
- 10. https://www.artofmanliness.com/style/facial-hair/
- 11. https://www.artofmanliness.com/style/ties/
- 12. https://www.artofmanliness.com/health-fitness/
- 13. https://www.artofmanliness.com/health-fitness/fitness/
- 14. https://www.artofmanliness.com/health-fitness/health/
- 15. https://www.artofmanliness.com/health-fitness/program-review/
- 16. https://www.artofmanliness.com/people/
- 17. https://www.artofmanliness.com/people/family/
- 18. https://www.artofmanliness.com/people/fatherhood/
- 19. https://www.artofmanliness.com/people/relationships/
- 20. https://www.artofmanliness.com/people/social-skills/
- 21. https://www.artofmanliness.com/skills/
- 22. https://www.artofmanliness.com/skills/how-to/
- 23. https://www.artofmanliness.com/skills/manly-know-how/
- 24. https://www.artofmanliness.com/skills/outdoor-survival/
- 25. https://www.artofmanliness.com/podcast/
- 26. https://store.artofmanliness.com/collections/books/
- 27. https://www.instagram.com/artofmanliness/
- 28. https://feedly.com/i/subscription/feed/http://feeds2.feedburner.com/TheArtOfManliness
- 29. https://www.facebook.com/artofmanliness/
- 30. https://twitter.com/artofmanliness
- 31. https://www.youtube.com/user/artofmanliness
- 32. https://www.artofmanliness.com/style/clothing/
- 33. https://www.artofmanliness.com/style/accessories/
- 34. https://www.artofmanliness.com/style/facial-hair/
- 35. https://www.artofmanliness.com/style/ties/
- 36. https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
- 37. https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
- 38. https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
- 39. https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
- 40. https://www.artofmanliness.com/style/did-commandos-go-commando/
- 41. https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
- 42. https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
- 43. https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
- 44. https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
- 45. https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
- 46. https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
- 47. https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
- 48. https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
- 49. https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
- 50. https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
- 51. https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
- 52. https://www.artofmanliness.com/style/
- 53. https://www.artofmanliness.com/health-fitness/fitness/
- 54. https://www.artofmanliness.com/health-fitness/health/
- 55. https://www.artofmanliness.com/health-fitness/program-review/
- 56. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 57. https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
- 58. https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
- 59. https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
- 60. https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
- 61. https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
- 62. https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
- 63. https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
- 64. https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
- 65. https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
- 66. https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
- 67. https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
- 68. https://www.artofmanliness.com/health-fitness/
- 69. https://www.artofmanliness.com/people/family/
- 70. https://www.artofmanliness.com/people/fatherhood/
- 71. https://www.artofmanliness.com/people/relationships/
- 72. https://www.artofmanliness.com/people/social-skills/
- 73. https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
- 74. https://www.artofmanliness.com/people/family/riddles-for-kids/
- 75. https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
- 76. https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
- 77. https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
- 78. https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
- 79. https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
- 80. https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
- 81. https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
- 82. https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
- 83. https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
- 84. https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
- 85. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 86. https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
- 87. https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
- 88. https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
- 89. https://www.artofmanliness.com/people/
- 90. https://www.artofmanliness.com/skills/how-to/
- 91. https://www.artofmanliness.com/skills/manly-know-how/
- 92. https://www.artofmanliness.com/skills/outdoor-survival/
- 93. https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
- 94. https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
- 95. https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
- 96. https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
- 97. https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
- 98. https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
- 99. https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
- 100. https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
- 101. https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
- 102. https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
- 103. https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
- 104. https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
- 105. https://www.artofmanliness.com/skills/
- 106. https://www.artofmanliness.com/character/behavior/
- 107. https://www.artofmanliness.com/character/
- 108. https://amzn.to/3Prv3ox
- 109. https://text2fa.ir/wp-content/uploads/Text2fa.ir-Exit-Voice-Loyalty-and-Neglect-1.pdf
- 110. https://www.jstor.org/stable/2393565
- 111. https://www.artofmanliness.com/character/manly-lessons/manvotional-the-right-kind-of-people/
- 112. https://www.artofmanliness.com/skills/how-to/how-to-develop-a-manly-voice-video/
- 113. https://www.artofmanliness.com/character/behavior/improve-your-speaking-voice/
- 114. https://www.artofmanliness.com/skills/how-to/masculine-voice/
- 115. https://www.artofmanliness.com/character/advice/sunday-firesides-you-are-not-responsible-for-other-peoples-feelings/
- 116. https://www.artofmanliness.com/character/sunday-firesides-why-bad-things-happen-to-good-people-according-to-a-stoic/
- 117. https://www.artofmanliness.com/character/advice/podcast-753-take-back-the-weekend/
- 118. https://www.artofmanliness.com/character/advice/podcast-924-how-to-develop-rugged-flexibility/
- 119. https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 120. https://strenuouslife.co/
- 121. https://strenuouslife.co/
- 122. https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 123. https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
- 124. https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
- 125. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 126. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 127. https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
- 128. https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
- 129. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 130. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 131. https://www.artofmanliness.com/podcast/
- 132. https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
- 133. https://www.artofmanliness.com/character/advice/sunday-firesides-first-day-worst-day/
- 134. https://www.artofmanliness.com/character/knowledge-of-men/rage-rage-against-the-dying-back-of-the-brain/
- 135. https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
- 136. https://www.artofmanliness.com/character/behavior/
- 137. https://my.community.com/artofmanliness?t=manly
- 138. https://www.artofmanliness.com/contact/
- 139. https://www.artofmanliness.com/privacy-policy/
- 140. https://www.artofmanliness.com/about-2/
- 141. https://www.artofmanliness.com/all-topics/
- 142. https://www.artofmanliness.com/archives/
-
- Hidden links:
- 144. https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
- 145. https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
- 146. https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
- 147. https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
- 148. https://www.artofmanliness.com/style/did-commandos-go-commando/
- 149. https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
- 150. https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
- 151. https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
- 152. https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
- 153. https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
- 154. https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
- 155. https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
- 156. https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
- 157. https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
- 158. https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
- 159. https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
- 160. https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
- 161. https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
- 162. https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
- 163. https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
- 164. https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
- 165. https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
- 166. https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
- 167. https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
- 168. https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
- 169. https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
- 170. https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
- 171. https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
- 172. https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
- 173. https://www.artofmanliness.com/people/family/riddles-for-kids/
- 174. https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
- 175. https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
- 176. https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
- 177. https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
- 178. https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
- 179. https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
- 180. https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
- 181. https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
- 182. https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
- 183. https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
- 184. https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
- 185. https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
- 186. https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
- 187. https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
- 188. https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
- 189. https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
- 190. https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
- 191. https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
- 192. https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
- 193. https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
- 194. https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
- 195. https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
- 196. https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
- 197. https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
- 198. https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
- 199. https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
- 200. https://getpocket.com/edit?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 201. https://www.facebook.com/sharer.php?u=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 202. https://pinterest.com/pin/create/link/?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 203. https://twitter.com/intent/tweet?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
- 204. https://www.artofmanliness.com/cdn-cgi/l/email-protection#142b767b706d297c606064672e3b3b6363633a7566607b7279757a787d7a7167673a777b793b777c756675776071663b76717c75627d7b663b716c7d6039627b7d777139787b6d7578606d397a71737871776039637c6d3964717b647871397871756271396760756d397b663960666d39607b397661667a397d603975787839707b637a3b
- 205. https://www.artofmanliness.com/character/manly-lessons/manvotional-the-right-kind-of-people/
- 206. https://www.artofmanliness.com/skills/how-to/how-to-develop-a-manly-voice-video/
- 207. https://www.artofmanliness.com/character/behavior/improve-your-speaking-voice/
- 208. https://www.artofmanliness.com/skills/how-to/masculine-voice/
- 209. https://www.artofmanliness.com/character/advice/sunday-firesides-you-are-not-responsible-for-other-peoples-feelings/
- 210. https://www.artofmanliness.com/character/sunday-firesides-why-bad-things-happen-to-good-people-according-to-a-stoic/
+[1] https://www.artofmanliness.com/
+[2] https://www.artofmanliness.com/podcast
+[5] https://www.artofmanliness.com/style/
+[6] https://www.artofmanliness.com/style/clothing/
+[7] https://www.artofmanliness.com/style/accessories/
+[8] https://www.artofmanliness.com/style/facial-hair/
+[9] https://www.artofmanliness.com/style/ties/
+[10] https://www.artofmanliness.com/health-fitness/
+[11] https://www.artofmanliness.com/health-fitness/fitness/
+[12] https://www.artofmanliness.com/health-fitness/health/
+[13] https://www.artofmanliness.com/health-fitness/program-review/
+[14] https://www.artofmanliness.com/people/
+[15] https://www.artofmanliness.com/people/family/
+[16] https://www.artofmanliness.com/people/fatherhood/
+[17] https://www.artofmanliness.com/people/relationships/
+[18] https://www.artofmanliness.com/people/social-skills/
+[19] https://www.artofmanliness.com/skills/
+[20] https://www.artofmanliness.com/skills/how-to/
+[21] https://www.artofmanliness.com/skills/manly-know-how/
+[22] https://www.artofmanliness.com/skills/outdoor-survival/
+[23] https://www.artofmanliness.com/podcast/
+[24] https://store.artofmanliness.com/collections/books/
+[25] https://www.instagram.com/artofmanliness/
+[26] https://feedly.com/i/subscription/feed/http%3A//feeds2.feedburner.com/TheArtOfManliness
+[27] https://www.facebook.com/artofmanliness/
+[28] https://twitter.com/artofmanliness
+[29] https://www.youtube.com/user/artofmanliness
+[32] https://www.artofmanliness.com/style/clothing/
+[33] https://www.artofmanliness.com/style/accessories/
+[34] https://www.artofmanliness.com/style/facial-hair/
+[35] https://www.artofmanliness.com/style/ties/
+[36] https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
+[37] https://www.artofmanliness.com/style/clothing/3-ways-to-wear-a-henley-shirt/
+[38] https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
+[39] https://www.artofmanliness.com/style/clothing/a-mans-guide-to-the-oxford-shirt/
+[40] https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
+[41] https://www.artofmanliness.com/style/clothing/30-second-suit-quality-test/
+[42] https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
+[43] https://www.artofmanliness.com/style/clothing/how-to-get-the-stink-out-of-workout-shirts/
+[44] https://www.artofmanliness.com/style/did-commandos-go-commando/
+[45] https://www.artofmanliness.com/style/did-commandos-go-commando/
+[46] https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
+[47] https://www.artofmanliness.com/style/accessories/guide-to-fragrance/
+[48] https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
+[49] https://www.artofmanliness.com/style/accessories/huckberry-weekender-sunglasses/
+[50] https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
+[51] https://www.artofmanliness.com/style/accessories/how-to-pick-mens-wedding-ring/
+[52] https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
+[53] https://www.artofmanliness.com/style/facial-hair/your-no-nonsense-guide-to-choosing-the-right-beard-style/
+[54] https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
+[55] https://www.artofmanliness.com/style/facial-hair/growing-a-manly-beard/
+[56] https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
+[57] https://www.artofmanliness.com/style/facial-hair/beard-oil-faq/
+[58] https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
+[59] https://www.artofmanliness.com/style/facial-hair/beard-grooming-products-routine/
+[60] https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
+[61] https://www.artofmanliness.com/style/ties/5-ways-to-tie-a-scarf-your-60-second-visual-guide/
+[62] https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
+[63] https://www.artofmanliness.com/style/ties/how-to-tie-a-tie/
+[64] https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
+[65] https://www.artofmanliness.com/style/ties/how-to-tie-a-half-windsor-knot/
+[66] https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
+[67] https://www.artofmanliness.com/style/ties/how-to-match-a-shirt-and-tie/
+[68] https://www.artofmanliness.com/style/
+[69] https://www.artofmanliness.com/health-fitness/fitness/
+[70] https://www.artofmanliness.com/health-fitness/health/
+[71] https://www.artofmanliness.com/health-fitness/program-review/
+[72] https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
+[73] https://www.artofmanliness.com/health-fitness/fitness/podcast-955-the-power-of-neat-move-a-little-to-lose-a-lot/
+[74] https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
+[75] https://www.artofmanliness.com/health-fitness/fitness/podcast-767-fat-loss-made-simple/
+[76] https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
+[77] https://www.artofmanliness.com/health-fitness/fitness/mike-mentzer-heavy-duty/
+[78] https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
+[79] https://www.artofmanliness.com/health-fitness/fitness/podcast-939-what-lifting-ancient-stones-can-teach-you-about-being-a-man/
+[80] https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
+[81] https://www.artofmanliness.com/health-fitness/health/what-you-can-learn-about-shedding-pounds-from-the-vacation-weight-loss-paradox/
+[82] https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
+[83] https://www.artofmanliness.com/health-fitness/health/you-need-to-eat-more-fiber/
+[84] https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
+[85] https://www.artofmanliness.com/health-fitness/health/silencing-the-ring-proven-strategies-for-tinnitus-relief/
+[86] https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
+[87] https://www.artofmanliness.com/health-fitness/health/podcast-947-turn-your-anxiety-into-a-strength/
+[88] https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
+[89] https://www.artofmanliness.com/health-fitness/program-review/the-insanely-difficult-standards-of-historys-hardest-p-e-program/
+[90] https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
+[91] https://www.artofmanliness.com/health-fitness/program-review/fitness-program-right/
+[92] https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
+[93] https://www.artofmanliness.com/health-fitness/program-review/a-review-of-the-movnat-workshop/
+[94] https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
+[95] https://www.artofmanliness.com/health-fitness/program-review/atomic-athlete-vanguard/
+[96] https://www.artofmanliness.com/health-fitness/
+[97] https://www.artofmanliness.com/people/family/
+[98] https://www.artofmanliness.com/people/fatherhood/
+[99] https://www.artofmanliness.com/people/relationships/
+[100] https://www.artofmanliness.com/people/social-skills/
+[101] https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
+[102] https://www.artofmanliness.com/people/family/podcast-946-counterintuitive-ideas-about-marriage-family-and-kids/
+[103] https://www.artofmanliness.com/people/family/riddles-for-kids/
+[104] https://www.artofmanliness.com/people/family/riddles-for-kids/
+[105] https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
+[106] https://www.artofmanliness.com/people/family/podcast-sibling-ambivalent/
+[107] https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
+[108] https://www.artofmanliness.com/people/family/how-to-develop-gratitude-in-your-kids/
+[109] https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
+[110] https://www.artofmanliness.com/people/fatherhood/how-to-parent-teacher-conference/
+[111] https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
+[112] https://www.artofmanliness.com/people/fatherhood/5-ways-fathers-hugely-influence-on-their-daughters/
+[113] https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
+[114] https://www.artofmanliness.com/people/fatherhood/sunday-firesides-we-shouldnt-and-should-be-friends-with-our-kids/
+[115] https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
+[116] https://www.artofmanliness.com/people/fatherhood/what-to-do-when-your-kid-lies-to-you/
+[117] https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
+[118] https://www.artofmanliness.com/people/relationships/sunday-firesides-can-we-finally-stop-blaming-the-puritans/
+[119] https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
+[120] https://www.artofmanliness.com/people/relationships/sunday-firesides-the-sit-in-silence-relationship-test/
+[121] https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
+[122] https://www.artofmanliness.com/people/relationships/sunday-firesides-treat-people-as-ends-not-means/
+[123] https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
+[124] https://www.artofmanliness.com/people/relationships/podcast-920-advice-on-making-love-last-from-a-divorce-lawyer/
+[125] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[126] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[127] https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
+[128] https://www.artofmanliness.com/people/social-skills/podcast-837-the-cues-that-make-you-charismatic/
+[129] https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
+[130] https://www.artofmanliness.com/people/social-skills/podcast-938-social-skills-as-the-road-to-character/
+[131] https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
+[132] https://www.artofmanliness.com/people/social-skills/podcast-915-finally-learn-to-say-no/
+[133] https://www.artofmanliness.com/people/
+[134] https://www.artofmanliness.com/skills/how-to/
+[135] https://www.artofmanliness.com/skills/manly-know-how/
+[136] https://www.artofmanliness.com/skills/outdoor-survival/
+[137] https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
+[138] https://www.artofmanliness.com/skills/how-to/how-to-wrap-a-gift-an-illustrated-guide/
+[139] https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
+[140] https://www.artofmanliness.com/skills/how-to/how-to-de-ice-your-windshield-easily-and-effectively/
+[141] https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
+[142] https://www.artofmanliness.com/skills/how-to/how-to-paint-a-room/
+[143] https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
+[144] https://www.artofmanliness.com/skills/how-to/store-stack-firewood/
+[145] https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
+[146] https://www.artofmanliness.com/skills/manly-know-how/build-cozy-fireplace-fire-wont-get-smoky/
+[147] https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
+[148] https://www.artofmanliness.com/skills/manly-know-how/how-to-adjust-your-car-mirrors-to-eliminate-blind-spots/
+[149] https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
+[150] https://www.artofmanliness.com/skills/manly-know-how/how-throw-a-spiral-football/
+[151] https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
+[152] https://www.artofmanliness.com/skills/manly-know-how/whats-the-difference-between-gas-octanes/
+[153] https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
+[154] https://www.artofmanliness.com/skills/outdoor-survival/how-to-build-a-quinzee-snow-shelter-illustrated-guide/
+[155] https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
+[156] https://www.artofmanliness.com/skills/outdoor-survival/how-to-survive-an-earthquake/
+[157] https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
+[158] https://www.artofmanliness.com/skills/outdoor-survival/two-things-you-should-be-doing-to-take-better-care-of-your-camping-gear/
+[159] https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
+[160] https://www.artofmanliness.com/skills/outdoor-survival/how-to-emergency-rappel/
+[161] https://www.artofmanliness.com/skills/
+[167] https://www.artofmanliness.com/character/behavior/
+[168] https://www.artofmanliness.com/character/
+[169] https://getpocket.com/edit?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
+[170] https://www.facebook.com/sharer.php?u=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
+[171] https://pinterest.com/pin/create/link/?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
+[172] https://twitter.com/intent/tweet?url=https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/
+[173] https://www.artofmanliness.com/cdn-cgi/l/email-protection#26194449425f1b4e525256551c09095151510847545249404b47484a4f484355550845494b09454e475447455243540944434e47504f495409435e4f520b50494f45430b4a495f474a525f0b4843414a4345520b514e5f0b564349564a430b4a434750430b5552475f0b49540b52545f0b52490b445354480b4f520b474a4a0b4249514809
+[174] https://amzn.to/3Prv3ox
+[175] https://text2fa.ir/wp-content/uploads/Text2fa.ir-Exit-Voice-Loyalty-and-Neglect-1.pdf
+[176] https://www.jstor.org/stable/2393565
+[177] https://www.artofmanliness.com/character/manly-lessons/manvotional-the-right-kind-of-people/
+[178] https://www.artofmanliness.com/character/manly-lessons/manvotional-the-right-kind-of-people/
+[179] https://www.artofmanliness.com/skills/how-to/how-to-develop-a-manly-voice-video/
+[180] https://www.artofmanliness.com/skills/how-to/how-to-develop-a-manly-voice-video/
+[181] https://www.artofmanliness.com/character/behavior/improve-your-speaking-voice/
+[182] https://www.artofmanliness.com/character/behavior/improve-your-speaking-voice/
+[183] https://www.artofmanliness.com/skills/how-to/masculine-voice/
+[184] https://www.artofmanliness.com/skills/how-to/masculine-voice/
+[185] https://www.artofmanliness.com/character/advice/sunday-firesides-you-are-not-responsible-for-other-peoples-feelings/
+[186] https://www.artofmanliness.com/character/advice/sunday-firesides-you-are-not-responsible-for-other-peoples-feelings/
+[187] https://www.artofmanliness.com/character/sunday-firesides-why-bad-things-happen-to-good-people-according-to-a-stoic/
+[188] https://www.artofmanliness.com/character/sunday-firesides-why-bad-things-happen-to-good-people-according-to-a-stoic/
+[189] https://www.artofmanliness.com/character/advice/podcast-753-take-back-the-weekend/
+[190] https://www.artofmanliness.com/character/advice/podcast-924-how-to-develop-rugged-flexibility/
+[195] https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/#
+[199] https://strenuouslife.co/
+[200] https://strenuouslife.co/
+[205] https://www.artofmanliness.com/character/behavior/exit-voice-loyalty-neglect-why-people-leave-stay-or-try-to-burn-it-all-down/#
+[209] https://www.artofmanliness.com/living/leisure/podcast-959-come-alive-again-by-having-more-fun/
+[210] https://www.artofmanliness.com/living/leisure/podcast-959-come-alive-again-by-having-more-fun/
+[211] https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
+[212] https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
+[213] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[214] https://www.artofmanliness.com/people/social-skills/podcast-957-how-curiosity-conversations-can-supercharge-your-success/
+[215] https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
+[216] https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
+[217] https://www.artofmanliness.com/podcast/
+[218] https://www.artofmanliness.com/character/knowledge-of-men/podcast-958-an-insiders-guide-to-the-rise-of-the-american-mafia/
+[219] https://www.artofmanliness.com/character/advice/sunday-firesides-first-day-worst-day/
+[220] https://www.artofmanliness.com/character/knowledge-of-men/rage-rage-against-the-dying-back-of-the-brain/
+[221] https://www.artofmanliness.com/character/behavior/podcast-956-feeling-depressed-and-discombobulated-social-acceleration-may-be-to-blame/
+[222] https://www.artofmanliness.com/character/behavior/
+[223] https://my.community.com/artofmanliness?t=manly
+[224] https://www.artofmanliness.com/contact/
+[225] https://www.artofmanliness.com/privacy-policy/
+[226] https://www.artofmanliness.com/about-2/
+[227] https://www.artofmanliness.com/all-topics/
+[228] https://www.artofmanliness.com/archives/
diff --git a/static/archive/www-baldurbjarnason-com-uaaq9d.txt b/static/archive/www-baldurbjarnason-com-uaaq9d.txt
index 100b4a1..4193e40 100644
--- a/static/archive/www-baldurbjarnason-com-uaaq9d.txt
+++ b/static/archive/www-baldurbjarnason-com-uaaq9d.txt
@@ -1,222 +1,210 @@
- #[1]All posts for Baldur Bjarnason
+ • [1]Archive
+ • [2]Newsletter
+ • [3]Book
+ • [4]AI Book
+ • [5]Contact
- * [2]Archive
- * [3]Newsletter
- * [4]Book
- * [5]AI Book
- * [6]Contact
+[6]Baldur Bjarnason
- [7]Baldur Bjarnason
+Web dev at the end of the world, from Hveragerði, Iceland
- Web dev at the end of the world, from Hveragerði, Iceland
-
- 21 November 2022
+21 November 2022
Programming is a Pop Culture
- (What follows is an extract from [8]Out of the Software Crisis, lightly
- edited to work as a blog post.)
- __________________________________________________________________
+(What follows is an extract from [7]Out of the Software Crisis, lightly edited
+to work as a blog post.)
- So I think what happened is computing has turned into pop culture
- and the universities are not helping in general, at least not in the
- US.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- So, Cicero---anybody know a good Cicero quote having to do with the
- present and past? Let's check your classical education here. So, you
- know who Cicero was. He was one of those old Roman guys.
- So, Cicero once wrote: 'He who knows only his own generation remains
- forever a child.'
+ So I think what happened is computing has turned into pop culture and the
+ universities are not helping in general, at least not in the US.
- [9]Programming and Scaling (Alan Kay, 2011)
+ So, Cicero---anybody know a good Cicero quote having to do with the present
+ and past? Let's check your classical education here. So, you know who
+ Cicero was. He was one of those old Roman guys.
- The programming pop culture defines change—any change—as progress. Most
- developers, myself included, have a fascination with novelty. If it’s
- new, then it must be an improvement. You even hear this stated outright
- as an argument by developers: it’s newer and therefore better. Trends
- in software development are rarely based on objective observation or
- sensible practice. This endless chasing of trends leads to projects
- being needlessly rewritten, code being abandoned, and new projects
- being started when fixing the bugs in an old project would have done
- the same. The stocks of the software development system are flushed out
- at a moment’s notice simply because the developers found something
- shinier.
+ So, Cicero once wrote: 'He who knows only his own generation remains
+ forever a child.'
- Experienced developers are aware of this tendency in themselves and
- work to mitigate it, but younger developers are often under the
- mistaken impression that this is how software development works. Unless
- they can pare back this tendency or are matched with teammates who hold
- them back, this tendency can lead to immense destruction of value for
- an organisation.
+[8]Programming and Scaling (Alan Kay, 2011)
- Pop cultures favour the visual aesthetic of the day. We all know what
- sort of aesthetic designers commonly favour. Small, low-contrast text,
- lots of whitespace, no pure whites or pure blacks (just greys). The
- details vary with fashion, but each generation of designers has a
- preferred visual aesthetic. That aesthetic tests poorly; the text is
- illegible; the layout doesn’t have enough contrast. The information
- density is so sparse it’s effectively non-existent.
+The programming pop culture defines change—any change—as progress. Most
+developers, myself included, have a fascination with novelty. If it’s new, then
+it must be an improvement. You even hear this stated outright as an argument by
+developers: it’s newer and therefore better. Trends in software development are
+rarely based on objective observation or sensible practice. This endless
+chasing of trends leads to projects being needlessly rewritten, code being
+abandoned, and new projects being started when fixing the bugs in an old
+project would have done the same. The stocks of the software development system
+are flushed out at a moment’s notice simply because the developers found
+something shinier.
- Looks pretty, though.
+Experienced developers are aware of this tendency in themselves and work to
+mitigate it, but younger developers are often under the mistaken impression
+that this is how software development works. Unless they can pare back this
+tendency or are matched with teammates who hold them back, this tendency can
+lead to immense destruction of value for an organisation.
- Coders have a similar tendency, their preferred aesthetic is just a bit
- different, but as with designers, it tests horribly when put in front
- of genuine users. The exact details of the preferred aesthetic tend to
- vary from generation to generation. One group prefers light-on-dark
- text (despite not suffering from conditions that benefit from dark
- mode) and unusable hyper-complex layouts where everything is
- configurable. Another group goes for ultra-minimalism where nothing is
- shown by default. You constantly scrub around and hunt for a button, a
- widget—anything that even vaguely resembles an affordance. This is
- usually not an issue if you have designers on the team. If you’re
- letting the programmers design the user interface or are a programmer
- designing a user interface, you need to be aware of it.
+Pop cultures favour the visual aesthetic of the day. We all know what sort of
+aesthetic designers commonly favour. Small, low-contrast text, lots of
+whitespace, no pure whites or pure blacks (just greys). The details vary with
+fashion, but each generation of designers has a preferred visual aesthetic.
+That aesthetic tests poorly; the text is illegible; the layout doesn’t have
+enough contrast. The information density is so sparse it’s effectively
+non-existent.
- But this adherence to a specific aesthetic isn’t limited to designs.
- It’s also an issue when it comes to the code itself.
+Looks pretty, though.
- The programming pop culture favours specific code aesthetics based on
- the trends of the day. I’m not talking about code style or formatting.
- The code in a project should adhere to a single style, simple as that.
- The issue is that the programming pop culture demands that code exhibit
- the latest popular aesthetics of rigour, formality, and cleverness.
- Whether the code actually is rigorous, formal, or clever matters less.
- A few years ago, as the popularity of the Ruby programming language
- peaked, a certain dynamism and trickery were en vogue. It didn’t matter
- if you were writing in Ruby, JavaScript, or Objective-C. Your code had
- to have a level of “magic” to it. Metaprogramming, syntax-hacking
- languages to create ad hoc Domain-Specific Languages, tricks with
- extreme late binding, and more were frequent topics on developer
- weblogs and forums. Even a phrase like “objective-c runtime
- metaprogramming” will date you to a specific generation of native app
- developers almost down to a single year.
+Coders have a similar tendency, their preferred aesthetic is just a bit
+different, but as with designers, it tests horribly when put in front of
+genuine users. The exact details of the preferred aesthetic tend to vary from
+generation to generation. One group prefers light-on-dark text (despite not
+suffering from conditions that benefit from dark mode) and unusable
+hyper-complex layouts where everything is configurable. Another group goes for
+ultra-minimalism where nothing is shown by default. You constantly scrub around
+and hunt for a button, a widget—anything that even vaguely resembles an
+affordance. This is usually not an issue if you have designers on the team. If
+you’re letting the programmers design the user interface or are a programmer
+designing a user interface, you need to be aware of it.
- As with all of these pop culture trends in programming, this led to
- unreadable code that was impossible to work with or fix as soon as it
- faded from popular consciousness.
+But this adherence to a specific aesthetic isn’t limited to designs. It’s also
+an issue when it comes to the code itself.
- The current trend is towards the aesthetics of correctness. Everything
- has to look like it has strong or static typing. It doesn’t have to
- really have static typing. That can all be made up after the fact in a
- declaration file. It merely needs to have the aesthetics of types. Type
- annotations everywhere, implementing logic through type system
- trickery, and forcing any and all dynamism out of the system in the
- name of correctness is the name of the game.
+The programming pop culture favours specific code aesthetics based on the
+trends of the day. I’m not talking about code style or formatting. The code in
+a project should adhere to a single style, simple as that. The issue is that
+the programming pop culture demands that code exhibit the latest popular
+aesthetics of rigour, formality, and cleverness. Whether the code actually is
+rigorous, formal, or clever matters less. A few years ago, as the popularity of
+the Ruby programming language peaked, a certain dynamism and trickery were en
+vogue. It didn’t matter if you were writing in Ruby, JavaScript, or
+Objective-C. Your code had to have a level of “magic” to it. Metaprogramming,
+syntax-hacking languages to create ad hoc Domain-Specific Languages, tricks
+with extreme late binding, and more were frequent topics on developer weblogs
+and forums. Even a phrase like “objective-c runtime metaprogramming” will date
+you to a specific generation of native app developers almost down to a single
+year.
- A part of this trend is the unpopularity of the approaches and
- languages that are seen as less rigorous. CSS is dropped in favour of
- statically typed CSS-in-JS approaches. HTML is dropped in favour of a
- strict inline XML-like markup format called JSX. Just a few years ago,
- everybody in web development hated and dropped XML and XHTML
- specifically because it was too strict and felt less dynamic and
- flexible than HTML. At some point, pop culture will bore of this and
- swing its attention back the other way.
+As with all of these pop culture trends in programming, this led to unreadable
+code that was impossible to work with or fix as soon as it faded from popular
+consciousness.
- It’s a fashion industry. Trends come; trends go. The lack of historical
- awareness is considered by most to be a feature.
+The current trend is towards the aesthetics of correctness. Everything has to
+look like it has strong or static typing. It doesn’t have to really have static
+typing. That can all be made up after the fact in a declaration file. It merely
+needs to have the aesthetics of types. Type annotations everywhere,
+implementing logic through type system trickery, and forcing any and all
+dynamism out of the system in the name of correctness is the name of the game.
- This rigour is useful in moderation. Static typing does prevent bugs.
- Usually, they are the same sort of bugs unit testing prevents. Both
- have immense value as tools to manage your software development.
- Currently, the fashion is to favour static typing over unit testing for
- establishing a certain base level of correctness in your code. At some
- point, they are likely to switch again. They have a couple of times in
- the past. That you could use both at the same time and get the benefits
- of both doesn’t enter the discourse. Static typing with compile-time
- correctness checks has its uses. So do dynamism, extreme late binding,
- and metaprogramming. Most of these approaches can be used together, but
- that isn’t how pop culture works. Pop culture demands there be only one
- winner at a time. Choose one, not whichever works the best at each
- time.
+A part of this trend is the unpopularity of the approaches and languages that
+are seen as less rigorous. CSS is dropped in favour of statically typed
+CSS-in-JS approaches. HTML is dropped in favour of a strict inline XML-like
+markup format called JSX. Just a few years ago, everybody in web development
+hated and dropped XML and XHTML specifically because it was too strict and felt
+less dynamic and flexible than HTML. At some point, pop culture will bore of
+this and swing its attention back the other way.
- Product development can’t indulge in being pop culture. Be wary of
- these popularity contests.
+It’s a fashion industry. Trends come; trends go. The lack of historical
+awareness is considered by most to be a feature.
- These issues with programming culture aren’t new.
+This rigour is useful in moderation. Static typing does prevent bugs. Usually,
+they are the same sort of bugs unit testing prevents. Both have immense value
+as tools to manage your software development. Currently, the fashion is to
+favour static typing over unit testing for establishing a certain base level of
+correctness in your code. At some point, they are likely to switch again. They
+have a couple of times in the past. That you could use both at the same time
+and get the benefits of both doesn’t enter the discourse. Static typing with
+compile-time correctness checks has its uses. So do dynamism, extreme late
+binding, and metaprogramming. Most of these approaches can be used together,
+but that isn’t how pop culture works. Pop culture demands there be only one
+winner at a time. Choose one, not whichever works the best at each time.
- Jamie Zawinski calls it the [10]“Cascade of Attention-Deficit
- Teenagers” model. We can’t do much to change the nature of the field by
- now—Alan Kay has certainly tried—but we can mitigate the harm done by
- the trend-seeking. We can work to ensure that everybody on the team,
- programmers and designers, is aligned, and have the same understanding
- of what matters and how to accomplish it.
+Product development can’t indulge in being pop culture. Be wary of these
+popularity contests.
- For that, you need everybody to understand the context they are working
- in—the works of their field and how they are received. You need to
- develop taste and understanding.
+These issues with programming culture aren’t new.
- You need research.
- __________________________________________________________________
+Jamie Zawinski calls it the [9]“Cascade of Attention-Deficit Teenagers” model.
+We can’t do much to change the nature of the field by now—Alan Kay has
+certainly tried—but we can mitigate the harm done by the trend-seeking. We can
+work to ensure that everybody on the team, programmers and designers, is
+aligned, and have the same understanding of what matters and how to accomplish
+it.
- Bonus Alan Kay quote on programming as a pop culture that I didn’t
- include in the book:
+For that, you need everybody to understand the context they are working in—the
+works of their field and how they are received. You need to develop taste and
+understanding.
- But pop culture holds a disdain for history. Pop culture is all
- about identity and feeling like you’re participating. It has nothing
- to do with cooperation, the past or the future—it’s living in the
- present. I think the same is true of most people who write code for
- money. They have no idea where [their culture came from]—and the
- Internet was done so well that most people think of it as a natural
- resource like the Pacific Ocean, rather than something that was
- man-made.
+You need research.
- Alan Kay, [11]Dr. Dobb’s Interview with Alan Kay
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-[12]Out of the Software Crisis
+Bonus Alan Kay quote on programming as a pop culture that I didn’t include in
+the book:
- [13]Out of the Software Crisis by Baldur Bjarnason
+ But pop culture holds a disdain for history. Pop culture is all about
+ identity and feeling like you’re participating. It has nothing to do with
+ cooperation, the past or the future—it’s living in the present. I think the
+ same is true of most people who write code for money. They have no idea
+ where [their culture came from]—and the Internet was done so well that most
+ people think of it as a natural resource like the Pacific Ocean, rather
+ than something that was man-made.
- Software projects keep failing, not because we don’t have the right
- team or tools but because our software development system is broken.
- Out of the Software Crisis is a guide to fixing your software projects
- with systems-thinking making them more resilient to change and less
- likely to fail.
+Alan Kay, [10]Dr. Dobb’s Interview with Alan Kay
- [14]Systems-Thinking For Software Projects
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- [15]WTF is a Framework?
+[11]Out of the Software Crisis
- [16]The response to Out of the Software Crisis has been amazing
+[12]Out of the Software Crisis by Baldur Bjarnason
+
+Software projects keep failing, not because we don’t have the right team or
+tools but because our software development system is broken. Out of the
+Software Crisis is a guide to fixing your software projects with
+systems-thinking making them more resilient to change and less likely to fail.
+
+[13]Systems-Thinking For Software Projects
+
+[14] WTF is a Framework?
+
+[15]The response to Out of the Software Crisis has been amazing
Join the Newsletter
- Subscribe to the [17]Out of the Software Crisis newsletter to get my
- weekly (at least) essays on how to avoid or get out of software
- development crises.
+Subscribe to the [16]Out of the Software Crisis newsletter to get my weekly (at
+least) essays on how to avoid or get out of software development crises.
- Join now and get a free PDF of three bonus essays from Out of the
- Software Crisis.
+Join now and get a free PDF of three bonus essays from Out of the Software
+Crisis.
- ____________________
- (BUTTON)
- Subscribe
+[17][ ]
+Subscribe
- We respect your privacy.
+We respect your privacy.
- Unsubscribe at any time.
+Unsubscribe at any time.
- You can also find me on [18]Mastodon and [19]Twitter
+You can also find me on [19]Mastodon and [20]Twitter
-References
+References:
- 1. https://www.baldurbjarnason.com/feed.xml
- 2. https://www.baldurbjarnason.com/archive
- 3. https://softwarecrisis.dev/
- 4. https://softwarecrisis.baldurbjarnason.com/
- 5. https://illusion.baldurbjarnason.com/
- 6. mailto:baldur.bjarnason@gmail.com
- 7. https://www.baldurbjarnason.com/
- 8. https://softwarecrisis.baldurbjarnason.com/
- 9. https://www.youtube.com/watch?v=YyIQKBzIuBY
- 10. https://www.jwz.org/doc/cadt.html
- 11. https://link.springer.com/content/pdf/bbm:978-3-319-90008-7/1.pdf
- 12. https://softwarecrisis.baldurbjarnason.com/
- 13. https://softwarecrisis.baldurbjarnason.com/
- 14. https://softwarecrisis.baldurbjarnason.com/
- 15. https://www.baldurbjarnason.com/2022/wtf-is-a-framework/
- 16. https://www.baldurbjarnason.com/2022/ootsc-update/
- 17. https://softwarecrisis.dev/
- 18. https://toot.cafe/@baldur
- 19. https://twitter.com/fakebaldur
+[1] https://www.baldurbjarnason.com/archive
+[2] https://softwarecrisis.dev/
+[3] https://softwarecrisis.baldurbjarnason.com/
+[4] https://illusion.baldurbjarnason.com/
+[5] mailto:baldur.bjarnason@gmail.com
+[6] https://www.baldurbjarnason.com/
+[7] https://softwarecrisis.baldurbjarnason.com/
+[8] https://www.youtube.com/watch?v=YyIQKBzIuBY
+[9] https://www.jwz.org/doc/cadt.html
+[10] https://link.springer.com/content/pdf/bbm:978-3-319-90008-7/1.pdf
+[11] https://softwarecrisis.baldurbjarnason.com/
+[12] https://softwarecrisis.baldurbjarnason.com/
+[13] https://softwarecrisis.baldurbjarnason.com/
+[14] https://www.baldurbjarnason.com/2022/wtf-is-a-framework/
+[15] https://www.baldurbjarnason.com/2022/ootsc-update/
+[16] https://softwarecrisis.dev/
+[19] https://toot.cafe/@baldur
+[20] https://twitter.com/fakebaldur
diff --git a/static/archive/www-chrbutler-com-294dnz.txt b/static/archive/www-chrbutler-com-294dnz.txt
index 3d4d07a..e4fd1af 100644
--- a/static/archive/www-chrbutler-com-294dnz.txt
+++ b/static/archive/www-chrbutler-com-294dnz.txt
@@ -1,399 +1,392 @@
- #[1]Christopher Butler ☼
+[1] Christopher Butler ☼
- [2]Christopher Butler ☼
+[2]Archive
-[3]Archive
+[3]Info
-[4]Info
+[4]Now
-[5]Now
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-Organization — Office
+Organization — Office
-After the kitchen, the office is the most used room in our home. This is how
-we keep it organized.
+After the kitchen, the office is the most used room in our home. This is how we
+keep it organized.
- [eaf01f24-61dc-4bef-8166-2f08c81b856a.jpg]
+[eaf01f24-61dc-4bef-8166-2f08c81b856a]
- This is the office.
+This is the office.
- My wife and I work here, Monday through Friday, 9 to 5. Our children
- play and create in here just as often. It’s where we maintain several
- workspaces, store supplies, house a portion of our library, and keep a
- guest bed. To make things even more complicated, I also exercise in
- here nearly every day. All in this 10’ x 12’ space with two windows.
- Since we began working from home, I estimate that we’ve spent around
- 8,000 hours in here.
+My wife and I work here, Monday through Friday, 9 to 5. Our children play and
+create in here just as often. It’s where we maintain several workspaces, store
+supplies, house a portion of our library, and keep a guest bed. To make things
+even more complicated, I also exercise in here nearly every day. All in this
+10’ x 12’ space with two windows. Since we began working from home, I estimate
+that we’ve spent around 8,000 hours in here.
- Organization — at an almost obsessive level — is what keeps this space
- a functional and enjoyable place to spend time. Minimalism, though, is
- not. We have a lot of gear in here. Most of it gets used every single
- day.
+Organization — at an almost obsessive level — is what keeps this space a
+functional and enjoyable place to spend time. Minimalism, though, is not. We
+have a lot of gear in here. Most of it gets used every single day.
- I’m about to share an unnecessary amount of detail on what makes this
- space work. I’ve divided this into three main sections:
+I’m about to share an unnecessary amount of detail on what makes this space
+work. I’ve divided this into three main sections:
- 1. On and Under the Desk
- 2. On the Walls
- 3. In Books
+ 1. On and Under the Desk
+ 2. On the Walls
+ 3. In Books
- At the end of each section, I’ll include a list of all the gear that I
- have either mentioned or captured in pictures.
+At the end of each section, I’ll include a list of all the gear that I have
+either mentioned or captured in pictures.
On and Under the Desk
- I prefer to keep my desktop as free from infrastructure as possible.
+I prefer to keep my desktop as free from infrastructure as possible.
- My general rule is that if I need it within reach, in view, or audible,
- it’s on the desk. If I don’t, it’s under the desk. That means that my
- desktop is still not as free of things as I’d like, but there is an
- impressive amount of gear running my day-to-day underneath it.
+My general rule is that if I need it within reach, in view, or audible, it’s on
+the desk. If I don’t, it’s under the desk. That means that my desktop is still
+not as free of things as I’d like, but there is an impressive amount of gear
+running my day-to-day underneath it.
- [9b3325cc-7028-4d54-b0c0-9000877e3c2b.jpg]
+[9b3325cc-7028-4d54-b0c0-9000877e3c2b]
- [745ee5c9-f738-4677-b266-ff5708036077.jpg]
+[745ee5c9-f738-4677-b266-ff5708036077]
- On the desk is:
- * an [6]LG 32” UltraFine 4k HDR10 Ergo Display mounted on an
- [7]Ergotron LX Single Monitor Arm rather than the arm it ships with
- * an [8]Elgato Key Light
- * a [9]Sure SM7B Microphone mounted on an [10]Elgato Wave Mic Arm
- * a [11]Sony A7C Full Frame Camera with [12]Sony FE 35mm F1.4 GM lens
- mounted with a [13]ULANZI Camera Desk Mount Stand
- * a pair of [14]Audioengine HD3 speakers
- * the [15]awesome lamp I made twenty years ago by duo-tac’ing a strip
- of wax paper onto an industrial plastic tube and placing a
- trash-picked light inside — it still holds up!
- * the desk is a [16]Floyd dining table. I added a [17]sliding
- under-desk drawer.
+On the desk is:
- Underneath the desk I use a simple rack on wheels to stack two
- computers, an input hub, three different external storage drives, an
- audio interface, a battery backup and even my old minidisc player. All
- of it is humming all day, but out of sight.
+ • an [5]LG 32” UltraFine 4k HDR10 Ergo Display mounted on an [6]Ergotron LX
+ Single Monitor Arm rather than the arm it ships with
+ • an [7]Elgato Key Light
+ • a [8]Sure SM7B Microphone mounted on an [9]Elgato Wave Mic Arm
+ • a [10]Sony A7C Full Frame Camera with [11]Sony FE 35mm F1.4 GM lens mounted
+ with a [12]ULANZI Camera Desk Mount Stand
+ • a pair of [13]Audioengine HD3 speakers
+ • the [14]awesome lamp I made twenty years ago by duo-tac’ing a strip of wax
+ paper onto an industrial plastic tube and placing a trash-picked light
+ inside — it still holds up!
+ • the desk is a [15]Floyd dining table. I added a [16]sliding under-desk
+ drawer.
- All the lights, knobs, and buttons are irresistible to my nearly
- two-year old son, so I made custom covers out of half-inch black foam
- board that slide in between the rack’s supports and the shelf contents
- to keep him from exploring. You can see how they look on the right side
- of the split image below — covers out on the left, in on the right.
+Underneath the desk I use a simple rack on wheels to stack two computers, an
+input hub, three different external storage drives, an audio interface, a
+battery backup and even my old minidisc player. All of it is humming all day,
+but out of sight.
- [58507484-e94a-4aa0-ad71-72c58427649c.jpg]
+All the lights, knobs, and buttons are irresistible to my nearly two-year old
+son, so I made custom covers out of half-inch black foam board that slide in
+between the rack’s supports and the shelf contents to keep him from exploring.
+You can see how they look on the right side of the split image below — covers
+out on the left, in on the right.
- While I’m here, let me take a moment to urge those who have not to
- acquire an uninterruptible power supply (UPS) system.
+[58507484-e94a-4aa0-ad71-72c58427649c]
- We have two [18]CyberPower CP1500 backups running in our office. Each
- has six battery backup and surge protected outlets as well as six
- additional surge protected outlets, network inputs, and USB inputs.
- (It’s the thing on the bottom shelf peeking out a bit from behind one
- of my covers.)
+While I’m here, let me take a moment to urge those who have not to acquire an
+uninterruptible power supply (UPS) system.
- Just this week, we had a freak storm descend upon our city and in the
- span of just 35 minutes knock out power for hundreds of thousands and
- fell more trees than any other storm I’ve experienced in the time I’ve
- lived here. Because I do my work on a Mac Mini, having a UPS that kicks
- in when the power goes out saves me from losing work. But it can also
- keep the lights on, fans going, music playing, the works.
+We have two [17]CyberPower CP1500 backups running in our office. Each has six
+battery backup and surge protected outlets as well as six additional surge
+protected outlets, network inputs, and USB inputs. (It’s the thing on the
+bottom shelf peeking out a bit from behind one of my covers.)
- Keen eyes will notice that the cables behind everything are relatively
- tidy. The thing about cables is that the greater they are in number,
- the more difficult they are to tame!
+Just this week, we had a freak storm descend upon our city and in the span of
+just 35 minutes knock out power for hundreds of thousands and fell more trees
+than any other storm I’ve experienced in the time I’ve lived here. Because I do
+my work on a Mac Mini, having a UPS that kicks in when the power goes out saves
+me from losing work. But it can also keep the lights on, fans going, music
+playing, the works.
- [1e9e3fa0-247a-421b-b63c-34229c2fcad3.jpg]
+Keen eyes will notice that the cables behind everything are relatively tidy.
+The thing about cables is that the greater they are in number, the more
+difficult they are to tame!
- Rather than completely hiding them — and making it more difficult to
- access or alter them later — I prioritize labeling. I coil and bunch
- any excess cable, but I don’t clip or enclose them. I do label them at
- both ends so I can easily identify what’s what no matter where I’m
- looking.
+[1e9e3fa0-247a-421b-b63c-34229c2fcad3]
- Every time I find myself writing a label with sharpie on blue tape, I
- know I’m doing my future self a favor.
+Rather than completely hiding them — and making it more difficult to access or
+alter them later — I prioritize labeling. I coil and bunch any excess cable,
+but I don’t clip or enclose them. I do label them at both ends so I can easily
+identify what’s what no matter where I’m looking.
- Under the desk is:
- * an [19]IKEA KORNSJÖ side table
- * two Apple M1 Mac minis
- * a [20]CalDigit Thunderbolt Station 4 hub
- * two DIY External SSDs — using [21]ACASIS 40gbps Enclosures, [22]WD
- 1TB NVMe SSD Solid State drives, and [23]4’ Thunderbolt 4 Cables
- * a [24]LaCie 2big RAID 8TB External Hard Drive
- * a Cloud Microphone [25]Cloudlifter
- * a [26]Focusrite Scarlet 2i2 audio interface
- * a [27]Sony MXD-D40
- * a [28]CyberPower CP1500PFCLCD UPS System
+Every time I find myself writing a label with sharpie on blue tape, I know I’m
+doing my future self a favor.
+
+Under the desk is:
+
+ • an [18]IKEA KORNSJÖ side table
+ • two Apple M1 Mac minis
+ • a [19]CalDigit Thunderbolt Station 4 hub
+ • two DIY External SSDs — using [20]ACASIS 40gbps Enclosures, [21]WD 1TB NVMe
+ SSD Solid State drives, and [22]4’ Thunderbolt 4 Cables
+ • a [23]LaCie 2big RAID 8TB External Hard Drive
+ • a Cloud Microphone [24]Cloudlifter
+ • a [25]Focusrite Scarlet 2i2 audio interface
+ • a [26]Sony MXD-D40
+ • a [27]CyberPower CP1500PFCLCD UPS System
On the Walls
- My wife and I keep a lot of books and magazines. We’re by no means at a
- hoarder level, but we do like our printed media and that takes up
- space. We have most of our library in another room, but in here, we
- have many magazines, all our design books, and all my books about the
- paranormal and other weirdness.
+My wife and I keep a lot of books and magazines. We’re by no means at a hoarder
+level, but we do like our printed media and that takes up space. We have most
+of our library in another room, but in here, we have many magazines, all our
+design books, and all my books about the paranormal and other weirdness.
- To keep them organized, we need shelves. I have found that the best
- shelves are the ones you create yourself.
+To keep them organized, we need shelves. I have found that the best shelves are
+the ones you create yourself.
- Other than the racks under our desks, all the shelves in this room —
- there are many — were made by measuring and hanging custom rack or
- ledge shelving. It’s inexpensive, very strong (by god use a stud
- finder), and requires very few tools. I made mine with steel racks,
- half-inch poplar, a hand saw, a level, a pencil, and a few different
- straightedges.
+Other than the racks under our desks, all the shelves in this room — there are
+many — were made by measuring and hanging custom rack or ledge shelving. It’s
+inexpensive, very strong (by god use a stud finder), and requires very few
+tools. I made mine with steel racks, half-inch poplar, a hand saw, a level, a
+pencil, and a few different straightedges.
- [4e6fc669-65a5-45e9-bbe6-fde0ef2a7d78.jpg]
+[4e6fc669-65a5-45e9-bbe6-fde0ef2a7d78]
- [32d1e14f-eb6c-46b9-bf52-31c8b5d90e93.jpg]
+[32d1e14f-eb6c-46b9-bf52-31c8b5d90e93]
- I strongly recommend [29]library-grade bookends, which you can see at
- the edges of the shelf pictured above. These are the kind that won’t
- tip over, won’t bend, and won’t slide off the edge of floating shelves.
- They are very, very good.
+I strongly recommend [28]library-grade bookends, which you can see at the edges
+of the shelf pictured above. These are the kind that won’t tip over, won’t
+bend, and won’t slide off the edge of floating shelves. They are very, very
+good.
- Most of the stuff we keep on the shelves needs to be easy to retrieve.
- The best way to do this is to create kits. Find a container that works
- best for you in multiples and gather like items, put them in, and label
- them clearly. (I like the [30]iDesign 29847, which was designed to hold
- toilet paper.)
+Most of the stuff we keep on the shelves needs to be easy to retrieve. The best
+way to do this is to create kits. Find a container that works best for you in
+multiples and gather like items, put them in, and label them clearly. (I like
+the [29]iDesign 29847, which was designed to hold toilet paper.)
- [65617d4c-8d78-4a6a-b71d-6141f6a2b5b1.jpg]
+[65617d4c-8d78-4a6a-b71d-6141f6a2b5b1]
- The shelf pictured above has nearly every frequently used office or
- creative supply in our home. Each box is large enough to hold quite a
- bit, but small enough to be manageable by our kids.
+The shelf pictured above has nearly every frequently used office or creative
+supply in our home. Each box is large enough to hold quite a bit, but small
+enough to be manageable by our kids.
- This room also has a closet. I lined it with shelving to store
- household supplies, paper, tools, and emergency equipment and to make
- it easy to retrieve anything without having to root around. Most of
- this stuff is also in kits stored in [31]IRIS USA Weatherpro latching
- boxes. We are ready for a disaster!
+This room also has a closet. I lined it with shelving to store household
+supplies, paper, tools, and emergency equipment and to make it easy to retrieve
+anything without having to root around. Most of this stuff is also in kits
+stored in [30]IRIS USA Weatherpro latching boxes. We are ready for a disaster!
- [7b5fb987-19be-43c3-8e59-abbcdf37baec.jpg]
+[7b5fb987-19be-43c3-8e59-abbcdf37baec]
- I’m particularly pleased that I can store a collapsible exercise bench
- on the inside of the door.
+I’m particularly pleased that I can store a collapsible exercise bench on the
+inside of the door.
- Other exercise equipment, like my kettlebells, sit under the supply
- shelving on the left — I even rigged up cables to hang rolled up yoga
- mats under the bottom shelf. 👌 It’s the little things.
+Other exercise equipment, like my kettlebells, sit under the supply shelving on
+the left — I even rigged up cables to hang rolled up yoga mats under the bottom
+shelf. 👌 It’s the little things.
- [5909fae1-cc3b-462c-b1f0-142aa56e322f.jpg]
+[5909fae1-cc3b-462c-b1f0-142aa56e322f]
- [7f8971b1-0e00-4699-8e16-af9bad1dfa7b.jpg]
+[7f8971b1-0e00-4699-8e16-af9bad1dfa7b]
- I keep my dumbbells in a neat line under the sofa/guest bed.
+I keep my dumbbells in a neat line under the sofa/guest bed.
- Good organization optimizes for storage and retrieval. These things are
- all very helpful:
- * [32]Floating Ledge steel shelves
- * Proect Source [33]double track strips and [34]brackets
- * [35]The Library Store Bear Hug bookends
- * [36]iDesign 29847 storage bins
- * [37]IRIS USA Weatherpro latching boxes
- * [38]Craftsman Tradestack tool chests
- * [39]Viesso Dublexo Sofa Bed
+Good organization optimizes for storage and retrieval. These things are all
+very helpful:
+
+ • [31]Floating Ledge steel shelves
+ • Proect Source [32]double track strips and [33]brackets
+ • [34]The Library Store Bear Hug bookends
+ • [35]iDesign 29847 storage bins
+ • [36]IRIS USA Weatherpro latching boxes
+ • [37]Craftsman Tradestack tool chests
+ • [38]Viesso Dublexo Sofa Bed
In Books
- I’m as obsessive with how I organize information as I am objects and
- spaces. At this point in my life, I’ve tried dozens and dozens of
- digital organization tools. While I used some of them for a long time —
- I used Todoist for several years — none have ever felt as useful to me
- as pen and paper.
+I’m as obsessive with how I organize information as I am objects and spaces. At
+this point in my life, I’ve tried dozens and dozens of digital organization
+tools. While I used some of them for a long time — I used Todoist for several
+years — none have ever felt as useful to me as pen and paper.
- I’ve kept a notebook of some kind — as a sketchbook, an art journal, a
- log — for decades. I mostly maintained one at a time, and so there was
- always a mixture of things in it: notes and lists on one page, drawings
- and collages on the next.
+I’ve kept a notebook of some kind — as a sketchbook, an art journal, a
+log — for decades. I mostly maintained one at a time, and so there was always a
+mixture of things in it: notes and lists on one page, drawings and collages on
+the next.
- But over the last few years, I’ve been formulating a more intentional
- and systematic use of my notebooks. Now, I maintain two books at the
- same time: one for visual exploration and the other for note-taking and
- list-making.
+But over the last few years, I’ve been formulating a more intentional and
+systematic use of my notebooks. Now, I maintain two books at the same time: one
+for visual exploration and the other for note-taking and list-making.
- [6ea49f4f-861b-408d-85eb-f8c9d7e1c95f.jpg]
+[6ea49f4f-861b-408d-85eb-f8c9d7e1c95f]
- [3d557cb6-2c42-48c3-84ed-950cbafee775.jpg]
+[3d557cb6-2c42-48c3-84ed-950cbafee775]
- [bd52173f-ef6c-4bb7-a15f-a99cefb63011.jpg]
+[bd52173f-ef6c-4bb7-a15f-a99cefb63011]
- Just having two books helps, but the key to making this work as a
- productivity system is to maintain a specific habit of use. While I do
- find writing to-do lists on paper inherently better — for me — than
- using some kind of digital app because I can focus on the information
- outside of the digital space, it’s how I use them that makes them
- actually deliver results for me.
+Just having two books helps, but the key to making this work as a productivity
+system is to maintain a specific habit of use. While I do find writing to-do
+lists on paper inherently better — for me — than using some kind of digital app
+because I can focus on the information outside of the digital space, it’s how I
+use them that makes them actually deliver results for me.
- Here’s how it works:
- 1. I end the day by making a to-do list for the next one.
- This is probably the most important work/life hack I can offer to
- anyone who doesn’t already do this. It’s a great idea to start your
- day with a prioritized list of the things you need to do. But I end
- my day by making that list so that I can also use it as a tool for
- clearing my mind and letting me make a meaningful mental break from
- work. I have also found that when my days are very busy, if I don’t
- end them with making a list for the next day, I am likely to forget
- details by the next morning. This is especially true if I let my
- inbox determine my day; if I don’t have a to-do list, my inbox
- becomes one.
- 2. I mark my to-do list with a bright, yellow sticky note.
- This is a very small detail, but it lets me shut my notebook and
- set it aside. The next morning, I can open it directly to the day’s
- list. Then I move the sticky note to the next page. When I am
- stressed, tiny investments in my future self really pay off. Giving
- myself an immediate sense of place is one of them.
- 3. If a task is longer-term and has many sub-tasks, I create an index
- card to contain it.
- I might transpose some of the sub-tasks from the card to my book so
- I can keep track of things in one place throughout the day, but
- doing this lets me think through how I’m going to achieve a larger
- goal over a longer period of time. I keep these index cards in a
- small box on my desk.
- 4. There are no analytics, and that’s a feature.
- Back when I used Todoist, I found its analytics intriguing and
- motivating. I initially liked being able to pore over my
- productivity statistics. And Todoist set it up to “reward” you as
- you completed more tasks. Ithink I worked my way up to some absurd
- number of tasks complete, which the app always displayed front and
- center, and some ridiculous classification like “Master Overlord”
- or something. It worked for me, until it didn’t. Analytics in this
- context create their own layer of stress. I’d find that if my
- numbers dropped, it felt wrong, even if that was because I was less
- busy — which is probably a good thing now and again! I found that I
- was thinking about my “performance” as often as my productivity. I
- didn’t need that.
+Here’s how it works:
- [2e6d6ea8-930f-4297-9662-d55905f31808.jpg]
+ 1. I end the day by making a to-do list for the next one.
+ This is probably the most important work/life hack I can offer to anyone
+ who doesn’t already do this. It’s a great idea to start your day with a
+ prioritized list of the things you need to do. But I end my day by making
+ that list so that I can also use it as a tool for clearing my mind and
+ letting me make a meaningful mental break from work. I have also found that
+ when my days are very busy, if I don’t end them with making a list for the
+ next day, I am likely to forget details by the next morning. This is
+ especially true if I let my inbox determine my day; if I don’t have a to-do
+ list, my inbox becomes one.
+ 2. I mark my to-do list with a bright, yellow sticky note.
+ This is a very small detail, but it lets me shut my notebook and set it
+ aside. The next morning, I can open it directly to the day’s list. Then I
+ move the sticky note to the next page. When I am stressed, tiny investments
+ in my future self really pay off. Giving myself an immediate sense of place
+ is one of them.
+ 3. If a task is longer-term and has many sub-tasks, I create an index card to
+ contain it.
+ I might transpose some of the sub-tasks from the card to my book so I can
+ keep track of things in one place throughout the day, but doing this lets
+ me think through how I’m going to achieve a larger goal over a longer
+ period of time. I keep these index cards in a small box on my desk.
+ 4. There are no analytics, and that’s a feature.
+ Back when I used Todoist, I found its analytics intriguing and motivating.
+ I initially liked being able to pore over my productivity statistics. And
+ Todoist set it up to “reward” you as you completed more tasks. Ithink I
+ worked my way up to some absurd number of tasks complete, which the app
+ always displayed front and center, and some ridiculous classification like
+ “Master Overlord” or something. It worked for me, until it didn’t.
+ Analytics in this context create their own layer of stress. I’d find that
+ if my numbers dropped, it felt wrong, even if that was because I was less
+ busy — which is probably a good thing now and again! I found that I was
+ thinking about my “performance” as often as my productivity. I didn’t need
+ that.
- This is what works for me. I’d never assume it would work for everyone,
- or that everyone would have the same trouble with an app like Todoist
- that I eventually did. But if you’ve tried apps of various kinds and
- still don’t feel the benefits of organizing your work, I’d suggest
- taking it offline. One point of a system like this is to help you get
- things done. The other is to help you feel more at ease.
+[2e6d6ea8-930f-4297-9662-d55905f31808]
- Now, this doesn’t mean I never use a computer for notes and lists. If I
- write a note or have an idea that I want to transpose to a digital file
- so that it can become something else — like an article or a message to
- someone — I use a blue post-it note to mark it and keep it there until
- I’ve copied it over. (Many of my blue bookmarks are for dream entries
- that I like to store digitally so I can search them later. Maybe I’ll
- write something on dream journaling some day…)
+This is what works for me. I’d never assume it would work for everyone, or that
+everyone would have the same trouble with an app like Todoist that I eventually
+did. But if you’ve tried apps of various kinds and still don’t feel the
+benefits of organizing your work, I’d suggest taking it offline. One point of a
+system like this is to help you get things done. The other is to help you feel
+more at ease.
- [0bc93018-95c3-4df0-9185-f89156dcbd19.jpg]
+Now, this doesn’t mean I never use a computer for notes and lists. If I write a
+note or have an idea that I want to transpose to a digital file so that it can
+become something else — like an article or a message to someone — I use a blue
+post-it note to mark it and keep it there until I’ve copied it over. (Many of
+my blue bookmarks are for dream entries that I like to store digitally so I can
+search them later. Maybe I’ll write something on dream journaling some day…)
- These timeless office supplies are very useful to me and I don’t want
- to live in a world without them:
- * [40]Stillman & Birn Epsilon sketchbooks
- * [41]Pilot G2 pens
- * [42]Electric Yellow Post-it Notes
- * [43]Oxford Blank Index Cards
- * binder clips — you can get them anywhere
+[0bc93018-95c3-4df0-9185-f89156dcbd19]
+
+These timeless office supplies are very useful to me and I don’t want to live
+in a world without them:
+
+ • [39]Stillman & Birn Epsilon sketchbooks
+ • [40]Pilot G2 pens
+ • [41]Electric Yellow Post-it Notes
+ • [42]Oxford Blank Index Cards
+ • binder clips — you can get them anywhere
Why, though?
- I am on a continuous quest for organization.
+I am on a continuous quest for organization.
- For most of my life, order has been something of an obsession.
- Everywhere I look, I see chaos and entropy creeping in. I see a new
- surface and anticipate wear and tear. I see a functioning system and
- look for where it will break.
+For most of my life, order has been something of an obsession. Everywhere I
+look, I see chaos and entropy creeping in. I see a new surface and anticipate
+wear and tear. I see a functioning system and look for where it will break.
- That may sound like an exaggeration and more than a bit unpleasant, but
- I’ve come to understand that it’s neither. Life is, paradoxically, both
- order and disorder.
+That may sound like an exaggeration and more than a bit unpleasant, but I’ve
+come to understand that it’s neither. Life is, paradoxically, both order and
+disorder.
- The very possibility of life presumes order — the coherence of biology
- at the atomic level — and yet, the act of living tends toward disorder.
- As we live and breathe and move about this world we and it push and
- pull against one another; words against wind, towers and tides, edifice
- and erosion. Given the broadest and longest view, all created order is
- futile. We simply don’t live long enough to maintain it.
+The very possibility of life presumes order — the coherence of biology at the
+atomic level — and yet, the act of living tends toward disorder. As we live and
+breathe and move about this world we and it push and pull against one another;
+words against wind, towers and tides, edifice and erosion. Given the broadest
+and longest view, all created order is futile. We simply don’t live long enough
+to maintain it.
- But zoomed in, at the closer range of living day by day, created order
- is, literally, the fabric of functional living. Roofs are order.
- Clothing is order. Order puts food on the table.
+But zoomed in, at the closer range of living day by day, created order is,
+literally, the fabric of functional living. Roofs are order. Clothing is order.
+Order puts food on the table.
- I find the challenge of creating and maintaining functional systems,
- well, kind of fun. It is a creative act. And, it never ends. No system
- can last forever, and no system should. Situations change, needs
- change, we change. So the things we depend upon to exist well need to
- change, too. That means we have to continually look for things to make
- and ways to optimize them. That sounds good to me!
- __________________________________________________________________
+I find the challenge of creating and maintaining functional systems, well, kind
+of fun. It is a creative act. And, it never ends. No system can last forever,
+and no system should. Situations change, needs change, we change. So the things
+we depend upon to exist well need to change, too. That means we have to
+continually look for things to make and ways to optimize them. That sounds good
+to me!
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+
+Written by [43]Christopher Butler on August 18, 2023, In [44]Essays
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-Written by [44]Christopher Butler on August 18, 2023, In [45]Essays
- __________________________________________________________________
Next Entry
- [46]The Internet's Greatest Potential It seems that the internet’s
- greatest potential is to create intimacy across distance. Which means
- we still have a long way to go
+[45] The Internet's Greatest Potential It seems that the internet’s greatest
+potential is to create intimacy across distance. Which means we still have a
+long way to go
Previous Entry
- [47]The Internet is Already a Social Network Make it easier for anyone
- to have a website. Make syndication easier and better. That’s all that
- is needed to reclaim the power we’ve ceded to the
- __________________________________________________________________
+[46] The Internet is Already a Social Network Make it easier for anyone to have
+a website. Make syndication easier and better. That’s all that is needed to
+reclaim the power we’ve ceded to the
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-⌨ Keep up via [48]Email or [49]RSS
+⌨ Keep up via [47]Email or [48]RSS
-✺ [50]Impressum
+✺ [49]Impressum
© Christopher Butler. All rights reserved
-References
- 1. https://www.chrbutler.com/feed.rss
- 2. https://www.chrbutler.com/
- 3. https://www.chrbutler.com/archives
- 4. https://www.chrbutler.com/information
- 5. https://www.chrbutler.com/now/2024-01-06
- 6. https://www.lg.com/us/monitors/lg-32un880-b-4k-uhd-led-monitor
- 7. https://www.ergotron.com/en-us/products/product-details/45-241#?color=black&attachment option=2-Piece Clamp
- 8. https://www.elgato.com/en/key-light
- 9. https://www.shure.com/en-US/products/microphones/sm7b?variant=SM7B
- 10. https://www.elgato.com/en/wave-mic-arm-lp
- 11. https://electronics.sony.com/imaging/interchangeable-lens-cameras/all-interchangeable-lens-cameras/p/ilce7c-b
- 12. https://electronics.sony.com/imaging/lenses/all-e-mount/p/sel35f14gm
- 13. https://www.amazon.com/dp/B08LV7GZVB?psc=1&ref=ppx_yo2ov_dt_b_product_details
- 14. https://audioengine.com/shop/wirelessspeakers/hd3-wireless-speakers/
- 15. https://www.chrbutler.com/2023-04-24
- 16. https://floydhome.com/products/the-floyd-table?variant=36527968321698
- 17. https://www.standupdeskstore.com/sliding-under-desk-pencil-drawer
- 18. https://www.cyberpowersystems.com/product/ups/pfc-sinewave/cp1500pfclcd/
- 19. https://www.ikea.com/gb/en/p/kornsjoe-side-table-black-70455412/
- 20. https://www.caldigit.com/thunderbolt-station-4/
- 21. https://www.amazon.com/dp/B0BBZT42HC?ref=ppx_yo2ov_dt_b_product_details&th=1
- 22. https://www.amazon.com/dp/B09QV692XY?ref=ppx_yo2ov_dt_b_product_details&th=1
- 23. https://www.amazon.com/dp/B08ZY48D8M?ref=ppx_yo2ov_dt_b_product_details&th=1
- 24. https://www.lacie.com/products/big/2big/
- 25. https://www.cloudmicrophones.com/cloudlifter-cl-1?gclid=CjwKCAjw_YShBhAiEiwAMomsENVjS7OaiiBgaZkiAqqDGiUd74Ln6BUrZxcpHovOibPqJUAtNN6weBoCzzkQAvD_BwE
- 26. https://focusrite.com/en/usb-audio-interface/scarlett/scarlett-2i2
- 27. https://www.minidisc.org/part_Sony_MXD-D40.html
- 28. https://www.cyberpowersystems.com/product/ups/pfc-sinewave/cp1500pfclcd/
- 29. https://www.thelibrarystore.com/product/cn66-02050/bookends
- 30. https://g.co/kgs/cfKCBZ
- 31. https://www.irisusainc.com/products/weathertight-storage-box-30-quart
- 32. https://www.etsy.com/listing/120787781/35-extra-deep-4-ft-floating-ledge-for
- 33. https://www.lowes.com/pd/Style-Selections-70-5-in-Black-Shelf-Upright/4640257
- 34. https://www.lowes.com/pd/Style-Selections-2-in-Shelf-Bracket/4640145
- 35. https://www.thelibrarystore.com/product/cn66-02050/bookends
- 36. https://g.co/kgs/cfKCBZ
- 37. https://www.irisusainc.com/products/weathertight-storage-box-30-quart
- 38. https://www.craftsman.com/collections/tradestack
- 39. https://viesso.com/products/dublexo-black-pin-sofa-bed?variant=42181265522844
- 40. https://www.stillmanandbirn.com/products_epsilon_hardbound.php
- 41. https://g.co/kgs/7ot9aS
- 42. https://www.post-it.com/3M/en_US/post-it/products/~/Post-it-Super-Sticky-Notes-3-in-x-3-in-Electric-Yellow-12-Pads-Pack-90-Sheets-Pad/?N=4327+3289961157+3294529207&rt=rud
- 43. https://www.tops-products.com/oxfordtm-blank-index-cards-white-3-x-5-100-per-pack-4.html
- 44. https://www.chrbutler.com/information
- 45. https://www.chrbutler.com/tagged/essays
- 46. https://www.chrbutler.com/2023-08-21
- 47. https://www.chrbutler.com/2023-07-19
- 48. https://dontthinkaboutthefuture.eo.page/8y4tg
- 49. http://chrbutler.com/feed.rss
- 50. https://www.chrbutler.com/impressum
+
+References:
+
+[1] https://www.chrbutler.com/
+[2] https://www.chrbutler.com/archives
+[3] https://www.chrbutler.com/information
+[4] https://www.chrbutler.com/now/2024-01-06
+[5] https://www.lg.com/us/monitors/lg-32un880-b-4k-uhd-led-monitor
+[6] https://www.ergotron.com/en-us/products/product-details/45-241#?color=black&attachment%20option=2-Piece%20Clamp
+[7] https://www.elgato.com/en/key-light
+[8] https://www.shure.com/en-US/products/microphones/sm7b?variant=SM7B
+[9] https://www.elgato.com/en/wave-mic-arm-lp
+[10] https://electronics.sony.com/imaging/interchangeable-lens-cameras/all-interchangeable-lens-cameras/p/ilce7c-b
+[11] https://electronics.sony.com/imaging/lenses/all-e-mount/p/sel35f14gm
+[12] https://www.amazon.com/dp/B08LV7GZVB?psc=1&ref=ppx_yo2ov_dt_b_product_details
+[13] https://audioengine.com/shop/wirelessspeakers/hd3-wireless-speakers/
+[14] https://www.chrbutler.com/2023-04-24
+[15] https://floydhome.com/products/the-floyd-table?variant=36527968321698
+[16] https://www.standupdeskstore.com/sliding-under-desk-pencil-drawer
+[17] https://www.cyberpowersystems.com/product/ups/pfc-sinewave/cp1500pfclcd/
+[18] https://www.ikea.com/gb/en/p/kornsjoe-side-table-black-70455412/
+[19] https://www.caldigit.com/thunderbolt-station-4/
+[20] https://www.amazon.com/dp/B0BBZT42HC?ref=ppx_yo2ov_dt_b_product_details&th=1
+[21] https://www.amazon.com/dp/B09QV692XY?ref=ppx_yo2ov_dt_b_product_details&th=1
+[22] https://www.amazon.com/dp/B08ZY48D8M?ref=ppx_yo2ov_dt_b_product_details&th=1
+[23] https://www.lacie.com/products/big/2big/
+[24] https://www.cloudmicrophones.com/cloudlifter-cl-1?gclid=CjwKCAjw_YShBhAiEiwAMomsENVjS7OaiiBgaZkiAqqDGiUd74Ln6BUrZxcpHovOibPqJUAtNN6weBoCzzkQAvD_BwE
+[25] https://focusrite.com/en/usb-audio-interface/scarlett/scarlett-2i2
+[26] https://www.minidisc.org/part_Sony_MXD-D40.html
+[27] https://www.cyberpowersystems.com/product/ups/pfc-sinewave/cp1500pfclcd/
+[28] https://www.thelibrarystore.com/product/cn66-02050/bookends
+[29] https://g.co/kgs/cfKCBZ
+[30] https://www.irisusainc.com/products/weathertight-storage-box-30-quart
+[31] https://www.etsy.com/listing/120787781/35-extra-deep-4-ft-floating-ledge-for
+[32] https://www.lowes.com/pd/Style-Selections-70-5-in-Black-Shelf-Upright/4640257
+[33] https://www.lowes.com/pd/Style-Selections-2-in-Shelf-Bracket/4640145
+[34] https://www.thelibrarystore.com/product/cn66-02050/bookends
+[35] https://g.co/kgs/cfKCBZ
+[36] https://www.irisusainc.com/products/weathertight-storage-box-30-quart
+[37] https://www.craftsman.com/collections/tradestack
+[38] https://viesso.com/products/dublexo-black-pin-sofa-bed?variant=42181265522844
+[39] https://www.stillmanandbirn.com/products_epsilon_hardbound.php
+[40] https://g.co/kgs/7ot9aS
+[41] https://www.post-it.com/3M/en_US/post-it/products/~/Post-it-Super-Sticky-Notes-3-in-x-3-in-Electric-Yellow-12-Pads-Pack-90-Sheets-Pad/?N=4327+3289961157+3294529207&rt=rud
+[42] https://www.tops-products.com/oxfordtm-blank-index-cards-white-3-x-5-100-per-pack-4.html
+[43] https://www.chrbutler.com/information
+[44] https://www.chrbutler.com/tagged/essays
+[45] https://www.chrbutler.com/2023-08-21
+[46] https://www.chrbutler.com/2023-07-19
+[47] https://dontthinkaboutthefuture.eo.page/8y4tg
+[48] http://chrbutler.com/feed.rss
+[49] https://www.chrbutler.com/impressum
diff --git a/static/archive/www-danstroot-com-wwjfi6.txt b/static/archive/www-danstroot-com-wwjfi6.txt
index 19f9b11..77d6d07 100644
--- a/static/archive/www-danstroot-com-wwjfi6.txt
+++ b/static/archive/www-danstroot-com-wwjfi6.txt
@@ -1,717 +1,661 @@
- #[1]Blog Posts RSS
-
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-55JC288
-
- [3]Dan Stroot
- [4]Home[5]About[6]Archive[7]Snippets[8]Uses[9]Quotes
-
- (BUTTON) Toggle Menu
+[1]Dan Stroot
+[2]Home[3]About[4]Archive[5]Snippets[6]Uses[7]Quotes
+[8]
+Toggle Menu
Making Software Last Forever
- Hero image for Making Software Last Forever
- 27 min read
- Dan Stroot
- Dan Stroot
- May 25, 2023
+Hero image for Making Software Last Forever
+27 min read
+[10]
+Dan Stroot
+Dan Stroot
+May 25, 2023
- How many of us have bought a new home because our prior home was not
- quite meeting our needs? Maybe we needed an extra bedroom, or wanted a
- bigger backyard? Now, as a thought experiment, assume you couldn't sell
- your existing home. If you bought a new home, you'd have to "retire" or
- "decommission" your prior home (and your investment in it). Does that
- change your thinking?
+How many of us have bought a new home because our prior home was not quite
+meeting our needs? Maybe we needed an extra bedroom, or wanted a bigger
+backyard? Now, as a thought experiment, assume you couldn't sell your existing
+home. If you bought a new home, you'd have to "retire" or "decommission" your
+prior home (and your investment in it). Does that change your thinking?
- Further, imagine you had a team of five people maintaining your prior
- home, improving it, and keeping it updated, for the last ten years.
- You'd have a cumulative investment of 50 person/years in your existing
- home (5 people x 10 years) just in maintenance, on top of the initial
- investment. If each person was paid the equivalent of a software
- developer (we'll use $200k to include benefits, office space,
- leadership, etc.) you'd have an investment just in labor of $10 million
- dollars (50 person/years x $200,000). Would you walk away from that
- investment?
+Further, imagine you had a team of five people maintaining your prior home,
+improving it, and keeping it updated, for the last ten years. You'd have a
+cumulative investment of 50 person/years in your existing home (5 people x 10
+years) just in maintenance, on top of the initial investment. If each person
+was paid the equivalent of a software developer (we'll use $200k to include
+benefits, office space, leadership, etc.) you'd have an investment just in
+labor of $10 million dollars (50 person/years x $200,000). Would you walk away
+from that investment?
- When companies decide to re-write or replace an existing software
- application, they are making a similar decision. Existing software is
- "retired" or "decommissioned" (along with its cumulative investment).
- Yet the belief that new code is always better than old is patently
- absurd. Old code has weathered and withstood the test of time. It has
- been battle-tested. You know it's failure modes. Bugs have been found,
- and more importantly, fixed.
+When companies decide to re-write or replace an existing software application,
+they are making a similar decision. Existing software is "retired" or
+"decommissioned" (along with its cumulative investment). Yet the belief that
+new code is always better than old is patently absurd. Old code has weathered
+and withstood the test of time. It has been battle-tested. You know it's
+failure modes. Bugs have been found, and more importantly, fixed.
- Joel Spolsky (of Fog Creek Software and Stack Overflow) describes
- system re-writes in "[10]Things You Should Never Do, Part I" as “the
- single worst strategic mistake that any software company can make.”
+Joel Spolsky (of Fog Creek Software and Stack Overflow) describes system
+re-writes in "[11]Things You Should Never Do, Part I" as “the single worst
+strategic mistake that any software company can make.”
- Continuing our home analogy, recent price increases for construction
- materials like lumber, drywall, and wiring (and frankly everything
- else) should, according to Economics 101, cause us to treat our current
- homes more dearly. Similarly, price increases for quality software
- engineers should force companies to treat existing software more
- dearly.
+Continuing our home analogy, recent price increases for construction materials
+like lumber, drywall, and wiring (and frankly everything else) should,
+according to Economics 101, cause us to treat our current homes more dearly.
+Similarly, price increases for quality software engineers should force
+companies to treat existing software more dearly.
- Lots of current software started out as C software from the 1980s.
- Engineers don't often write software with portability as a goal at the
- beginning, but once something is relatively portable, it tends to stay
- that way. Code that was well designed and written often migrated from
- mini-computers to i386, from i386 to amd64, and now ARM and arch64,
- with a minimum of redesign or effort. You can take large, complicated
- programs from the 1980s written in C, and compile/run them on a modern
- Linux computer - even when the modern computer is running architectures
- which hadn't even been dreamt of when the software was originally
- written.
+Lots of current software started out as C software from the 1980s. Engineers
+don't often write software with portability as a goal at the beginning, but
+once something is relatively portable, it tends to stay that way. Code that was
+well designed and written often migrated from mini-computers to i386, from i386
+to amd64, and now ARM and arch64, with a minimum of redesign or effort. You can
+take large, complicated programs from the 1980s written in C, and compile/run
+them on a modern Linux computer - even when the modern computer is running
+architectures which hadn't even been dreamt of when the software was originally
+written.
- Why can't software last forever? It's not made of wood, concrete, or
- steel. It doesn't "wear out", rot, weather, or rust. A working
- algorithm is a working algorithm. Technology doesn’t need to be
- beautiful, or impress other people, to be effective. Aren't
- technologists ultimately in the business of producing cost effective
- technology?
+Why can't software last forever? It's not made of wood, concrete, or steel. It
+doesn't "wear out", rot, weather, or rust. A working algorithm is a working
+algorithm. Technology doesn’t need to be beautiful, or impress other people, to
+be effective. Aren't technologists ultimately in the business of producing cost
+effective technology?
- I am going to attempt to convince you that maintaining your existing
- systems is one the most cost-effective technology investments you can
- make.
+I am going to attempt to convince you that maintaining your existing systems is
+one the most cost-effective technology investments you can make.
The World's Oldest Software Systems
- In 1958, the United States Department of Defense launched a new
- computer-based contract management system called "Mechanization of
- Contract Administration Services", or MOCAS (pronounced “MOH-cass”). In
- 2015, [11]MIT Technology Review stated that MOCAS was the oldest
- computer program in continuous use they could verify. At that time
- MOCAS managed about $1.3 trillion in government obligations and 340,000
- contracts.
+In 1958, the United States Department of Defense launched a new computer-based
+contract management system called "Mechanization of Contract Administration
+Services", or MOCAS (pronounced “MOH-cass”). In 2015, [12]MIT Technology Review
+stated that MOCAS was the oldest computer program in continuous use they could
+verify. At that time MOCAS managed about $1.3 trillion in government
+obligations and 340,000 contracts.
- According to the [12]Guinness Book of World Records, the oldest
- software system in use today is either the [13]SABRE Airline
- Reservation System (introduced in 1960), or the IRS Individual Master
- File (IMF) and Business Master File (BMF) systems introduced in
- 1962–63.
+According to the [13]Guinness Book of World Records, the oldest software system
+in use today is either the [14]SABRE Airline Reservation System (introduced in
+1960), or the IRS Individual Master File (IMF) and Business Master File (BMF)
+systems introduced in 1962–63.
- SABRE went online in 1960. It had cost $40 million to develop and
- install (about $400 million in 2022 dollars). The system took over all
- American Airlines booking functions in 1964, and the system was
- expanded to provide access to external travel agents in 1976.
+SABRE went online in 1960. It had cost $40 million to develop and install
+(about $400 million in 2022 dollars). The system took over all American
+Airlines booking functions in 1964, and the system was expanded to provide
+access to external travel agents in 1976.
- What is the secret to the long lifespan of these systems? Shouldn't
- companies with long-lived products (annuities, life insurance, etc.)
- study these examples? After all, they need systems to support products
- that last most of a human lifespan. However, shouldn't all companies
- want to their investments in software to last as long as possible?
+What is the secret to the long lifespan of these systems? Shouldn't companies
+with long-lived products (annuities, life insurance, etc.) study these
+examples? After all, they need systems to support products that last most of a
+human lifespan. However, shouldn't all companies want to their investments in
+software to last as long as possible?
Maintenance is About Making Something Last
- We spoke of SABRE above, and we know that airlines recognize the value
- of maintenance. Commercial aircraft are inspected at least once every
- two days. Engines, hydraulics, environmental, and electrical systems
- all have additional maintenance schedules. A "heavy" maintenance
- inspection occurs once every few years. This process maintains the
- aircraft's service life over decades.
+We spoke of SABRE above, and we know that airlines recognize the value of
+maintenance. Commercial aircraft are inspected at least once every two days.
+Engines, hydraulics, environmental, and electrical systems all have additional
+maintenance schedules. A "heavy" maintenance inspection occurs once every few
+years. This process maintains the aircraft's service life over decades.
- On average, an aircraft is operable for about 30 years before it must
- be retired. A Boeing 747 can endure 35,000 pressurization cycles —
- roughly 135,000 to 165,000 flight hours — before metal fatigue sets in.
- However, most older airframes are retired for fuel-efficiency reasons,
- not because they're worn out.
+On average, an aircraft is operable for about 30 years before it must be
+retired. A Boeing 747 can endure 35,000 pressurization cycles — roughly 135,000
+to 165,000 flight hours — before metal fatigue sets in. However, most older
+airframes are retired for fuel-efficiency reasons, not because they're worn
+out.
- Even stuctures made of grass can last indefinitely. [14]Inca rope
- bridges were simple suspension bridges constructed by the Inca Empire.
- The bridges were an integral part of the Inca road system were
- constructed using ichu grass.
+Even stuctures made of grass can last indefinitely. [15]Inca rope bridges were
+simple suspension bridges constructed by the Inca Empire. The bridges were an
+integral part of the Inca road system were constructed using ichu grass.
- Inca Rope Bridge
+Inca Rope Bridge
- Even though they were made of grass, these bridges were maintained with
- such regularity and attention they lasted centuries. The bridge's
- strength and reliability came from the fact that each cable was
- replaced every June.
+Even though they were made of grass, these bridges were maintained with such
+regularity and attention they lasted centuries. The bridge's strength and
+reliability came from the fact that each cable was replaced every June.
- The goal of maintenance is catching problems before they happen. That’s
- the difference between maintenance and repair. Repair is about fixing
- something that’s already broken. Maintenance is about making something
- last.
+The goal of maintenance is catching problems before they happen. That’s the
+difference between maintenance and repair. Repair is about fixing something
+that’s already broken. Maintenance is about making something last.
Unfortunately, Maintenance is Chronically Undervalued
- Maintenance is one of the easiest things to cut when budgets get tight.
- Some legacy software systems have decades of underinvestment in
- maintenance. This leads up to the inevitable "we have to replace it"
- discussion - which somehow always sounds more persuasive (even though
- it’s more expensive and riskier) than arguing to invest in system
- rehabilitation and deferred system maintenance.
+Maintenance is one of the easiest things to cut when budgets get tight. Some
+legacy software systems have decades of underinvestment in maintenance. This
+leads up to the inevitable "we have to replace it" discussion - which somehow
+always sounds more persuasive (even though it’s more expensive and riskier)
+than arguing to invest in system rehabilitation and deferred system
+maintenance.
- Executives generally can't refuse "repair" work because the system is
- broken and must be fixed. However, maintenance is a tougher sell. It’s
- not strictly necessary — or at least it doesn’t seem to be until things
- start falling apart. It is so easy to divert maintenance budget into a
- halo project that gets an executive noticed (and possibly promoted)
- before the long-term effects of underinvestment in maintenance become
- visible. Even worse, the executive is also admired for reducing the
- costs of maintenance and switching costs from "run" to "grow" - while
- they are torpedoing the company under the waterline.
+Executives generally can't refuse "repair" work because the system is broken
+and must be fixed. However, maintenance is a tougher sell. It’s not strictly
+necessary — or at least it doesn’t seem to be until things start falling apart.
+It is so easy to divert maintenance budget into a halo project that gets an
+executive noticed (and possibly promoted) before the long-term effects of
+underinvestment in maintenance become visible. Even worse, the executive is
+also admired for reducing the costs of maintenance and switching costs from
+"run" to "grow" - while they are torpedoing the company under the waterline.
- The other challenge is conflating enhancement work with maintenance
- work. Imagine you have $1,000 and you want to add a sunroof to your
- car, but you also need new tires (which coincidentally also cost
- $1,000). You have to replace the tires every so often, but a sunroof is
- "forever" right? If you spend the money on the sunroof the tires could
- get replaced next month, or maybe the month after - they'll last a
- couple more months, won't they?
+The other challenge is conflating enhancement work with maintenance work.
+Imagine you have $1,000 and you want to add a sunroof to your car, but you also
+need new tires (which coincidentally also cost $1,000). You have to replace the
+tires every so often, but a sunroof is "forever" right? If you spend the money
+on the sunroof the tires could get replaced next month, or maybe the month
+after - they'll last a couple more months, won't they?
- With software, users can't see "the bald tires" - they only thing they
- see, or experience (and value), are new features and capabilities.
- Pressure is always present to cut costs and to add new features. The
- result is budget always swings away from maintenance work towards
- enhancements.
+With software, users can't see "the bald tires" - they only thing they see, or
+experience (and value), are new features and capabilities. Pressure is always
+present to cut costs and to add new features. The result is budget always
+swings away from maintenance work towards enhancements.
- Finally, maintenance work is typically an operational cost, yet
- building a new system, or a significant new feature, can often be
- capitalized - making the future costs someone else's problem.
+Finally, maintenance work is typically an operational cost, yet building a new
+system, or a significant new feature, can often be capitalized - making the
+future costs someone else's problem.
Risks of Replacing Software Systems
- It's usually not the design or the age of a system that causes it to
- fail but rather neglect. People fail to maintain software systems
- because they are not given the time, incentives, or resources to
- maintain them.
+It's usually not the design or the age of a system that causes it to fail but
+rather neglect. People fail to maintain software systems because they are not
+given the time, incentives, or resources to maintain them.
- "Most of the systems I work on rescuing are not badly built. They
- are badly maintained."
- — Marianne Bellotti, Kill it With Fire
+ "Most of the systems I work on rescuing are not badly built. They are badly
+ maintained."
- Once a system degrades it is an enormous challenge to fund deferred
- maintenance (or "technical debt"). No one plans for it, no one wants to
- pay for it, and no engineer wants to do it. Initiatives to restore
- operational excellence, much the way one would fix up an old house,
- tend to have few volunteers among engineering teams. No one gets
- noticed doing maintenance. No one ever gets promoted because of
- maintenance.
+ — Marianne Bellotti, Kill it With Fire
- It should be clear why engineers prefer to re-write a system rather
- than maintain it. They get to "write a new story" rather than edit
- someone else's. They will attempt to convince a senior executive to
- fund a project to replace a problematic system by describing all the
- new features and capabilities that could be added as well as how "bad"
- the existing, unmaintained, system has become. Further, they will get
- to use modern technology that makes them much more valuable in the
- market.
+Once a system degrades it is an enormous challenge to fund deferred maintenance
+(or "technical debt"). No one plans for it, no one wants to pay for it, and no
+engineer wants to do it. Initiatives to restore operational excellence, much
+the way one would fix up an old house, tend to have few volunteers among
+engineering teams. No one gets noticed doing maintenance. No one ever gets
+promoted because of maintenance.
- Incentives aside, engineering teams tend to gravitate toward system
- rewrites because they incorrectly think of old systems as specs. They
- assume that since an old system works, the functional risks have been
- eliminated. They can focus on adding more features to the new system or
- make changes to the underlying architecture without worry. Either they
- do not perceive the ambiguity these changes introduce, or they see such
- ambiguity positively, imagining only gains in performance and the
- potential for innovation.
+It should be clear why engineers prefer to re-write a system rather than
+maintain it. They get to "write a new story" rather than edit someone else's.
+They will attempt to convince a senior executive to fund a project to replace a
+problematic system by describing all the new features and capabilities that
+could be added as well as how "bad" the existing, unmaintained, system has
+become. Further, they will get to use modern technology that makes them much
+more valuable in the market.
- Why not authorize that multimillion-dollar replacement if the engineers
- convince management the existing system is doomed? Eventually a
- "replacement" project will be funded (typically at a much higher
- expenditure than rehabilitating the existing system). Even if the
- executives are not listening to the engineers, they will be listening
- to external consultants telling them they are falling behind.
+Incentives aside, engineering teams tend to gravitate toward system rewrites
+because they incorrectly think of old systems as specs. They assume that since
+an old system works, the functional risks have been eliminated. They can focus
+on adding more features to the new system or make changes to the underlying
+architecture without worry. Either they do not perceive the ambiguity these
+changes introduce, or they see such ambiguity positively, imagining only gains
+in performance and the potential for innovation.
- What do you do with the old system while you’re building the new one?
- Most organizations put the old system on “life support” and give it
- only the resources for patches and fixes necessary to keep it running.
- This reduces maintenance even further and becomes a self-fulfilling
- prophecy that the existing system will eventually fail.
+Why not authorize that multimillion-dollar replacement if the engineers
+convince management the existing system is doomed? Eventually a "replacement"
+project will be funded (typically at a much higher expenditure than
+rehabilitating the existing system). Even if the executives are not listening
+to the engineers, they will be listening to external consultants telling them
+they are falling behind.
- Who gets to work on the new system, and who takes on the maintenance
- tasks of the old system? If the old system is written in older
- technology that the company is actively abandoning, the team
- maintaining the old system is essentially sitting around waiting to be
- fired. And don’t kid yourself, they know it. If the people maintaining
- the old system are not participating in the creation of the new system,
- you should expect that they are also looking for new jobs. If they
- leave before your new system is operational, you lose both their
- expertise and their institutional knowledge.
+What do you do with the old system while you’re building the new one? Most
+organizations put the old system on “life support” and give it only the
+resources for patches and fixes necessary to keep it running. This reduces
+maintenance even further and becomes a self-fulfilling prophecy that the
+existing system will eventually fail.
- If the new project falls behind schedule (and it almost certainly
- will), the existing system continues to degrade, and knowledge
- continues to walk out the door. If the new project fails and is
- subsequently canceled, the gap between the legacy system and
- operational excellence has widened significantly in the meantime.
+Who gets to work on the new system, and who takes on the maintenance tasks of
+the old system? If the old system is written in older technology that the
+company is actively abandoning, the team maintaining the old system is
+essentially sitting around waiting to be fired. And don’t kid yourself, they
+know it. If the people maintaining the old system are not participating in the
+creation of the new system, you should expect that they are also looking for
+new jobs. If they leave before your new system is operational, you lose both
+their expertise and their institutional knowledge.
- This explains why executives are loathe to cancel system replacement
- projects even when they are obviously years behind schedule and failing
- to live up to expectations. Stopping the replacement project seems
- impossible because the legacy system is now so degraded that restoring
- it to operational excellence seems impossible. Plus, politically
- canceling a marquee project can be career suicide for the sponsoring
- executive(s). Much better to do "deep dives" and "assessments" on why
- the project is failing and soldier on than cancel it.
+If the new project falls behind schedule (and it almost certainly will), the
+existing system continues to degrade, and knowledge continues to walk out the
+door. If the new project fails and is subsequently canceled, the gap between
+the legacy system and operational excellence has widened significantly in the
+meantime.
- The interim state is not pretty. The company now has two systems to
- operate, much higher costs and new risks.
- * The new system will have high costs, limited functionality, new and
- unique errors/issues, and lower volumes (so the "per unit cost" of
- the new system will be quite high).
- * The older system will still be running most of the business, and
- usually all of the complex business, while having lost its best
- engineers and subject matter experts. Its maintenance budget will
- have been whittled down to nothing to redirect spending to
- implement (save?) the new system. This system will be in grave
- danger to significant system failure (which proponents of the new
- system will use to justify the investment in the new system, not
- admitting to a self-fulfilling prophecy).
+This explains why executives are loathe to cancel system replacement projects
+even when they are obviously years behind schedule and failing to live up to
+expectations. Stopping the replacement project seems impossible because the
+legacy system is now so degraded that restoring it to operational excellence
+seems impossible. Plus, politically canceling a marquee project can be career
+suicide for the sponsoring executive(s). Much better to do "deep dives" and
+"assessments" on why the project is failing and soldier on than cancel it.
- Neither system will exhibit operational excellence, and both put the
- organization at significant risk in addition to the higher costs and
- complexity of running two systems.
+The interim state is not pretty. The company now has two systems to operate,
+much higher costs and new risks.
+
+ • The new system will have high costs, limited functionality, new and unique
+ errors/issues, and lower volumes (so the "per unit cost" of the new system
+ will be quite high).
+ • The older system will still be running most of the business, and usually
+ all of the complex business, while having lost its best engineers and
+ subject matter experts. Its maintenance budget will have been whittled down
+ to nothing to redirect spending to implement (save?) the new system. This
+ system will be in grave danger to significant system failure (which
+ proponents of the new system will use to justify the investment in the new
+ system, not admitting to a self-fulfilling prophecy).
+
+Neither system will exhibit operational excellence, and both put the
+organization at significant risk in addition to the higher costs and complexity
+of running two systems.
Maintaining Software to Last Forever
- As I discussed in [15]How Software Learns, software adapts over time -
- as it is continually refined and reshaped by maintenance and
- enhancements. Maintenance is crucial to software's lifespan and
- business relevance/value. When software systems are first developed,
- they are based on a prediction of the future - a prediction of the
- future that we know is wrong even as we make it. No set of requirements
- have ever been perfect. However, all new systems become "less wrong" as
- time, experience, and knowledge are continually added (e.g.,
- maintenance).
+As I discussed in [16]How Software Learns, software adapts over time - as it is
+continually refined and reshaped by maintenance and enhancements. Maintenance
+is crucial to software's lifespan and business relevance/value. When software
+systems are first developed, they are based on a prediction of the future - a
+prediction of the future that we know is wrong even as we make it. No set of
+requirements have ever been perfect. However, all new systems become "less
+wrong" as time, experience, and knowledge are continually added (e.g.,
+maintenance).
- Futureproofing means constantly rethinking and iterating on the
- existing system. We know from both research and experience that
- iterating and maintaining existing solutions is a much more likely, and
- less expensive, way to improve software's lifespan and functionality.
+Futureproofing means constantly rethinking and iterating on the existing
+system. We know from both research and experience that iterating and
+maintaining existing solutions is a much more likely, and less expensive, way
+to improve software's lifespan and functionality.
- Before choosing to replace a system that needs deferred maintenance
- remember it’s the lack of maintenance that create the impression that
- failure is inevitable, and pushes otherwise rational engineers and
- executives toward rewrites or replacements. What mechanisms will
- prevent lack of maintenance from eventually dooming the brand-new
- system? Has the true root problem been addressed?
+Before choosing to replace a system that needs deferred maintenance remember
+it’s the lack of maintenance that create the impression that failure is
+inevitable, and pushes otherwise rational engineers and executives toward
+rewrites or replacements. What mechanisms will prevent lack of maintenance from
+eventually dooming the brand-new system? Has the true root problem been
+addressed?
- Robust maintenance practices could preserve software for decades, but
- first maintenance must be valued, funded, and applied. To maintain
- software properly we have to consider:
- 1. How do you measure the overall health of a system?
- 2. How do you define and manage maintenance work?
- 3. How do you define a reasonable maintenance budget? How can you
- protect that budget?
- 4. How do you motivate engineers to perform maintenance?
+Robust maintenance practices could preserve software for decades, but first
+maintenance must be valued, funded, and applied. To maintain software properly
+we have to consider:
+
+ 1. How do you measure the overall health of a system?
+ 2. How do you define and manage maintenance work?
+ 3. How do you define a reasonable maintenance budget? How can you protect that
+ budget?
+ 4. How do you motivate engineers to perform maintenance?
1. How do you measure the overall health of a system?
Objective measures
- 1. Maintenance Backlog — If you added up all the open work requests,
- including work the software engineers deem necessary to eliminate
- technical debt, what is the total amount of effort? Now, divide
- that by the team capacity. For example, imagine you have a total
- amount of work of 560 days, and you have one person assigned to
- support the system - they work approximately 200 days annually. The
- backlog in days in 560, but in time it is 2.8 years (560 days / 200
- days/year = 2.8 years). What is a reasonable amount of backlog
- time?
- 2. System Reliability/Downtime — If you added up all the time the
- system is down in a given period, what is the total amount? What is
- the user or customer impact of that downtime? Conversely, what
- would reducing that downtime be worth? What is the relationship of
- maintenance and downtime? In other words, does the system need to
- be taken down to maintain it (planned maintenance)? Does planned
- maintenance reduce unplanned downtime?
- 3. Capacity/Performance Constraints — Is the existing hitting capacity
- constraints that will prevent future growth of the business? How
- unpredictable are the system capacity demands? What is the customer
- experience when the system capacity is breached? What is
- relationship between hardware and software that constrains the
- system? Is the software performant? Can hardware solve the problem?
+ 1. Maintenance Backlog — If you added up all the open work requests, including
+ work the software engineers deem necessary to eliminate technical debt,
+ what is the total amount of effort? Now, divide that by the team capacity.
+ For example, imagine you have a total amount of work of 560 days, and you
+ have one person assigned to support the system - they work approximately
+ 200 days annually. The backlog in days in 560, but in time it is 2.8 years
+ (560 days / 200 days/year = 2.8 years). What is a reasonable amount of
+ backlog time?
+
+ 2. System Reliability/Downtime — If you added up all the time the system is
+ down in a given period, what is the total amount? What is the user or
+ customer impact of that downtime? Conversely, what would reducing that
+ downtime be worth? What is the relationship of maintenance and downtime? In
+ other words, does the system need to be taken down to maintain it (planned
+ maintenance)? Does planned maintenance reduce unplanned downtime?
+
+ 3. Capacity/Performance Constraints — Is the existing hitting capacity
+ constraints that will prevent future growth of the business? How
+ unpredictable are the system capacity demands? What is the customer
+ experience when the system capacity is breached? What is relationship
+ between hardware and software that constrains the system? Is the software
+ performant? Can hardware solve the problem?
Subjective measures
- 1. User Satisfaction: User satisfaction includes both how happy your
- employees are with the applications and/or how well those
- applications meet your customer's needs. Many times I have found
- the technology team and the business users arguing over "bug" vs.
- "enhancement". It is a way of assigning blame. "Bug" means its
- engineering's fault, "enhancement" means it was a missed
- requirement. When emotions run hot it means that the maintenance
- budget is insufficient. I always tell everyone they are both just
- maintenance and the only important decision is which to prioritize
- and fix first.
- 2. “Shadow IT” — If you used applications in the past that didn’t meet
- employees’ needs, and didn’t have a good governance plan to address
- problems, you may have noticed employees found other solutions on
- their own. This is an indication of underfunded maintenance.
- 3. Adaptable Architecture — "The cloud", API-based integration, and
- unlocking your data are no longer “nice to haves.” Your
- architecture needs to adapt. If these are challenges, then the
- architecture must be addressed.
- 4. Governance — Healthy application architecture isn’t just about
- technology—it’s also about having well-documented and
- well-understood governance documents that guide technology
- investments for your organization. Good governance helps create
- adaptable architecture and avoid “shadow IT” applications.
+ 1. User Satisfaction: User satisfaction includes both how happy your employees
+ are with the applications and/or how well those applications meet your
+ customer's needs. Many times I have found the technology team and the
+ business users arguing over "bug" vs. "enhancement". It is a way of
+ assigning blame. "Bug" means its engineering's fault, "enhancement" means
+ it was a missed requirement. When emotions run hot it means that the
+ maintenance budget is insufficient. I always tell everyone they are both
+ just maintenance and the only important decision is which to prioritize and
+ fix first.
+
+ 2. “Shadow IT” — If you used applications in the past that didn’t meet
+ employees’ needs, and didn’t have a good governance plan to address
+ problems, you may have noticed employees found other solutions on their
+ own. This is an indication of underfunded maintenance.
+
+ 3. Adaptable Architecture — "The cloud", API-based integration, and unlocking
+ your data are no longer “nice to haves.” Your architecture needs to adapt.
+ If these are challenges, then the architecture must be addressed.
+
+ 4. Governance — Healthy application architecture isn’t just about
+ technology—it’s also about having well-documented and well-understood
+ governance documents that guide technology investments for your
+ organization. Good governance helps create adaptable architecture and avoid
+ “shadow IT” applications.
2. How do you define maintenance work?
- There are four general types of software maintenance. The first two
- types take up the majority of most organizations' maintenance budget,
- and may not even be considered maintenance - however, all four types
- must be funded adequately for software to remain healthy. If you can't
- fully address types three and four your maintenance budget is
- inadequate.
+There are four general types of software maintenance. The first two types take
+up the majority of most organizations' maintenance budget, and may not even be
+considered maintenance - however, all four types must be funded adequately for
+software to remain healthy. If you can't fully address types three and four
+your maintenance budget is inadequate.
1. Corrective Software Maintenance (more accurately called "repair")
- Corrective software maintenance is necessary when something goes wrong
- in a piece of software including faults and errors. These can have a
- widespread impact on the functionality of the software in general and
- therefore must be addressed as quickly as possible. However, it is
- important to consider repair work separate from the other types of
- maintenance because repair work must get done. Note: this is generally
- the only type of work that happens when a system is put on "life
- support".
+Corrective software maintenance is necessary when something goes wrong in a
+piece of software including faults and errors. These can have a widespread
+impact on the functionality of the software in general and therefore must be
+addressed as quickly as possible. However, it is important to consider repair
+work separate from the other types of maintenance because repair work must get
+done. Note: this is generally the only type of work that happens when a system
+is put on "life support".
2. Perfective Software Maintenance (more accurately called "enhancements")
- Once software is released and is being used new issues and ideas come
- to the surface. Users will think up new features or requirements that
- they would like to see. Perfective software maintenance aims to adjust
- software by adding new features as necessary (and removing features
- that are irrelevant or not effective). This process keeps software
- relevant as the market, and user needs, evolve. It there is funding
- beyond "life support" it usually is spent here.
+Once software is released and is being used new issues and ideas come to the
+surface. Users will think up new features or requirements that they would like
+to see. Perfective software maintenance aims to adjust software by adding new
+features as necessary (and removing features that are irrelevant or not
+effective). This process keeps software relevant as the market, and user needs,
+evolve. It there is funding beyond "life support" it usually is spent here.
3. Preventative Software Maintenance (true maintenance is catching problems
before they happen.)
- Preventative software maintenance is looking into the future so that
- your software can keep working as desired for as long as possible. This
- includes making necessary changes, upgrades, and adaptations.
- Preventative software maintenance may address small issues which at the
- given time may lack significance but may turn into larger problems in
- the future. These are called latent faults which need to be detected
- and corrected to make sure that they won’t turn into effective faults.
- This type of maintenance is generally underfunded.
+Preventative software maintenance is looking into the future so that your
+software can keep working as desired for as long as possible. This includes
+making necessary changes, upgrades, and adaptations. Preventative software
+maintenance may address small issues which at the given time may lack
+significance but may turn into larger problems in the future. These are called
+latent faults which need to be detected and corrected to make sure that they
+won’t turn into effective faults. This type of maintenance is generally
+underfunded.
4. Adaptive Software Maintenance (true maintenance adapts to changes)
- Adaptive software maintenance is responding to the changing technology
- landscape, as well as new company policies and rules regarding your
- software. These include operating system changes, using cloud
- technology, security policies, hardware changes, etc. When these
- changes are performed, your software (and possibly architecture) must
- adapt to properly meet new requirements and meet current security and
- other policies.
+Adaptive software maintenance is responding to the changing technology
+landscape, as well as new company policies and rules regarding your software.
+These include operating system changes, using cloud technology, security
+policies, hardware changes, etc. When these changes are performed, your
+software (and possibly architecture) must adapt to properly meet new
+requirements and meet current security and other policies.
-3. How do you define a reasonable maintenance budget? How can you protect
-that budget?
+3. How do you define a reasonable maintenance budget? How can you protect that
+budget?
- In the case of the Inca rope bridges what was the cost of maintenance
- annually? Let's assume some of the build work was site preparation and
- building the stone anchors on each side, but most of the work was
- constructing the bridge itself. Since the bridge was entirely replaced
- each year, the maintenance costs could be as much as 80% of the initial
- build effort, every year.
+In the case of the Inca rope bridges what was the cost of maintenance annually?
+Let's assume some of the build work was site preparation and building the stone
+anchors on each side, but most of the work was constructing the bridge itself.
+Since the bridge was entirely replaced each year, the maintenance costs could
+be as much as 80% of the initial build effort, every year.
- Comparing to "software as a service" (SaaS) vendors is difficult
- because they have shifted to a subscription model that bundles
- infrastructure, enhancements, and ongoing maintenance. Prior to SaaS
- subscription-based pricing one would typically buy a perpetual license
- plus maintenance at ~20-30% annual cost of the license to obtain
- support and updates.
+Comparing to "software as a service" (SaaS) vendors is difficult because they
+have shifted to a subscription model that bundles infrastructure, enhancements,
+and ongoing maintenance. Prior to SaaS subscription-based pricing one would
+typically buy a perpetual license plus maintenance at ~20-30% annual cost of
+the license to obtain support and updates.
- Side note: Now that the SaaS annual costs are commingled, some
- enterprises fall into the trap that “building it is cheaper because we
- pay up front but then it will cost less in the long run” assuming the
- "long run" almost always underprices infrastructure and assumes near
- zero maintenance cost. In the case of a brand-new, internally designed
- and developed software system - one that is well architected, well
- designed, well built, and meets all reliability, scalability, and
- performance needs (i.e., fantasy software) it's conceivable that there
- is no maintenance necessary for some period of time - but very
- unlikely.
+Side note: Now that the SaaS annual costs are commingled, some enterprises fall
+into the trap that “building it is cheaper because we pay up front but then it
+will cost less in the long run” assuming the "long run" almost always
+underprices infrastructure and assumes near zero maintenance cost. In the case
+of a brand-new, internally designed and developed software system - one that is
+well architected, well designed, well built, and meets all reliability,
+scalability, and performance needs (i.e., fantasy software) it's conceivable
+that there is no maintenance necessary for some period of time - but very
+unlikely.
- So, maintenance costs can have a very wide range. A general rule of
- thumb is 20-30% of the initial build cost will be required for ongoing
- maintenance work annually. However, maintenance costs usually start off
- lower and increase over time. They are also unpredictable costs that
- are hard to budget.
+So, maintenance costs can have a very wide range. A general rule of thumb is
+20-30% of the initial build cost will be required for ongoing maintenance work
+annually. However, maintenance costs usually start off lower and increase over
+time. They are also unpredictable costs that are hard to budget.
- The challenges should be obvious. First, budgets in large organizations
- tend be last year's budget plus 2-3%. If you start with a maintenance
- budget of zero on a new system, how do you ever get to the point of a
- healthy maintenance budget in the future? Second, maintenance costs are
- unpredictable, and organizations hate unpredictable costs. It's
- impossible to say when the next new hardware, or storage, or
- programming construct will occur, or when the existing system will hit
- a performance or scalability inflection point.
+The challenges should be obvious. First, budgets in large organizations tend be
+last year's budget plus 2-3%. If you start with a maintenance budget of zero on
+a new system, how do you ever get to the point of a healthy maintenance budget
+in the future? Second, maintenance costs are unpredictable, and organizations
+hate unpredictable costs. It's impossible to say when the next new hardware, or
+storage, or programming construct will occur, or when the existing system will
+hit a performance or scalability inflection point.
- This is like buying a brand-new car. The maintenance costs are
- negligible in the first couple years, until they start to creep up.
- Then things start to need maintenance, replacement, or repair. As the
- car ages the maintenance costs continue to increase until at some point
- it makes economic sense to buy another new car. Except none of us wait
- that long. Most of us buy new cars before our old one is completely
- worn out. As a counter-example, in Cuba some cars have been maintained
- meticulously for 30-40 years and run better than new.
+This is like buying a brand-new car. The maintenance costs are negligible in
+the first couple years, until they start to creep up. Then things start to need
+maintenance, replacement, or repair. As the car ages the maintenance costs
+continue to increase until at some point it makes economic sense to buy another
+new car. Except none of us wait that long. Most of us buy new cars before our
+old one is completely worn out. As a counter-example, in Cuba some cars have
+been maintained meticulously for 30-40 years and run better than new.
Protecting your maintenance budget - creating a "maintenance fund"
- We know that maintenance cost increase over time, and the costs of
- proper maintenance are unpredictable. In addition, there is some amount
- of management discretion that can be applied. When your house needs a
- new roof it's reasonable to defer it through summer, but it probably
- needs to be done before winter.
+We know that maintenance cost increase over time, and the costs of proper
+maintenance are unpredictable. In addition, there is some amount of management
+discretion that can be applied. When your house needs a new roof it's
+reasonable to defer it through summer, but it probably needs to be done before
+winter.
- Since business require predictability of costs, unpredictable
- maintenance costs are easy to defer. "We didn't budget for that; we'll
- have to put it in next year's budget." Except of course in the budget
- process it will compete with other projects and enhancement work, where
- it's again likely to be deprioritized.
+Since business require predictability of costs, unpredictable maintenance costs
+are easy to defer. "We didn't budget for that; we'll have to put it in next
+year's budget." Except of course in the budget process it will compete with
+other projects and enhancement work, where it's again likely to be
+deprioritized.
- What's the solution? Could it be possible to create some type of
- maintenance fund where a predictable amount is budgeted each year, and
- then spent "unpredictably" when/as needed? Could this also be a
- solution to preventing executives from diverting maintenance budget
- into pet projects by protecting this maintenance fund in some fashion?
+What's the solution? Could it be possible to create some type of maintenance
+fund where a predictable amount is budgeted each year, and then spent
+"unpredictably" when/as needed? Could this also be a solution to preventing
+executives from diverting maintenance budget into pet projects by protecting
+this maintenance fund in some fashion?
4. How do you motivate software engineers to perform maintenance?
- There is a Chinese proverb about a discussion between a king and a
- famous doctor. The well-known doctor explains to the king that his
- brother (who is also a doctor) is superior at medicine, but he is
- unknown because he always successfully treats small illnesses,
- preventing them from evolving into more serious or terminal ones. So,
- people say "Oh he is a fine doctor, but he only treats minor
- illnesses". It's true: [16]Nobody Ever Gets Credit for Fixing Problems
- that Never Happened.
+There is a Chinese proverb about a discussion between a king and a famous
+doctor. The well-known doctor explains to the king that his brother (who is
+also a doctor) is superior at medicine, but he is unknown because he always
+successfully treats small illnesses, preventing them from evolving into more
+serious or terminal ones. So, people say "Oh he is a fine doctor, but he only
+treats minor illnesses". It's true: [17]Nobody Ever Gets Credit for Fixing
+Problems that Never Happened.
- To most software engineers, legacy systems seem like torturous dead-end
- work, but the reality is systems that are not important get turned off.
- Working on "estate" systems means working on some of the most critical
- systems that exist — computers that govern millions of people’s lives
- in enumerable ways. This is not the work of technical janitors, but
- battlefield surgeons.
+To most software engineers, legacy systems seem like torturous dead-end work,
+but the reality is systems that are not important get turned off. Working on
+"estate" systems means working on some of the most critical systems that exist
+— computers that govern millions of people’s lives in enumerable ways. This is
+not the work of technical janitors, but battlefield surgeons.
- Engineering loves new technology. It gains the engineers attention and
- industry marketability. [17]Boring technology on the other hand is
- great for the company. The engineering cost is lower, and the skills
- are easier to obtain and keep, because these engineers are not being
- pulled out of your organization for double their salary by Amazon or
- Google.
+Engineering loves new technology. It gains the engineers attention and industry
+marketability. [18]Boring technology on the other hand is great for the company
+. The engineering cost is lower, and the skills are easier to obtain and keep,
+because these engineers are not being pulled out of your organization for
+double their salary by Amazon or Google.
- Well-designed, high-functioning software that is easy to understand
- usually blends in. Simple solutions do not do much to enhance one’s
- personal brand. Therefore, when an organization provides limited
- pathways to promotion for software engineers, they tend to make
- technical decisions that emphasize their individual contribution and
- technical prowess. You have to be very careful to reward what you want
- from your engineering team.
+Well-designed, high-functioning software that is easy to understand usually
+blends in. Simple solutions do not do much to enhance one’s personal brand.
+Therefore, when an organization provides limited pathways to promotion for
+software engineers, they tend to make technical decisions that emphasize their
+individual contribution and technical prowess. You have to be very careful to
+reward what you want from your engineering team.
- What earns them the acknowledgment of their peers? What gets people
- seen is what they will ultimately prioritize, even if those behaviors
- are in open conflict with the official direction they receive from
- management. In most organizations shipping new code gets attention,
- while technical debt accrues silently in the background.
+What earns them the acknowledgment of their peers? What gets people seen is
+what they will ultimately prioritize, even if those behaviors are in open
+conflict with the official direction they receive from management. In most
+organizations shipping new code gets attention, while technical debt accrues
+silently in the background.
- The specific form of acknowledgment also matters a lot. Positive
- reinforcement in the form of social recognition tends to be a more
- effective motivator than the traditional incentive structure of
- promotions, raises, and bonuses. Behavioral economist Dan Ariely
- attributes this to the difference between social markets and
- traditional monetary-based markets. Social markets are governed by
- social norms (read: peer pressure and social capital), and they often
- inspire people to work harder and longer than much more expensive
- incentives that represent the traditional work-for-pay exchange. In
- other words, people will work really hard for positive reinforcement
- from their peers.
+The specific form of acknowledgment also matters a lot. Positive reinforcement
+in the form of social recognition tends to be a more effective motivator than
+the traditional incentive structure of promotions, raises, and bonuses.
+Behavioral economist Dan Ariely attributes this to the difference between
+social markets and traditional monetary-based markets. Social markets are
+governed by social norms (read: peer pressure and social capital), and they
+often inspire people to work harder and longer than much more expensive
+incentives that represent the traditional work-for-pay exchange. In other
+words, people will work really hard for positive reinforcement from their peers
+.
Legacy System Modernization
- Unmaintained software will certainly die at some point. Due to factors
- discussed above, software does not always receive the proper amount of
- maintenance to remain healthy. Eventually a larger modernization effort
- may become necessary to restore a system to operational and functional
- excellence.
+Unmaintained software will certainly die at some point. Due to factors
+discussed above, software does not always receive the proper amount of
+maintenance to remain healthy. Eventually a larger modernization effort may
+become necessary to restore a system to operational and functional excellence.
- Legacy modernization projects start off feeling easy. The organization
- once had a reliable working system and kept it running for years. All
- the modernizing team should need to do is simply reshape it using
- better technology, better architecture, the benefit of hindsight, and
- improved tooling. It should be simple. But, because people do not see
- the hidden technical challenges they are about to uncover, they also
- assume the work will be boring. There’s little glory to be had
- re-implementing a solved problem.
+Legacy modernization projects start off feeling easy. The organization once had
+a reliable working system and kept it running for years. All the modernizing
+team should need to do is simply reshape it using better technology, better
+architecture, the benefit of hindsight, and improved tooling. It should be
+simple. But, because people do not see the hidden technical challenges they are
+about to uncover, they also assume the work will be boring. There’s little
+glory to be had re-implementing a solved problem.
- Modernization projects are also typically the ones organizations just
- want to get out of the way, so they launch into them unprepared for the
- time and resource commitments they require. Modernization projects take
- months, if not years of work. Keeping a team of engineers focused,
- inspired, and motivated from beginning to end is difficult. Keeping
- their senior leadership prepared to invest in what is, in effect,
- something they already have is a huge challenge. Creating momentum and
- sustaining it are where most modernization projects fail.
+Modernization projects are also typically the ones organizations just want to
+get out of the way, so they launch into them unprepared for the time and
+resource commitments they require. Modernization projects take months, if not
+years of work. Keeping a team of engineers focused, inspired, and motivated
+from beginning to end is difficult. Keeping their senior leadership prepared to
+invest in what is, in effect, something they already have is a huge challenge.
+Creating momentum and sustaining it are where most modernization projects fail.
- The hard part about legacy modernization is the "system around the
- system". The organization, its communication structures, its politics,
- and its incentives are all intertwined with the technical product in
- such a way that to improve the product, you must do it by turning the
- gears of this other, complex, undocumented system. Pay attention to
- politics and culture. Technology is at most only 50% of the legacy
- problem, ways of working, organization structure and
- leadership/sponsorship are just as important to success.
+The hard part about legacy modernization is the "system around the system". The
+organization, its communication structures, its politics, and its incentives
+are all intertwined with the technical product in such a way that to improve
+the product, you must do it by turning the gears of this other, complex,
+undocumented system. Pay attention to politics and culture. Technology is at
+most only 50% of the legacy problem, ways of working, organization structure
+and leadership/sponsorship are just as important to success.
- To do this, you need to overcome people’s natural skepticism and get
- them to buy in. The important word in the phrase "proof of concept" is
- proof. You need to prove to people that success is possible and worth
- doing. It can't be just an MVP, because [18]MVPs are dangerous.. A red
- flag is raised when companies talk about the phases of their
- modernization plans in terms of which technologies they are going to
- use rather than what value they will add.
+To do this, you need to overcome people’s natural skepticism and get them to
+buy in. The important word in the phrase "proof of concept" is proof. You need
+to prove to people that success is possible and worth doing. It can't be just
+an MVP, because [19]MVPs are dangerous.. A red flag is raised when companies
+talk about the phases of their modernization plans in terms of which
+technologies they are going to use rather than what value they will add.
- For all that people talk about COBOL dying off, it is good at certain
- tasks. The problem with most old COBOL systems is that they were
- designed at a time when COBOL was the only option. Start by sorting
- which parts of the system are in COBOL because COBOL is good at
- performing that task, and which parts are in COBOL because there were
- no other technologies available. Once you have that mapping, start by
- pulling the latter off into separate services that are written and
- designed using the technology we would choose for that task today.
+For all that people talk about COBOL dying off, it is good at certain tasks.
+The problem with most old COBOL systems is that they were designed at a time
+when COBOL was the only option. Start by sorting which parts of the system are
+in COBOL because COBOL is good at performing that task, and which parts are in
+COBOL because there were no other technologies available. Once you have that
+mapping, start by pulling the latter off into separate services that are
+written and designed using the technology we would choose for that task today.
- Going through the exercise of understanding what functionality is fit
- for use for specific languages/technologies not only gives engineers a
- way to keep building their skillsets but also is an opportunity to pair
- with other engineers who have different/complimentary skills. This
- exchange also has the benefit of diffusing the understanding of the
- system to a broader group of people without needing to solely rely on
- documentation (which never exists).
+Going through the exercise of understanding what functionality is fit for use
+for specific languages/technologies not only gives engineers a way to keep
+building their skillsets but also is an opportunity to pair with other
+engineers who have different/complimentary skills. This exchange also has the
+benefit of diffusing the understanding of the system to a broader group of
+people without needing to solely rely on documentation (which never exists).
- Counterintuitively, SLAs/SLOs are valuable because they provide a
- "failure budget". When organizations stop aiming for perfection and
- accept that all systems will occasionally fail, they stop letting their
- technology rot for fear of change. In most cases, mean time to recovery
- (MTTR) is a more useful statistic to push than reliability. MTTR tracks
- how long it takes the organization to recover from failure. Resilience
- in engineering is all about recovering stronger from failure. That
- means better monitoring, better documentation, and better processes for
- restoring services, but you can’t improve any of that if you don’t
- occasionally fail.
+Counterintuitively, SLAs/SLOs are valuable because they provide a "failure
+budget". When organizations stop aiming for perfection and accept that all
+systems will occasionally fail, they stop letting their technology rot for fear
+of change. In most cases, mean time to recovery (MTTR) is a more useful
+statistic to push than reliability. MTTR tracks how long it takes the
+organization to recover from failure. Resilience in engineering is all about
+recovering stronger from failure. That means better monitoring, better
+documentation, and better processes for restoring services, but you can’t
+improve any of that if you don’t occasionally fail.
- Although a system that constantly breaks, or that breaks in unexpected
- ways without warning, will lose its users’ trust, the reverse isn’t
- necessarily true. A system that never breaks doesn’t necessarily
- inspire high degrees of trust - and its maintenance budget is even
- easier to cut.
+Although a system that constantly breaks, or that breaks in unexpected ways
+without warning, will lose its users’ trust, the reverse isn’t necessarily
+true. A system that never breaks doesn’t necessarily inspire high degrees of
+trust - and its maintenance budget is even easier to cut.
- People take systems that are too reliable for granted. Italian
- researchers Cristiano Castelfranchi and Rino Falcone have been
- advancing a general model of trust that postulates trust naturally
- degrades over time, regardless of whether any action has been taken to
- violate that trust. Under Castelfranchi and Falcone’s model,
- maintaining trust doesn’t mean establishing a perfect record; it means
- continuing to rack up observations of resilience. If a piece of
- technology is so reliable it has been completely forgotten, it is not
- creating those regular observations. Through no fault of the
- technology, the user’s trust in it slowly deteriorates.
+People take systems that are too reliable for granted. Italian researchers
+Cristiano Castelfranchi and Rino Falcone have been advancing a general model of
+trust that postulates trust naturally degrades over time, regardless of whether
+any action has been taken to violate that trust. Under Castelfranchi and
+Falcone’s model, maintaining trust doesn’t mean establishing a perfect record;
+it means continuing to rack up observations of resilience. If a piece of
+technology is so reliable it has been completely forgotten, it is not creating
+those regular observations. Through no fault of the technology, the user’s
+trust in it slowly deteriorates.
- When both observability and testing are lacking on your legacy system,
- observability comes first. Tests tell you only what shouldn’t fail;
- monitoring tells you what is failing. Don’t forget: a perfect record
- will always be broken, but resilience is an accomplishment that lasts.
- Modern engineering teams use stats like service level objectives, error
- budgets, and mean time to recovery to move the emphasis away from
- avoiding failure and toward recovering quickly.
+When both observability and testing are lacking on your legacy system,
+observability comes first. Tests tell you only what shouldn’t fail; monitoring
+tells you what is failing. Don’t forget: a perfect record will always be
+broken, but resilience is an accomplishment that lasts. Modern engineering
+teams use stats like service level objectives, error budgets, and mean time to
+recovery to move the emphasis away from avoiding failure and toward recovering
+quickly.
Summary
- Maintenance mostly happens out of sight, mysteriously. If we notice it,
- it’s a nuisance. When road crews block off sections of highway to fix
- cracks or potholes, we treat it as an obstruction, not a vital and
- necessary process. This is especially true in the public sector: it’s
- almost impossible to get governmental action on, or voter interest in,
- spending on preventive maintenance, yet governments make seemly
- unlimited funds available once we have a disaster. We are okay spending
- a massive amount of money to fix a problem, but consistently resist
- spending a much smaller amount of money to prevent it; as a business
- strategy this makes no sense.
+Maintenance mostly happens out of sight, mysteriously. If we notice it, it’s a
+nuisance. When road crews block off sections of highway to fix cracks or
+potholes, we treat it as an obstruction, not a vital and necessary process.
+This is especially true in the public sector: it’s almost impossible to get
+governmental action on, or voter interest in, spending on preventive
+maintenance, yet governments make seemly unlimited funds available once we have
+a disaster. We are okay spending a massive amount of money to fix a problem,
+but consistently resist spending a much smaller amount of money to prevent it;
+as a business strategy this makes no sense.
- The [19]Open Mainframe Project estimates that there about 250 billion
- lines of COBOL code running today in the world economy, and nearly all
- COBOL code contains critical business logic. Companies should maintain
- that software and make it last as long as possible.
+The [20]Open Mainframe Project estimates that there about 250 billion lines of
+COBOL code running today in the world economy, and nearly all COBOL code
+contains critical business logic. Companies should maintain that software and
+make it last as long as possible.
References
- * [20]Things You Should Never Do, Part I
- * [21]Patterns of Legacy Displacement
- * [22]Kill It with Fire: Manage Aging Computer Systems (and Future
- Proof Modern Ones)
- * [23]Building software to last forever
- * [24]The Disappearing Art Of Maintenance
- * [25]Inca rope bridge
- * [26]How Often Do Commercial Airplanes Need Maintenance?
- * [27]Nobody Ever Gets Credit for Fixing Problems that Never Happened
- * [28]Boring Technology Club
- * [29]Open Mainframe Project 2021 Annual Report
- * [30]How Popular is COBOL?
- __________________________________________________________________
+ • [21]Things You Should Never Do, Part I
+ • [22]Patterns of Legacy Displacement
+ • [23]Kill It with Fire: Manage Aging Computer Systems (and Future Proof
+ Modern Ones)
+ • [24]Building software to last forever
+ • [25]The Disappearing Art Of Maintenance
+ • [26]Inca rope bridge
+ • [27]How Often Do Commercial Airplanes Need Maintenance?
+ • [28]Nobody Ever Gets Credit for Fixing Problems that Never Happened
+ • [29]Boring Technology Club
+ • [30]Open Mainframe Project 2021 Annual Report
+ • [31]How Popular is COBOL?
- Image Credit: Bill Gates, CEO of Microsoft, holds Windows 1.0 floppy
- discs.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- (Photo by Deborah Feingold/Corbis via Getty Images) This was the
- release of Windows 1.0. The beginning. Computers evolve. The underlying
- hardware, CPU, memory, and storage evolves. The operating system
- evolves. Of course, the software we use must evolve as well.
+Image Credit: Bill Gates, CEO of Microsoft, holds Windows 1.0 floppy discs.
+
+(Photo by Deborah Feingold/Corbis via Getty Images) This was the release of
+Windows 1.0. The beginning. Computers evolve. The underlying hardware, CPU,
+memory, and storage evolves. The operating system evolves. Of course, the
+software we use must evolve as well.
Sharing is Caring
- (BUTTON) (BUTTON) (BUTTON)
+[35]Edit this page
- [31]Edit this page
+Dan Stroot · Blog
+I love building things. Made in California. Family man, technologist and Hacker
+News aficionado. Eternally curious.
+[36]Join me on Twitter.[37]Join me on LinkedIn.[38]Join me on GitHub.
+Crafted with ♥️ in California. © 2024, [39]Dan Stroot
- Dan Stroot · Blog
- I love building things. Made in California. Family man, technologist
- and Hacker News aficionado. Eternally curious.
- [32]Join me on Twitter.[33]Join me on LinkedIn.[34]Join me on GitHub.
- Crafted with ♥️ in California. © 2024, [35]Dan Stroot
+References:
-References
-
- Visible links:
- 1. https://www.danstroot.com/feed.xml
- 2. https://www.googletagmanager.com/ns.html?id=GTM-55JC288
- 3. https://www.danstroot.com/
- 4. https://www.danstroot.com/
- 5. https://www.danstroot.com/about
- 6. https://www.danstroot.com/archive
- 7. https://www.danstroot.com/snippets
- 8. https://www.danstroot.com/uses
- 9. https://www.danstroot.com/quotes
- 10. https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
- 11. https://www.technologyreview.com/2015/08/06/166822/what-is-the-oldest-computer-program-still-in-use/
- 12. https://www.guinnessworldrecords.com/world-records/636196-oldest-software-system-in-continuous-use
- 13. https://en.wikipedia.org/wiki/Sabre_(travel_reservation_system)
- 14. https://en.wikipedia.org/wiki/Inca_rope_bridge
- 15. https://www.danstroot.com/posts/2022-06-05-how-software-learns
- 16. https://web.mit.edu/nelsonr/www/Repenning=Sterman_CMR_su01_.pdf
- 17. https://engineering.atspotify.com/2013/02/in-praise-of-boring-technology/
- 18. https://www.danstroot.com/posts/2021-12-27-dangerous-mvps
- 19. https://www.openmainframeproject.org/
- 20. https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
- 21. https://martinfowler.com/articles/patterns-legacy-displacement/
- 22. https://www.amazon.com/Kill-Fire-Manage-Computer-Systems/dp/1718501188
- 23. https://herman.bearblog.dev/building-software-to-last-forever/
- 24. https://www.noemamag.com/the-disappearing-art-of-maintenance/
- 25. https://en.wikipedia.org/wiki/Inca_rope_bridge
- 26. https://monroeaerospace.com/blog/how-often-do-commercial-airplanes-need-maintenance/#:~:text=Commercial airplanes require frequent maintenance,inspection once every few years.
- 27. https://web.mit.edu/nelsonr/www/Repenning=Sterman_CMR_su01_.pdf
- 28. https://boringtechnology.club/
- 29. https://www.openmainframeproject.org/wp-content/uploads/sites/11/2022/04/OMP_Annual_Report_2021_040622.pdf
- 30. https://news.ycombinator.com/item?id=33999718
- 31. https://github.com/dstroot/blog-next-13/blob/master/content/posts/2023-05-25-making_software_last_forever.mdx
- 32. https://twitter.com/danstroot
- 33. https://www.linkedin.com/in/danstroot
- 34. https://github.com/dstroot/blog-next
- 35. https://www.danstroot.com/analytics
-
- Hidden links:
- 37. https://www.danstroot.com/search
- 38. https://www.danstroot.com/about
+[1] https://www.danstroot.com/
+[2] https://www.danstroot.com/
+[3] https://www.danstroot.com/about
+[4] https://www.danstroot.com/archive
+[5] https://www.danstroot.com/snippets
+[6] https://www.danstroot.com/uses
+[7] https://www.danstroot.com/quotes
+[8] https://www.danstroot.com/search
+[10] https://www.danstroot.com/about
+[11] https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
+[12] https://www.technologyreview.com/2015/08/06/166822/what-is-the-oldest-computer-program-still-in-use/
+[13] https://www.guinnessworldrecords.com/world-records/636196-oldest-software-system-in-continuous-use
+[14] https://en.wikipedia.org/wiki/Sabre_(travel_reservation_system)
+[15] https://en.wikipedia.org/wiki/Inca_rope_bridge
+[16] https://www.danstroot.com/posts/2022-06-05-how-software-learns
+[17] https://web.mit.edu/nelsonr/www/Repenning=Sterman_CMR_su01_.pdf
+[18] https://engineering.atspotify.com/2013/02/in-praise-of-boring-technology/
+[19] https://www.danstroot.com/posts/2021-12-27-dangerous-mvps
+[20] https://www.openmainframeproject.org/
+[21] https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
+[22] https://martinfowler.com/articles/patterns-legacy-displacement/
+[23] https://www.amazon.com/Kill-Fire-Manage-Computer-Systems/dp/1718501188
+[24] https://herman.bearblog.dev/building-software-to-last-forever/
+[25] https://www.noemamag.com/the-disappearing-art-of-maintenance/
+[26] https://en.wikipedia.org/wiki/Inca_rope_bridge
+[27] https://monroeaerospace.com/blog/how-often-do-commercial-airplanes-need-maintenance/#:~:text=Commercial%20airplanes%20require%20frequent%20maintenance,inspection%20once%20every%20few%20years.
+[28] https://web.mit.edu/nelsonr/www/Repenning=Sterman_CMR_su01_.pdf
+[29] https://boringtechnology.club/
+[30] https://www.openmainframeproject.org/wp-content/uploads/sites/11/2022/04/OMP_Annual_Report_2021_040622.pdf
+[31] https://news.ycombinator.com/item?id=33999718
+[35] https://github.com/dstroot/blog-next-13/blob/master/content/posts/2023-05-25-making_software_last_forever.mdx
+[36] https://twitter.com/danstroot
+[37] https://www.linkedin.com/in/danstroot
+[38] https://github.com/dstroot/blog-next
+[39] https://www.danstroot.com/analytics
diff --git a/static/archive/www-gearpatrol-com-6mp4nk.txt b/static/archive/www-gearpatrol-com-6mp4nk.txt
index 8a56a79..cf0abaf 100644
--- a/static/archive/www-gearpatrol-com-6mp4nk.txt
+++ b/static/archive/www-gearpatrol-com-6mp4nk.txt
@@ -1,568 +1,587 @@
- #[1]home
+[1] Search
+[2]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- [2]Search
- __________________________________________________________________
+ • [3]Today in Gear
+ • [4]Deals
+ • [5]Holiday Gift Ideas
+ • [6]Gear Awards
+ □ [7]The 2023 Style Awards
+ □ [8]The 2023 Tech Awards
+ □ [9]The 2023 Home Awards
+ □ [10]The 2023 Outdoor Awards
+ □ [11]The 2023 Fitness Awards
+ □ [12]The 2023 Cannabis Awards
+ • [13]Buying Guides
+ □ [14]Watch Buying Guides
+ □ [15]Drink Buying Guides
+ □ [16]Home Buying Guides
+ □ [17]Tech Buying Guides
+ □ [18]Car and Motorcycle Guides
+ □ [19]Fitness Buying Guides
+ □ [20]Style and Grooming Guides
+ □ [21]Outdoor Buying Guides
+ • [22]Reviews
+ □ [23]Deep Dive
+ □ [24]Kind of Obsessed
+ □ [25]Head to Head
+ • [26]How-Tos and Explainers
+ □ [27]Counterpoint
+ □ [28]Further Details
+ □ [29]Product Support
+ • [30]Watches
+ □ [31]Watches You Should Know
+ □ [32]Dive Watches
+ □ [33]Dress Watches
+ □ [34]Vintage Watches
+ □ [35]Tool Watches
+ □ [36]Watch Accessories
+ • [37]Motoring
+ □ [38]Motorcycles
+ □ [39]Classic Cars
+ □ [40]SUVs and Trucks
+ □ [41]Adventure Vehicles
+ □ [42]Electric Vehicles
+ • [43]Food and Drink
+ □ [44]Whiskey
+ □ [45]Cocktails
+ □ [46]Beer
+ □ [47]Coffee
+ • [48]Home
+ □ [49]Kitchenware
+ □ [50]Office
+ □ [51]Weed
+ • [52]Style
+ □ [53]Grooming
+ □ [54]Style Spotting
+ □ [55]Bags and Luggage
+ □ [56]Style Accessories
+ • [57]Tech
+ □ [58]Audio
+ □ [59]Computers and Laptops
+ □ [60]Cameras and Photography
+ □ [61]Televisions
+ □ [62]Smartphones
+ • [63]Outdoors
+ □ [64]Knives and Multitools
+ □ [65]Camping
+ □ [66]Hiking and Climbing
+ □ [67]Skiing and Snowboarding
+ • [68]Fitness
+ □ [69]Wellness
+ □ [70]Training and Recovery
+ □ [71]Running
+ □ [72]Cycling
+ • [73]Follow
+ □ [74]Instagram
+ □ [75]Facebook
+ □ [76]Twitter
+ □ [77]YouTube
+ □ [78]Flipboard
+ • [79]Newsletter
+ • [80]Gear Patrol Magazine
+ • [81]Gear Patrol Studios
+ • [82]Videos
+ • [83]Library of Pursuits
+ • [84]About Gear Patrol
+ • [85]Advertise with Us
- * [3]Today in Gear
- * [4]Deals
- * [5]Holiday Gift Ideas
- * [6]Gear Awards
- + [7]The 2023 Style Awards
- + [8]The 2023 Tech Awards
- + [9]The 2023 Home Awards
- + [10]The 2023 Outdoor Awards
- + [11]The 2023 Fitness Awards
- + [12]The 2023 Cannabis Awards
- * [13]Buying Guides
- + [14]Watch Buying Guides
- + [15]Drink Buying Guides
- + [16]Home Buying Guides
- + [17]Tech Buying Guides
- + [18]Car and Motorcycle Guides
- + [19]Fitness Buying Guides
- + [20]Style and Grooming Guides
- + [21]Outdoor Buying Guides
- * [22]Reviews
- + [23]Deep Dive
- + [24]Kind of Obsessed
- + [25]Head to Head
- * [26]How-Tos and Explainers
- + [27]Counterpoint
- + [28]Further Details
- + [29]Product Support
- * [30]Watches
- + [31]Watches You Should Know
- + [32]Dive Watches
- + [33]Dress Watches
- + [34]Vintage Watches
- + [35]Tool Watches
- + [36]Watch Accessories
- * [37]Motoring
- + [38]Motorcycles
- + [39]Classic Cars
- + [40]SUVs and Trucks
- + [41]Adventure Vehicles
- + [42]Electric Vehicles
- * [43]Food and Drink
- + [44]Whiskey
- + [45]Cocktails
- + [46]Beer
- + [47]Coffee
- * [48]Home
- + [49]Kitchenware
- + [50]Office
- + [51]Weed
- * [52]Style
- + [53]Grooming
- + [54]Style Spotting
- + [55]Bags and Luggage
- + [56]Style Accessories
- * [57]Tech
- + [58]Audio
- + [59]Computers and Laptops
- + [60]Cameras and Photography
- + [61]Televisions
- + [62]Smartphones
- * [63]Outdoors
- + [64]Knives and Multitools
- + [65]Camping
- + [66]Hiking and Climbing
- + [67]Skiing and Snowboarding
- * [68]Fitness
- + [69]Wellness
- + [70]Training and Recovery
- + [71]Running
- + [72]Cycling
- * [73]Follow
- + [74]Instagram
- + [75]Facebook
- + [76]Twitter
- + [77]YouTube
- + [78]Flipboard
- * [79]Newsletter
- * [80]Gear Patrol Magazine
- * [81]Gear Patrol Studios
- * [82]Videos
- * [83]Library of Pursuits
- * [84]About Gear Patrol
- * [85]Advertise with Us
+ • [86]Your Privacy Choices
- * [86]Your Privacy Choices
+[87] Privacy Notice/Notice at Collection [88] Terms of Use
+[89] [90] [91]
- [87]Privacy Notice/Notice at Collection [88]Terms of Use
+ • [92]Today in Gear
+ • [93]Reviews
+ • [94]Buying Guides
+ • [95]Deals
+ • [96]Studios
- * [89]Today in Gear
- * [90]Reviews
- * [91]Buying Guides
- * [92]Deals
- * [93]Studios
+[97] Newsletter
+[98]
+[99][ ] Type keyword(s) to search
- [94]Newsletter
+[100]
+[yH5BAEAAAA]
+Today's Top Stories
+1
+Need a New Stove Hood? Shop Hauslane
+Presented by
+Hauslane
+[101]
+[yH5BAEAAAA]
+2
+Meet the Limited-Edition Dr Pepper® GMT Watch
+Presented by
+Jack Mason
+[102]
+[yH5BAEAAAA]
+3
+The 2024 Fitness Awards Full List of Winners
+[103]
+[yH5BAEAAAA]
+4
+G-SHOCK's New MUDMASTER Thrives in Extremes
+Presented by
+G Shock
+[104]
+[yH5BAEAAAA]
+5
+21 Vinyl Records Every Collection Should Have
- ____________________ Type keyword(s) to search
+Every product is [105]carefully selected by our editors. If you buy from a
+link, [106]we may earn a commission.
- Today's Top Stories
- 1
- Need a New Stove Hood? Shop Hauslane
- Presented by
- Hauslane
- 2
- Meet the Limited-Edition Dr Pepper® GMT Watch
- Presented by
- Jack Mason
- 3
- The 2024 Fitness Awards Full List of Winners
- 4
- G-SHOCK's New MUDMASTER Thrives in Extremes
- Presented by
- G Shock
- 5
- 21 Vinyl Records Every Collection Should Have
+ 1. [107] Tech
+ 2. [108] Audio
+ 3. [109] This Four-Track Tape Recorder Made Me Fall In Love With Music All
+ Over Again
- Every product is [95]carefully selected by our editors. If you buy from
- a link, [96]we may earn a commission.
+This Four-Track Tape Recorder Made Me Fall In Love With Music All Over Again
- 1. [97]Tech
+The cassette is still cool.
- [98]Audio
+[yH5BAEAAAA]
+By [110]Eric Limer
+Updated: Dec 22, 2023
+tascam portastudio 414 mk 2 on a desk
+Eric Limer
- [99]This Four-Track Tape Recorder Made Me Fall In Love With Music All
- Over Again
+For the past ten years or so I've been a musical rut, playing the same
+half-dozen, half-written songs on guitar once every other blue moon and
+listening to the same handful of punk bands I listened to in high school. I’ve
+been a musician for most of my life. Between church choirs, garage bands, and a
+cappella groups, I’ve been involved in organized (but never professional)
+music-making for the better part of several decades. But, after so long
+uninspired, I thought that maybe the musical part of my life was mostly behind
+me. Until the [111]Tascam Portastudio 414 MKII brought it all flooding back.
- This Four-Track Tape Recorder Made Me Fall In Love With Music All Over Again
+ • [112] [yH5BAEAAAA]
+ Tascam Portastudio 414 MKII 4-Track Cassette Recorder
+ [113] $475 AT REVERB.COM
+ [114]Read More
+ [115] $475 AT REVERB.COM
- The cassette is still cool.
+Released at the tail end of the 90s, the Portastudio 414 MKII harkens back to a
+time before MacBooks shipped with Garageband. If you wanted to record music
+with multiple tracks that could be altered independently, you were looking at
+booking studio time or buying something like this lovely big blue beast. And
+make no mistake, this chunky boy can deliver if you've got the chops. Bruce
+Springsteen's Nebraska, a few early Ween records, and some vintage Weird Al
+tunes [116]were all recorded on a Portastudio of one make or another. More
+recently, Nine Inch Nails' Alessandro Cortini has been almost single handedly
+responsible for making the 414 MKII in particular cool again with [117]his
+unorthodox (and extremely sick) use of the device as an instrument in live
+performance.
- By [100]Eric Limer
- Updated: Dec 22, 2023
-
- tascam portastudio 414 mk 2 on a desk
- Eric Limer
-
- For the past ten years or so I've been a musical rut, playing the same
- half-dozen, half-written songs on guitar once every other blue moon and
- listening to the same handful of punk bands I listened to in high
- school. I’ve been a musician for most of my life. Between church
- choirs, garage bands, and a cappella groups, I’ve been involved in
- organized (but never professional) music-making for the better part of
- several decades. But, after so long uninspired, I thought that maybe
- the musical part of my life was mostly behind me. Until the [101]Tascam
- Portastudio 414 MKII brought it all flooding back.
-
- * Tascam Portastudio 414 MKII 4-Track Cassette Recorder
- [102]$475 AT REVERB.COM
- [103]Read More
- [104]$475 AT REVERB.COM
-
- Released at the tail end of the 90s, the Portastudio 414 MKII harkens
- back to a time before MacBooks shipped with Garageband. If you wanted
- to record music with multiple tracks that could be altered
- independently, you were looking at booking studio time or buying
- something like this lovely big blue beast. And make no mistake, this
- chunky boy can deliver if you've got the chops. Bruce Springsteen's
- Nebraska, a few early Ween records, and some vintage Weird Al tunes
- [105]were all recorded on a Portastudio of one make or another. More
- recently, Nine Inch Nails' Alessandro Cortini has been almost single
- handedly responsible for making the 414 MKII in particular cool again
- with [106]his unorthodox (and extremely sick) use of the device as an
- instrument in live performance.
- Eric Limer
+[118]
+Eric Limer
Tascam Portastudio 414 MKII 4-Track Cassette Recorder
- reverb.com
- $475.00
- [107]SHOP NOW
+reverb.com
+$475.00
+[119] SHOP NOW
- The 414 MK II lets you record four independent tracks to a humble
- cassette tape, just enough room for bass, guitar, vocals, and drums,
- with the ability to add more if you’ve got the nerve to "bounce down"
- multiple instruments to the same track, irrevocably intertwining two
- rivers of sound to free up a slot for additional recording. It’s
- ridiculously limited compared to the "digital audio workstations" you
- can get literally for free today. but it does come with one killer
- feature that has only truly emerged in the millennium following its
- original launch: You don’t have to stare at a fucking screen to use it.
- close up of leds
- Much like celluloid photographic film, magnetic tape handles peaking
- more gracefully than digital mediums.
- Eric Limer
- a close up of a play button
- There’s nothing quite so satisfying is pressing play and feeling the
- tape start to move.
- Eric Limer
+The 414 MK II lets you record four independent tracks to a humble cassette
+tape, just enough room for bass, guitar, vocals, and drums, with the ability to
+add more if you’ve got the nerve to "bounce down" multiple instruments to the
+same track, irrevocably intertwining two rivers of sound to free up a slot for
+additional recording. It’s ridiculously limited compared to the "digital audio
+workstations" you can get literally for free today. but it does come with one
+killer feature that has only truly emerged in the millennium following its
+original launch: You don’t have to stare at a fucking screen to use it.
- I only ever recorded one (very poorly performed) song with my
- Portastudio when my parents gifted it to me back in the mid-aughts, and
- for almost twenty years I hadn’t really thought about it at all. But
- when an album cover featuring its unmistakable visage cropped up on my
- Spotify, it lit a spark in my brain. Mom knew just the closet where it
- had spent a decade plus hiding and soon, with a package of fresh
- cassette tapes in hand, I was ready to hit record.
- a stack of cassette tapes
- The Portastudio is designed to use pricey "Type II" cassette tapes for
- optimal performance, but cheaper Type 1s work fine (or better, if you
- actually want that telltale hiss).
- Eric Limer
+Much like celluloid photographic film, magnetic tape handles peaking more
+gracefully than digital mediums.
+Eric Limer
+There’s nothing quite so satisfying is pressing play and feeling the tape start
+to move.
+Eric Limer
- The joy of working in an analog medium, as [108]lovers of film
- photography can attest, is both the friction and the flavor it brings.
- Light leaks can spice up an otherwise average photograph. A little tape
- hiss can give your jam that extra flair. The cost, of course, is that
- your mistakes get baked all the way in, for better or worse. No undo
- buttons here. You have to move slowly and skillfully to find success.
- And so my plan to record guitar, bass, and vocals quickly hit a
- not-insignificant snag: I am neither a particularly good recording
- artist nor a remotely competent audio engineer.
+I only ever recorded one (very poorly performed) song with my Portastudio when
+my parents gifted it to me back in the mid-aughts, and for almost twenty years
+I hadn’t really thought about it at all. But when an album cover featuring its
+unmistakable visage cropped up on my Spotify, it lit a spark in my brain. Mom
+knew just the closet where it had spent a decade plus hiding and soon, with a
+package of fresh cassette tapes in hand, I was ready to hit record.
- After a few hours of trying and failing to adequately record the
- beat-to-shit [109]Yamaha FG-335II I stole from my dad on my way to
- college 16 years ago with a unidirectional dynamic mic not remotely fit
- for the task, I tripped and fell into a whole other rabbit hole. What
- you really need, the gear gremlin between my ears sweetly whispered, is
- a drum machine. Also a synthesizer.
+The Portastudio is designed to use pricey "Type II" cassette tapes for optimal
+performance, but cheaper Type 1s work fine (or better, if you actually want
+that telltale hiss).
+Eric Limer
- A bit of research and a few impulse buys later, I was finally in
- business:
+The joy of working in an analog medium, as [120]lovers of film photography can
+attest, is both the friction and the flavor it brings. Light leaks can spice up
+an otherwise average photograph. A little tape hiss can give your jam that
+extra flair. The cost, of course, is that your mistakes get baked all the way
+in, for better or worse. No undo buttons here. You have to move slowly and
+skillfully to find success. And so my plan to record guitar, bass, and vocals
+quickly hit a not-insignificant snag: I am neither a particularly good
+recording artist nor a remotely competent audio engineer.
- This content is imported from Third party. You may be able to find the
- same content in another format, or you may be able to find more
- information, at their web site.
+After a few hours of trying and failing to adequately record the beat-to-shit
+[121]Yamaha FG-335II I stole from my dad on my way to college 16 years ago with
+a unidirectional dynamic mic not remotely fit for the task, I tripped and fell
+into a whole other rabbit hole. What you really need, the gear gremlin between
+my ears sweetly whispered, is a drum machine. Also a synthesizer.
+
+A bit of research and a few impulse buys later, I was finally in business:
+
+This content is imported from Third party. You may be able to find the same
+content in another format, or you may be able to find more information, at
+their web site.
Featured in this track:
- Korg Volca Keys
- Korg Volca Keys
- Korg amazon.com
- $237.00
- $149.99 (37% off)
- [110]SHOP NOW
+Korg Volca Keys
+Korg Volca Keys
+Korg amazon.com
+$237.00
+$149.99 (37% off)
+[122] SHOP NOW
- Arguably the cornerstone of Korg's budget "Volca" line, the Volca Keys
- has old-school analog circuitry, basic sequencer functionality and
- limited polyphony so you can play chords. It's also optionally
- battery-powered and I've spent dozens of hours jamming on it while
- sitting on the couch. Oh also it sounds fat as hell.
- Korg NTS Digital Synth Kit 1
- Korg NTS Digital Synth Kit 1
- Korg amazon.com
- $115.99
- [111]SHOP NOW
+Arguably the cornerstone of Korg's budget "Volca" line, the Volca Keys has
+old-school analog circuitry, basic sequencer functionality and limited
+polyphony so you can play chords. It's also optionally battery-powered and I've
+spent dozens of hours jamming on it while sitting on the couch. Oh also it
+sounds fat as hell.
- You have to assemble this tiny, digital synth yourself, but it packs a
- ton of functionality into an itty bitty and affordable package. It
- supports [112]a library of community-programmed instrument sounds and
- effects and doubles as a capable FX pedal for my other gear thanks to
- its passthrough reverb, chorus and modulation effects.
- Arturia KeyStep 32-Key Controller
- Arturia KeyStep 32-Key Controller
- Arturia amazon.com
- $149.00
- $129.00 (13% off)
- [113]SHOP NOW
+Korg NTS Digital Synth Kit 1
+Korg NTS Digital Synth Kit 1
+Korg amazon.com
+$115.99
+[123] SHOP NOW
- My Korgs all sport touchpad keyboards that are... technically
- functional. If you want any sort of precision, an external MIDI
- keyboard is essential. Arturia's KeyStep is a go-to choice that sports
- some useful features of its own, like a sequencer for recording complex
- patterns and an arpeggiator for auto-playing simpler ones.
- Korg Volca Sample 2 Korg Volca Sample 2
- Korg guitarcenter.com
- $109.99
- [114]SHOP NOW
+You have to assemble this tiny, digital synth yourself, but it packs a ton of
+functionality into an itty bitty and affordable package. It supports [124]a
+library of community-programmed instrument sounds and effects and doubles as a
+capable FX pedal for my other gear thanks to its passthrough reverb, chorus and
+modulation effects.
- It's not a drum machine, but I used it as one because it comes
- preloaded with a number of drum recordings (and other sound clips) and
- the ability to load your own. It served me well enough, but I'm putting
- this one back on the market because I've made it redundant with some
- other buys and I've learned that I much prefer synthesis to sampling.
+Arturia KeyStep 32-Key Controller
+Arturia KeyStep 32-Key Controller
+Arturia amazon.com
+$149.00
+$129.00 (13% off)
+[125] SHOP NOW
- Like any amateur analog artifact, this track contains mistakes encased
- in amber. The hi-hats are too hot because I didn’t balance the levels
- of the individual drums in my sampler before committing the whole drum
- track to tape. The bass comes in awkwardly because I was doing dynamics
- live to tape with the synth's volume knob instead of using a fader
- during mixdown. The solo, well, it is what it is. But the Portastudio
- saved my ass, not (only) with tape hiss, but by helping me take a deep
- breath and put this song to bed. I won’t waste hours trying to improve
- on the raw material with endless tiny tweaks, because I can't. Lessons
- (hopefully) learned, on to the next jam!
- a piano with a keyboard
- Controlled over MIDI by the Arturia KeyStep, the Volca Keys outputs its
- audio through the NTS-1 for reverb before heading into track one on the
- Portastudio.
- Eric Limer
+My Korgs all sport touchpad keyboards that are... technically functional. If
+you want any sort of precision, an external MIDI keyboard is essential.
+Arturia's KeyStep is a go-to choice that sports some useful features of its
+own, like a sequencer for recording complex patterns and an arpeggiator for
+auto-playing simpler ones.
- In the months since that inaugural recording, the road of my obsession
- has taken me away from analog, and towards digital devices that can
- synthesize and sequence a song’s worth of instruments inside themselves
- (still no computer screens allowed). At the moment, I’m in love with my
- [115]"Woovebox," a petite-but-powerful one-person labor of love out of
- Australia, while I simultaneously lust after [116]the wickedly slick,
- murdered-out Dirtywave M8 Tracker, a Gameboy-sized studio in a
- handheld.
+Korg Volca Sample 2
+Korg Volca Sample 2
+Korg guitarcenter.com
+$109.99
+[126] SHOP NOW
- If the two of us didn't go so far back, I might consider flipping my
- Portastudio on the secondary market, where the prices are currently
- sky-high. I could probably get more for it now than my parents
- originally paid and finance a big chunk of this or that digital
- dalliance. But in a way, I'm glad to be spared the temptation. Because
- if there's anything I've learned over the past twenty-something years,
- it's that the odds are very high I'll come crawling back to cassette.
+It's not a drum machine, but I used it as one because it comes preloaded with a
+number of drum recordings (and other sound clips) and the ability to load your
+own. It served me well enough, but I'm putting this one back on the market
+because I've made it redundant with some other buys and I've learned that I
+much prefer synthesis to sampling.
- * Tascam Portastudio 414 MKII 4-Track Cassette Recorder
- [117]$475 AT REVERB.COM
- [118]Read More
- [119]$475 AT REVERB.COM
+Like any amateur analog artifact, this track contains mistakes encased in
+amber. The hi-hats are too hot because I didn’t balance the levels of the
+individual drums in my sampler before committing the whole drum track to tape.
+The bass comes in awkwardly because I was doing dynamics live to tape with the
+synth's volume knob instead of using a fader during mixdown. The solo, well, it
+is what it is. But the Portastudio saved my ass, not (only) with tape hiss, but
+by helping me take a deep breath and put this song to bed. I won’t waste hours
+trying to improve on the raw material with endless tiny tweaks, because I
+can't. Lessons (hopefully) learned, on to the next jam!
- Related Stories
- The Best Vintage Cassette Tape Players
- The Comeback of the Classic Cassette
- Advertisement - Continue Reading Below
+Controlled over MIDI by the Arturia KeyStep, the Volca Keys outputs its audio
+through the NTS-1 for reverb before heading into track one on the Portastudio.
+Eric Limer
- (BUTTON)
+In the months since that inaugural recording, the road of my obsession has
+taken me away from analog, and towards digital devices that can synthesize and
+sequence a song’s worth of instruments inside themselves (still no computer
+screens allowed). At the moment, I’m in love with my [127]"Woovebox," a
+petite-but-powerful one-person labor of love out of Australia, while I
+simultaneously lust after [128]the wickedly slick, murdered-out Dirtywave M8
+Tracker, a Gameboy-sized studio in a handheld.
- More From [120]Audio
- 21 Vinyl Records Every Collection Should Have
- The Best Audio Gadgets Announced at CES 2024
- __________________________________________________________________
+If the two of us didn't go so far back, I might consider flipping my
+Portastudio on the secondary market, where the prices are currently sky-high. I
+could probably get more for it now than my parents originally paid and finance
+a big chunk of this or that digital dalliance. But in a way, I'm glad to be
+spared the temptation. Because if there's anything I've learned over the past
+twenty-something years, it's that the odds are very high I'll come crawling
+back to cassette.
- Advertisement - Continue Reading Below
- The Best Floorstanding Speakers Under $1,000
- __________________________________________________________________
+ • [129] [yH5BAEAAAA]
+ Tascam Portastudio 414 MKII 4-Track Cassette Recorder
+ [130] $475 AT REVERB.COM
+ [131]Read More
+ [132] $475 AT REVERB.COM
- The Argument Against the "Do It All" Speaker
- __________________________________________________________________
+Related Stories
+[133]
+[school-age-boy-holding-an-audio-cass]
+The Best Vintage Cassette Tape Players
+[134]
+[cassette-tape-m2w-16-1-1620826229]
+The Comeback of the Classic Cassette
+Advertisement - Continue Reading Below
+More From [136]Audio
+[137]
+[yH5BAEAAAA]
+21 Vinyl Records Every Collection Should Have
+[138]
+[yH5BAEAAAA]
+The Best Audio Gadgets Announced at CES 2024
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+Advertisement - Continue Reading Below
+[139]
+[yH5BAEAAAA]
+The Best Floorstanding Speakers Under $1,000
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[140]
+[yH5BAEAAAA]
+The Argument Against the "Do It All" Speaker
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[141]
+[yH5BAEAAAA]
+Why Your Sound System Needs a Wireless Subwoofer
+[142]
+[yH5BAEAAAA]
+The Most Interesting Hi-Fi and Audio Gear of 2023
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[143]
+[yH5BAEAAAA]
+Apple Might've Solved Your Biggest Soundbar Gripe
+[144]
+[yH5BAEAAAA]
+Our 11 Favorite Headphones We Tested in 2023
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[145]
+[yH5BAEAAAA]
+The Best Multi-Room Wireless Speakers of 2023
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[146]
+[yH5BAEAAAA]
+The Argument Against a Wireless Hi-Fi System
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+[147]
+[148]
+[149]
+[150]
+[151]
- Why Your Sound System Needs a Wireless Subwoofer
- The Most Interesting Hi-Fi and Audio Gear of 2023
- __________________________________________________________________
- __________________________________________________________________
+ • [152]About Us
+ • [153]Today in Gear
+ • [154]Deals
+ • [155]Gift Guides
+ • [156]DPReview
+ • [157]Watches
+ • [158]Motoring
+ • [159]Style
+ • [160]Outdoors
+ • [161]Fitness
+ • [162]Food and Drink
+ • [163]Home
+ • [164]Tech
+ • [165]Gear Patrol Magazine
+ • [166]Newsletters
+ • [167]Gear Patrol Studios
+ • [168]How We Test Products
+ • [169]Advertise
+ • [170]Licensing and Accolades
+ • [171]RSS
- Apple Might've Solved Your Biggest Soundbar Gripe
- Our 11 Favorite Headphones We Tested in 2023
- __________________________________________________________________
+Gear Patrol – For Life's Pursuits Gear Patrol participates in various affiliate
+marketing programs, which means we may get paid commissions on editorially
+chosen products purchased through our links to retailer sites.
+©2024 Gear Patrol, LLC. All Rights Reserved.
- The Best Multi-Room Wireless Speakers of 2023
- __________________________________________________________________
+ • [172]Privacy Notice
+ • [173]CA Notice at Collection
+ • [174]Your CA Privacy Rights/Shine the Light
+ • [175]DAA Industry Opt Out
+ • [176]Terms Of Use
+ • [177]Sitemap
- The Argument Against a Wireless Hi-Fi System
- __________________________________________________________________
- * [121]About Us
- * [122]Today in Gear
- * [123]Deals
- * [124]Gift Guides
- * [125]DPReview
- * [126]Watches
- * [127]Motoring
- * [128]Style
- * [129]Outdoors
- * [130]Fitness
- * [131]Food and Drink
- * [132]Home
- * [133]Tech
- * [134]Gear Patrol Magazine
- * [135]Newsletters
- * [136]Gear Patrol Studios
- * [137]How We Test Products
- * [138]Advertise
- * [139]Licensing and Accolades
- * [140]RSS
+References:
- Gear Patrol – For Life's Pursuits Gear Patrol participates in various
- affiliate marketing programs, which means we may get paid commissions
- on editorially chosen products purchased through our links to retailer
- sites.
- ©2024 Gear Patrol, LLC. All Rights Reserved.
- * [141]Privacy Notice
- * [142]CA Notice at Collection
- * [143]Your CA Privacy Rights/Shine the Light
- * [144]DAA Industry Opt Out
- * [145]Terms Of Use
- * [146]Sitemap
-
- [147]Your Privacy Choices: Opt Out of Sale/Targeted Ads
-
-References
-
- Visible links:
- 1. https://www.gearpatrol.com/
- 2. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#searchoverlay
- 3. https://www.gearpatrol.com/briefings/today-in-gear/
- 4. https://www.gearpatrol.com/deals/a34849668/best-deals/
- 5. https://www.gearpatrol.com/gift-guides/
- 6. https://www.gearpatrol.com/gear-awards/
- 7. https://www.gearpatrol.com/style/a45302846/gear-patrol-style-awards-2023/
- 8. https://www.gearpatrol.com/tech/a45619555/tech-awards-2023/
- 9. https://www.gearpatrol.com/home/a43576931/home-awards-2023/
- 10. https://www.gearpatrol.com/outdoors/a44116782/outdoor-awards-2023/
- 11. https://www.gearpatrol.com/fitness/a42254287/fitness-awards-2023/
- 12. https://www.gearpatrol.com/home/a43496144/cannabis-awards-2023/
- 13. https://www.gearpatrol.com/buying-guides/
- 14. https://www.gearpatrol.com/watch-buying-guides/
- 15. https://www.gearpatrol.com/drink-buying-guides/
- 16. https://www.gearpatrol.com/home-buying-guides/
- 17. https://www.gearpatrol.com/tech-buying-guides/
- 18. https://www.gearpatrol.com/car-motorcycle-buying-guides/
- 19. https://www.gearpatrol.com/fitness-buying-guides/
- 20. https://www.gearpatrol.com/style-buying-guides/
- 21. https://www.gearpatrol.com/outdoor-buying-guides/
- 22. https://www.gearpatrol.com/reviews/
- 23. https://www.gearpatrol.com/deep-dive/
- 24. https://www.gearpatrol.com/kind-of-obsessed/
- 25. https://www.gearpatrol.com/head-to-head-reviews/
- 26. https://www.gearpatrol.com/how-tos-explainers/
- 27. https://www.gearpatrol.com/counterpoint/
- 28. https://www.gearpatrol.com/further-details/
- 29. https://www.gearpatrol.com/product-support/
- 30. https://www.gearpatrol.com/watches/
- 31. https://www.gearpatrol.com/watches-you-should-know/
- 32. https://www.gearpatrol.com/dive-watches/
- 33. https://www.gearpatrol.com/dress-watches/
- 34. https://www.gearpatrol.com/vintage-watches/
- 35. https://www.gearpatrol.com/tool-watches/
- 36. https://www.gearpatrol.com/watch-accessories/
- 37. https://www.gearpatrol.com/cars/
- 38. https://www.gearpatrol.com/cars/motorcycles/
- 39. https://www.gearpatrol.com/classic-cars/
- 40. https://www.gearpatrol.com/suvs-trucks/
- 41. https://www.gearpatrol.com/adventure-vehicles/
- 42. https://www.gearpatrol.com/electric-vehicles/
- 43. https://www.gearpatrol.com/food/
- 44. https://www.gearpatrol.com/whiskey/
- 45. https://www.gearpatrol.com/cocktails/
- 46. https://www.gearpatrol.com/beer/
- 47. https://www.gearpatrol.com/coffee/
- 48. https://www.gearpatrol.com/home/
- 49. https://www.gearpatrol.com/kitchenware/
- 50. https://www.gearpatrol.com/office/
- 51. https://www.gearpatrol.com/weed/
- 52. https://www.gearpatrol.com/style/
- 53. https://www.gearpatrol.com/style/grooming/
- 54. https://www.gearpatrol.com/style-spotting/
- 55. https://www.gearpatrol.com/bags-luggage/
- 56. https://www.gearpatrol.com/style-accessories/
- 57. https://www.gearpatrol.com/tech/
- 58. https://www.gearpatrol.com/tech/audio/
- 59. https://www.gearpatrol.com/computers-laptops/
- 60. https://www.gearpatrol.com/cameras-photography/
- 61. https://www.gearpatrol.com/televisions/
- 62. https://www.gearpatrol.com/smartphones/
- 63. https://www.gearpatrol.com/outdoors/
- 64. https://www.gearpatrol.com/knives-multitools/
- 65. https://www.gearpatrol.com/camping/
- 66. https://www.gearpatrol.com/hiking-climbing/
- 67. https://www.gearpatrol.com/skiing-snowboarding/
- 68. https://www.gearpatrol.com/fitness/
- 69. https://www.gearpatrol.com/fitness/health-wellness/
- 70. https://www.gearpatrol.com/training-recovery/
- 71. https://www.gearpatrol.com/running/
- 72. https://www.gearpatrol.com/biking/
- 73. https://www.gearpatrol.com/about/
- 74. https://www.instagram.com/gearpatrol/
- 75. https://www.facebook.com/gearpatrol
- 76. https://twitter.com/gearpatrol
- 77. https://www.youtube.com/user/gearpatrol
- 78. https://flipboard.com/@GearPatrol
- 79. https://email.gearpatrol.com/subscribe
- 80. https://www.gearpatrol.com/about/a40849193/about-gear-patrol-magazine/
- 81. https://studios.gearpatrol.com/
- 82. https://www.gearpatrol.com/videos/
- 83. https://email.gearpatrol.com/library-of-pursuits
- 84. https://www.gearpatrol.com/about/a2281/about/
- 85. https://studios.gearpatrol.com/contact/
- 86. https://www.gearpatrol.com/about/a42158740/do-not-sell-my-personal-information/
- 87. https://www.hearst.com/-/us-magazines-privacy-notice
- 88. https://www.hearst.com/-/us-magazines-terms-of-use
- 89. https://www.gearpatrol.com/today-in-gear
- 90. https://www.gearpatrol.com/reviews/
- 91. https://www.gearpatrol.com/buying-guides
- 92. https://www.gearpatrol.com/deals/a34849668/best-deals/
- 93. https://studios.gearpatrol.com/
- 94. https://email.gearpatrol.com/subscribe
- 95. https://www.gearpatrol.com/about/a43276360/how-we-evaluate-products/
- 96. https://www.gearpatrol.com/about/a2281/about/#:~:text=Affiliate Disclosure Statement,price as a referral fee.
- 97. https://www.gearpatrol.com/tech/
- 98. https://www.gearpatrol.com/tech/audio/
- 99. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/
- 100. https://www.gearpatrol.com/author/225861/eric-limer/
- 101. https://go.redirectingat.com/?id=31959X896062&xs=1&url=https://reverb.com/p/tascam-414-mkii&sref=https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/
- 102. https://go.redirectingat.com/?id=31959X896062&url=https://reverb.com/marketplace?product_type=pro-audio&query=TASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 103. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#product-1018365f-aed1-4bbd-86ea-466ab005acb7-anchor
- 104. https://go.redirectingat.com/?id=31959X896062&url=https://reverb.com/marketplace?product_type=pro-audio&query=TASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 105. https://mixdownmag.com.au/features/the-10-best-recordings-on-the-iconic-tascam-portastudio/
- 106. https://www.youtube.com/watch?v=11BP4Pe8iYk
- 107. https://go.redirectingat.com/?id=31959X896062&url=https://reverb.com/marketplace?product_type=pro-audio&query=TASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 108. https://www.gearpatrol.com/tech/a43946858/formula-1-film-photography-tips/
- 109. https://terrifyingtonetrip.wordpress.com/2013/11/07/guitarsenal-early-80s-yamaha-fg335ii-acoustic/
- 110. https://www.amazon.com/dp/B00CAKSVTU
- 111. https://www.amazon.com/dp/B07XH591BH
- 112. https://korginc.github.io/logue-sdk/unit-index/
- 113. https://www.amazon.com/dp/B01BPSBU40
- 114. https://go.redirectingat.com/?id=31959X896062&url=https://www.guitarcenter.com/KORG/Volca-Sample-2-Digital-Sample-Sequencer-White-1500000332703.gc
- 115. https://www.woovebox.com/
- 116. https://dirtywave.com/
- 117. https://go.redirectingat.com/?id=31959X896062&url=https://reverb.com/marketplace?product_type=pro-audio&query=TASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 118. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#product-1018365f-aed1-4bbd-86ea-466ab005acb7-anchor
- 119. https://go.redirectingat.com/?id=31959X896062&url=https://reverb.com/marketplace?product_type=pro-audio&query=TASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 120. https://www.gearpatrol.com/tech/audio/
- 121. https://www.gearpatrol.com/about/a2281/about/
- 122. https://www.gearpatrol.com/briefings/today-in-gear/
- 123. https://www.gearpatrol.com/deals/
- 124. https://www.gearpatrol.com/gift-guides/
- 125. https://www.dpreview.com/
- 126. https://www.gearpatrol.com/watches/
- 127. https://www.gearpatrol.com/cars/
- 128. https://www.gearpatrol.com/style/
- 129. https://www.gearpatrol.com/outdoors/
- 130. https://www.gearpatrol.com/fitness/
- 131. https://www.gearpatrol.com/food/
- 132. https://www.gearpatrol.com/home/
- 133. https://www.gearpatrol.com/tech/
- 134. https://www.gearpatrol.com/about/a40849193/about-gear-patrol-magazine/
- 135. https://email.gearpatrol.com/subscribe
- 136. https://studios.gearpatrol.com/
- 137. https://www.gearpatrol.com/about/a43276360/how-we-evaluate-products/
- 138. https://studios.gearpatrol.com/contact/
- 139. https://info.wrightsmedia.com/gearpatrol-licensing-reprints
- 140. https://www.gearpatrol.com/rss/all.xml/
- 141. https://www.hearst.com/-/us-magazines-privacy-notice
- 142. https://www.hearst.com/-/us-magazines-privacy-notice#_ADDITIONAL_INFO
- 143. https://www.hearst.com/-/us-magazines-privacy-notice#_ADDITIONAL_INFO
- 144. https://www.hearst.com/-/us-magazines-privacy-notice#_OPT_OUTS
- 145. https://www.hearst.com/-/us-magazines-terms-of-use
- 146. https://www.gearpatrol.com/sitemap/
- 147. https://www.gearpatrol.com/about/a42158740/do-not-sell-my-personal-information/
-
- Hidden links:
- 149. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/
- 150. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/
- 151. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#sidepanel
- 152. https://www.gearpatrol.com/
- 153. https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/
- 154. https://www.gearpatrol.com/briefings/today-in-gear/a45455318/tig-hauslane/
- 155. https://www.gearpatrol.com/watches/a45446440/meet-the-limited-edition-dr-pepper-gmt-watch/
- 156. https://www.gearpatrol.com/fitness/a46086061/2024-fitness-awards/
- 157. https://www.gearpatrol.com/watches/a45415037/product-compedium-template-1696265870/
- 158. https://www.gearpatrol.com/tech/audio/a44118957/best-vinyl-records-picked-by-experts/
- 159. https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 160. https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 161. https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
- 162. https://www.gearpatrol.com/tech/audio/a41601961/vintage-cassette-player/
- 163. https://www.gearpatrol.com/tech/a36356719/cassette-tape-player-revival/
- 164. https://www.gearpatrol.com/tech/audio/a44118957/best-vinyl-records-picked-by-experts/
- 165. https://www.gearpatrol.com/tech/audio/a46326970/best-audio-ces-2024/
- 166. https://www.gearpatrol.com/tech/audio/a42030769/best-floorstanding-speakers/
- 167. https://www.gearpatrol.com/tech/audio/a46260579/modern-speakers-trend/
- 168. https://www.gearpatrol.com/tech/audio/a46275100/best-wireless-subwoofer/
- 169. https://www.gearpatrol.com/tech/audio/a46168154/best-new-hi-fi-audio-gear-2023/
- 170. https://www.gearpatrol.com/tech/audio/a45908277/apple-tv-volume-control-setting/
- 171. https://www.gearpatrol.com/tech/audio/a46200182/favorite-headphones-2023/
- 172. https://www.gearpatrol.com/tech/audio/a360311/best-wireless-multiroom-speakers/
- 173. https://www.gearpatrol.com/tech/audio/a33809800/hi-fi-wireless-sound-quality-explained/
- 174. https://www.gearpatrol.com/
- 175. https://www.facebook.com/gearpatrol/
- 176. https://twitter.com/gearpatrol
- 177. https://www.youtube.com/gearpatrol
- 178. https://www.instagram.com/gearpatrol/
+[1] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#searchoverlay
+[2] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#
+[3] https://www.gearpatrol.com/briefings/today-in-gear/
+[4] https://www.gearpatrol.com/deals/a34849668/best-deals/
+[5] https://www.gearpatrol.com/gift-guides/
+[6] https://www.gearpatrol.com/gear-awards/
+[7] https://www.gearpatrol.com/style/a45302846/gear-patrol-style-awards-2023/
+[8] https://www.gearpatrol.com/tech/a45619555/tech-awards-2023/
+[9] https://www.gearpatrol.com/home/a43576931/home-awards-2023/
+[10] https://www.gearpatrol.com/outdoors/a44116782/outdoor-awards-2023/
+[11] https://www.gearpatrol.com/fitness/a42254287/fitness-awards-2023/
+[12] https://www.gearpatrol.com/home/a43496144/cannabis-awards-2023/
+[13] https://www.gearpatrol.com/buying-guides/
+[14] https://www.gearpatrol.com/watch-buying-guides/
+[15] https://www.gearpatrol.com/drink-buying-guides/
+[16] https://www.gearpatrol.com/home-buying-guides/
+[17] https://www.gearpatrol.com/tech-buying-guides/
+[18] https://www.gearpatrol.com/car-motorcycle-buying-guides/
+[19] https://www.gearpatrol.com/fitness-buying-guides/
+[20] https://www.gearpatrol.com/style-buying-guides/
+[21] https://www.gearpatrol.com/outdoor-buying-guides/
+[22] https://www.gearpatrol.com/reviews/
+[23] https://www.gearpatrol.com/deep-dive/
+[24] https://www.gearpatrol.com/kind-of-obsessed/
+[25] https://www.gearpatrol.com/head-to-head-reviews/
+[26] https://www.gearpatrol.com/how-tos-explainers/
+[27] https://www.gearpatrol.com/counterpoint/
+[28] https://www.gearpatrol.com/further-details/
+[29] https://www.gearpatrol.com/product-support/
+[30] https://www.gearpatrol.com/watches/
+[31] https://www.gearpatrol.com/watches-you-should-know/
+[32] https://www.gearpatrol.com/dive-watches/
+[33] https://www.gearpatrol.com/dress-watches/
+[34] https://www.gearpatrol.com/vintage-watches/
+[35] https://www.gearpatrol.com/tool-watches/
+[36] https://www.gearpatrol.com/watch-accessories/
+[37] https://www.gearpatrol.com/cars/
+[38] https://www.gearpatrol.com/cars/motorcycles/
+[39] https://www.gearpatrol.com/classic-cars/
+[40] https://www.gearpatrol.com/suvs-trucks/
+[41] https://www.gearpatrol.com/adventure-vehicles/
+[42] https://www.gearpatrol.com/electric-vehicles/
+[43] https://www.gearpatrol.com/food/
+[44] https://www.gearpatrol.com/whiskey/
+[45] https://www.gearpatrol.com/cocktails/
+[46] https://www.gearpatrol.com/beer/
+[47] https://www.gearpatrol.com/coffee/
+[48] https://www.gearpatrol.com/home/
+[49] https://www.gearpatrol.com/kitchenware/
+[50] https://www.gearpatrol.com/office/
+[51] https://www.gearpatrol.com/weed/
+[52] https://www.gearpatrol.com/style/
+[53] https://www.gearpatrol.com/style/grooming/
+[54] https://www.gearpatrol.com/style-spotting/
+[55] https://www.gearpatrol.com/bags-luggage/
+[56] https://www.gearpatrol.com/style-accessories/
+[57] https://www.gearpatrol.com/tech/
+[58] https://www.gearpatrol.com/tech/audio/
+[59] https://www.gearpatrol.com/computers-laptops/
+[60] https://www.gearpatrol.com/cameras-photography/
+[61] https://www.gearpatrol.com/televisions/
+[62] https://www.gearpatrol.com/smartphones/
+[63] https://www.gearpatrol.com/outdoors/
+[64] https://www.gearpatrol.com/knives-multitools/
+[65] https://www.gearpatrol.com/camping/
+[66] https://www.gearpatrol.com/hiking-climbing/
+[67] https://www.gearpatrol.com/skiing-snowboarding/
+[68] https://www.gearpatrol.com/fitness/
+[69] https://www.gearpatrol.com/fitness/health-wellness/
+[70] https://www.gearpatrol.com/training-recovery/
+[71] https://www.gearpatrol.com/running/
+[72] https://www.gearpatrol.com/biking/
+[73] https://www.gearpatrol.com/about/
+[74] https://www.instagram.com/gearpatrol/
+[75] https://www.facebook.com/gearpatrol
+[76] https://twitter.com/gearpatrol
+[77] https://www.youtube.com/user/gearpatrol
+[78] https://flipboard.com/@GearPatrol
+[79] https://email.gearpatrol.com/subscribe
+[80] https://www.gearpatrol.com/about/a40849193/about-gear-patrol-magazine/
+[81] https://studios.gearpatrol.com/
+[82] https://www.gearpatrol.com/videos/
+[83] https://email.gearpatrol.com/library-of-pursuits
+[84] https://www.gearpatrol.com/about/a2281/about/
+[85] https://studios.gearpatrol.com/contact/
+[86] https://www.gearpatrol.com/about/a42158740/do-not-sell-my-personal-information/
+[87] https://www.hearst.com/-/us-magazines-privacy-notice
+[88] https://www.hearst.com/-/us-magazines-terms-of-use
+[89] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#
+[90] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#sidepanel
+[91] https://www.gearpatrol.com/
+[92] https://www.gearpatrol.com/today-in-gear
+[93] https://www.gearpatrol.com/reviews/
+[94] https://www.gearpatrol.com/buying-guides
+[95] https://www.gearpatrol.com/deals/a34849668/best-deals/
+[96] https://studios.gearpatrol.com/
+[97] https://email.gearpatrol.com/subscribe
+[98] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#
+[100] https://www.gearpatrol.com/briefings/today-in-gear/a45455318/tig-hauslane/
+[101] https://www.gearpatrol.com/watches/a45446440/meet-the-limited-edition-dr-pepper-gmt-watch/
+[102] https://www.gearpatrol.com/fitness/a46086061/2024-fitness-awards/
+[103] https://www.gearpatrol.com/watches/a45415037/product-compedium-template-1696265870/
+[104] https://www.gearpatrol.com/tech/audio/a44118957/best-vinyl-records-picked-by-experts/
+[105] https://www.gearpatrol.com/about/a43276360/how-we-evaluate-products/
+[106] https://www.gearpatrol.com/about/a2281/about/#:~:text=Affiliate%20Disclosure%20Statement,price%20as%20a%20referral%20fee.
+[107] https://www.gearpatrol.com/tech/
+[108] https://www.gearpatrol.com/tech/audio/
+[109] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/
+[110] https://www.gearpatrol.com/author/225861/eric-limer/
+[111] https://go.redirectingat.com/?id=31959X896062&xs=1&url=https%3A%2F%2Freverb.com%2Fp%2Ftascam-414-mkii&sref=https%3A%2F%2Fwww.gearpatrol.com%2Ftech%2Faudio%2Fa45461959%2Ftascam-portastudio-414-mkii%2F
+[112] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[113] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[114] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#product-1018365f-aed1-4bbd-86ea-466ab005acb7-anchor
+[115] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[116] https://mixdownmag.com.au/features/the-10-best-recordings-on-the-iconic-tascam-portastudio/
+[117] https://www.youtube.com/watch?v=11BP4Pe8iYk
+[118] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[119] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[120] https://www.gearpatrol.com/tech/a43946858/formula-1-film-photography-tips/
+[121] https://terrifyingtonetrip.wordpress.com/2013/11/07/guitarsenal-early-80s-yamaha-fg335ii-acoustic/
+[122] https://www.amazon.com/dp/B00CAKSVTU
+[123] https://www.amazon.com/dp/B07XH591BH
+[124] https://korginc.github.io/logue-sdk/unit-index/
+[125] https://www.amazon.com/dp/B01BPSBU40
+[126] https://go.redirectingat.com/?id=31959X896062&xs=1&url=https%3A%2F%2Fwww.guitarcenter.com%2FKORG%2FVolca-Sample-2-Digital-Sample-Sequencer-White-1500000332703.gc&sref=https%3A%2F%2Fwww.gearpatrol.com%2Ftech%2Faudio%2Fa45461959%2Ftascam-portastudio-414-mkii%2F
+[127] https://www.woovebox.com/
+[128] https://dirtywave.com/
+[129] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[130] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[131] https://www.gearpatrol.com/tech/audio/a45461959/tascam-portastudio-414-mkii/#product-1018365f-aed1-4bbd-86ea-466ab005acb7-anchor
+[132] https://go.redirectingat.com/?id=31959X896062&url=https%3A%2F%2Freverb.com%2Fmarketplace%3Fproduct_type%3Dpro-audio%26query%3DTASCAM+Portastudio+414+MKII+4-Track+Cassette+Recorder
+[133] https://www.gearpatrol.com/tech/audio/a41601961/vintage-cassette-player/
+[134] https://www.gearpatrol.com/tech/a36356719/cassette-tape-player-revival/
+[136] https://www.gearpatrol.com/tech/audio/
+[137] https://www.gearpatrol.com/tech/audio/a44118957/best-vinyl-records-picked-by-experts/
+[138] https://www.gearpatrol.com/tech/audio/a46326970/best-audio-ces-2024/
+[139] https://www.gearpatrol.com/tech/audio/a42030769/best-floorstanding-speakers/
+[140] https://www.gearpatrol.com/tech/audio/a46260579/modern-speakers-trend/
+[141] https://www.gearpatrol.com/tech/audio/a46275100/best-wireless-subwoofer/
+[142] https://www.gearpatrol.com/tech/audio/a46168154/best-new-hi-fi-audio-gear-2023/
+[143] https://www.gearpatrol.com/tech/audio/a45908277/apple-tv-volume-control-setting/
+[144] https://www.gearpatrol.com/tech/audio/a46200182/favorite-headphones-2023/
+[145] https://www.gearpatrol.com/tech/audio/a360311/best-wireless-multiroom-speakers/
+[146] https://www.gearpatrol.com/tech/audio/a33809800/hi-fi-wireless-sound-quality-explained/
+[147] https://www.gearpatrol.com/
+[148] https://www.facebook.com/gearpatrol/
+[149] https://twitter.com/gearpatrol
+[150] https://www.youtube.com/gearpatrol
+[151] https://www.instagram.com/gearpatrol/
+[152] https://www.gearpatrol.com/about/a2281/about/
+[153] https://www.gearpatrol.com/briefings/today-in-gear/
+[154] https://www.gearpatrol.com/deals/
+[155] https://www.gearpatrol.com/gift-guides/
+[156] https://www.dpreview.com/
+[157] https://www.gearpatrol.com/watches/
+[158] https://www.gearpatrol.com/cars/
+[159] https://www.gearpatrol.com/style/
+[160] https://www.gearpatrol.com/outdoors/
+[161] https://www.gearpatrol.com/fitness/
+[162] https://www.gearpatrol.com/food/
+[163] https://www.gearpatrol.com/home/
+[164] https://www.gearpatrol.com/tech/
+[165] https://www.gearpatrol.com/about/a40849193/about-gear-patrol-magazine/
+[166] https://email.gearpatrol.com/subscribe
+[167] https://studios.gearpatrol.com/
+[168] https://www.gearpatrol.com/about/a43276360/how-we-evaluate-products/
+[169] https://studios.gearpatrol.com/contact/
+[170] https://info.wrightsmedia.com/gearpatrol-licensing-reprints
+[171] https://www.gearpatrol.com/rss/all.xml/
+[172] https://www.hearst.com/-/us-magazines-privacy-notice
+[173] https://www.hearst.com/-/us-magazines-privacy-notice#_ADDITIONAL_INFO
+[174] https://www.hearst.com/-/us-magazines-privacy-notice#_ADDITIONAL_INFO
+[175] https://www.hearst.com/-/us-magazines-privacy-notice#_OPT_OUTS
+[176] https://www.hearst.com/-/us-magazines-terms-of-use
+[177] https://www.gearpatrol.com/sitemap/
diff --git a/static/archive/www-infoelba-com-beacbk.txt b/static/archive/www-infoelba-com-beacbk.txt
index 03b0a3e..1ddb8a6 100644
--- a/static/archive/www-infoelba-com-beacbk.txt
+++ b/static/archive/www-infoelba-com-beacbk.txt
@@ -1,550 +1,542 @@
- #[1]alternate [2]alternate [3]alternate [4]alternate
+*
+Menu
- [tr?id=126960367902655&ev=PageView&noscript=1]
+ • [2] Getting about
- (BUTTON) Menu
+ Getting about
- * [5]Getting about
+ [3]Back
+ □ [4] Rentals
+ □ [5] Taxi services
+ □ [6] Bus services
+ □ [7] Park areas
+ • [8] Stays
+ • [9] Eat
+ • [10] Sea
-Getting about
- [6]Back
- + [7]Rentals
- + [8]Taxi services
- + [9]Bus services
- + [10]Park areas
- * [11]Stays
- * [12]Eat
- * [13]Sea
+ Sea
-Sea
- [14]Back
- + [15]Beaches
- + [16]Bathing establishments
- + [17]Diving centers
- + [18]Sailing
- * [19]Guided excursions
- * [20]Sports
- * [21]Places to see
- * [22]Special offers
- * [23]Last minute offers
- * [24]Ferries
+ [11]Back
+ □ [12] Beaches
+ □ [13] Bathing establishments
+ □ [14] Diving centers
+ □ [15] Sailing
+ • [16] Guided excursions
+ • [17] Sports
+ • [18] Places to see
+ • [19] Special offers
+ • [20] Last minute offers
+ • [21] Ferries
- Search on the site ____________________
- (BUTTON) Start the search
- *
- *
- *
- *
+Search on the site [22][ ]
+Start the search
+ • [24]
+ • [25]
+ • [26]
+ • [27]
- *
- *
- *
- *
+ • [28][it-IT]
+ • [29][en-GB]
+ • [30][de-DE]
+ • [31][fr-FR]
- (BUTTON) Navigation [25]Infoelba
- * [26]Get to Elba
- + [27]How to get there Getting to the Island of Elba
- + [28]Ferries The shipping companies that connect the island
- + [29]Getting about on the island Public transport and taxis
- + [30]Hire Car, motorbike and boat hire/rental
- * [31]Stay
- + [32]Hotels Hotels to meet all needs
- + [33]Residences For an independent holiday
- + [34]Bed & Breakfasts Always ready to discover the island
- + [35]Apartments Feeling at home in Elba
- + [36]Small villas and detached houses For an autonomous holiday
- + [37]Villas Surrounded by luxury and relaxation
- + [38]Farm holiday centres Nature and flavours everywhere
- + [39]Campsites Socializing and having a good time surrounded by
- nature
- + [40]Camper and caravan Parking, water tank and facility areas
- + [41]Farm holiday campsites An open air holiday
- + [42]Accommodation that is open all year round Elba: a
- destination for all seasons
- + [43]Luxury accommodation For a dream vacation
- + [44]Tourist agencies and realtors Let your holiday be
- organised for you
- * [45]Eat
- + [46]Restaurants and Pizzerias Typical sea, home or more
- refined cuisine
- + [47]Food & Wine Experience Experiences of gastronomy and wine
- tasting
- + [48]Local recipes The best dishes of the Elba cuisine
- + [49]Wines Aleatico, Moscato and Ansonica: Elba wines
- + [50]Herbs and typical products Honey, beer, oil, wild and
- aromatic plants
- + [51]Typical dishes History and origins of Elba dishes
- * [52]Useful information
- + [53]ElbaOK Insurance The anti Covid-19 policy and much more
- + [54]Useful phone numbers and addresses Public and emergency
- utilities
- + [55]Weather Temperatures and weather forecast
- + [56]Webcams A window always open on the Elbe
- + [57]Apps for your smartphone Elba on your mobile
- * [58]Visit Elba
- + [59]Beaches and coasts A different beach each day
- + [60]Places to see Museums, ancient monuments, breathtaking
- views
- + [61]Tuscan Archipelago National Park Seven pearls rising up
- from the sea
- + [62]Guided excursions Letting others take you round the island
- + [63]Useful advice What to do if...
- + [64]Maps of the Island of Elba The Island in the palm of your
- hand
- + [65]I am... Elba just as it suits you
- + [66]Recommended itineraries What can we go and see today?
- * [67]Sports and free time
- + [68]Water sports Scuba diving, going snorkelling, fishing,
- sailing
- + [69]Land sports Cycling, trekking, free climbing!
- + [70]Elba not to be missed The unmissable experiences to do on
- holiday
- + [71]Outdoor sports Elba: A paradise for lovers of outdoor
- sports
- + [72]Enjoyment and relaxation Night life, cinemas and much more
- + [73]Courses and study trips Learn while you have fun
- + [74]Shopping Scents, colors and flavors of Elba
- + [75]Special events and exhibitions What shall we do this
- evening?
- * [76]Discovering Elba
- + [77]How many beaches are there in Elba? 126 beaches of 1000
- colours
- + [78]Paths and tracksin Elba 1000 paths to live the island to
- the full
- + [79]Elba in winter Making the most of Elba all year round
- + [80]Interesting facts A different Elba
- + [81]History of Elba Historical notes concerning Elba and its
- origins
- + [82]Geology of Elba Geological origins of the Island of Elba
- + [83]Towns of Elba Administration of Elba and its eight
- Communes
- + [84]Media Gallery Live and feel Elba through photographs
- * [85]Webcams
+Navigation [33] Infoelba
- [86]Infoelba - Dove natura è vacanza
- *
- *
- *
- *
- *
- * [87]0
+ • [34]Get to Elba [35]
+ □ [36] How to get there Getting to the Island of Elba
+ □ [37] Ferries The shipping companies that connect the island
+ □ [38] Getting about on the island Public transport and taxis
+ □ [39] Hire Car, motorbike and boat hire/rental
+ • [40]Stay [41]
+ □ [42] Hotels Hotels to meet all needs
+ □ [43] Residences For an independent holiday
+ □ [44] Bed & Breakfasts Always ready to discover the island
+ □ [45] Apartments Feeling at home in Elba
+ □ [46] Small villas and detached houses For an autonomous holiday
+ □ [47] Villas Surrounded by luxury and relaxation
+ □ [48] Farm holiday centres Nature and flavours everywhere
+ □ [49] Campsites Socializing and having a good time surrounded by nature
+ □ [50] Camper and caravan Parking, water tank and facility areas
+ □ [51] Farm holiday campsites An open air holiday
+ □ [52] Accommodation that is open all year round Elba: a destination for
+ all seasons
+ □ [53] Luxury accommodation For a dream vacation
+ □ [54] Tourist agencies and realtors Let your holiday be organised for
+ you
+ • [55]Eat [56]
+ □ [57] Restaurants and Pizzerias Typical sea, home or more refined
+ cuisine
+ □ [58] Food & Wine Experience Experiences of gastronomy and wine tasting
+ □ [59] Local recipes The best dishes of the Elba cuisine
+ □ [60] Wines Aleatico, Moscato and Ansonica: Elba wines
+ □ [61] Herbs and typical products Honey, beer, oil, wild and aromatic
+ plants
+ □ [62] Typical dishes History and origins of Elba dishes
+ • [63]Useful information [64]
+ □ [65] ElbaOK Insurance The anti Covid-19 policy and much more
+ □ [66] Useful phone numbers and addresses Public and emergency utilities
+ □ [67] Weather Temperatures and weather forecast
+ □ [68] Webcams A window always open on the Elbe
+ □ [69] Apps for your smartphone Elba on your mobile
+ • [70]Visit Elba [71]
+ □ [72] Beaches and coasts A different beach each day
+ □ [73] Places to see Museums, ancient monuments, breathtaking views
+ □ [74] Tuscan Archipelago National Park Seven pearls rising up from the
+ sea
+ □ [75] Guided excursions Letting others take you round the island
+ □ [76] Useful advice What to do if...
+ □ [77] Maps of the Island of Elba The Island in the palm of your hand
+ □ [78] I am... Elba just as it suits you
+ □ [79] Recommended itineraries What can we go and see today?
+ • [80]Sports and free time [81]
+ □ [82] Water sports Scuba diving, going snorkelling, fishing, sailing
+ □ [83] Land sports Cycling, trekking, free climbing!
+ □ [84] Elba not to be missed The unmissable experiences to do on holiday
+ □ [85] Outdoor sports Elba: A paradise for lovers of outdoor sports
+ □ [86] Enjoyment and relaxation Night life, cinemas and much more
+ □ [87] Courses and study trips Learn while you have fun
+ □ [88] Shopping Scents, colors and flavors of Elba
+ □ [89] Special events and exhibitions What shall we do this evening?
+ • [90]Discovering Elba [91]
+ □ [92] How many beaches are there in Elba? 126 beaches of 1000 colours
+ □ [93] Paths and tracksin Elba 1000 paths to live the island to the full
+ □ [94] Elba in winter Making the most of Elba all year round
+ □ [95] Interesting facts A different Elba
+ □ [96] History of Elba Historical notes concerning Elba and its origins
+ □ [97] Geology of Elba Geological origins of the Island of Elba
+ □ [98] Towns of Elba Administration of Elba and its eight Communes
+ □ [99] Media Gallery Live and feel Elba through photographs
+ • [100] Webcams
+
+[101] Infoelba - Dove natura è vacanza
+
+ • [102]
+ • [103]
+ • [104]
+ • [105]
+ • [106]
+ • [107] 0
Cavo, Island of Elba
- (BUTTON)
- (BUTTON) Navigation
- * [88]Looking for accommodation
- * [89]Accommodation price and availability
- * [90]Last minute booking
- * [91]Offers
- * [92]Ferry tickets
- * [93]Real estate ads
+Navigation
- Search on the site
- ____________________ (BUTTON) Start the search
- 1. [94]Island of Elba
- 2. [95]Discovering Elba
- 3. [96]Communes and towns
- 4. [97]Rio Marina
- 5. Cavo
+ • [110] Looking for accommodation
+ • [111] Accommodation price and availability
+ • [112] Last minute booking
+ • [113] Offers
+ • [114] Ferry tickets
+ • [115] Real estate ads
+
+Search on the site
+[116][ ] Start the search
+ 1. [118]Island of Elba
+ 2. [119]Discovering Elba
+ 3. [120]Communes and towns
+ 4. [121]Rio Marina
+ 5. Cavo
The small town is the nearest place to the mainland
- Cavo is a beach resort, fully equipped for tourists, with a sandy beach
- that goes as far as Capo Castello, where there are the remains of a
- [98]Roman villa from the first century AD, and a beautiful coastline of
- cliffs that goes from Capo Castello to Capo della Vita.
+[o_cavo_dro]
- The small port is the nearest place to the mainland, and has water and
- refuelling facilities for pleasure boats. In 1849, Giuseppe Garibaldi
- stopped there on his way to the Island of Caprera.
+Cavo is a beach resort, fully equipped for tourists, with a sandy beach that
+goes as far as Capo Castello, where there are the remains of a [122]Roman villa
+from the first century AD, and a beautiful coastline of cliffs that goes from
+Capo Castello to Capo della Vita.
- You can also admire the [99]Tonietti Mausoleum here; it is a unique,
- liberty style building that stands out above the wild vegetation on the
- island, and was designed by the architect Adolfo Coppedè
- (Florence 1871 - Montemurlo 1951) on behalf of the Tonietti family who
- wanted a sepulchral chapel. The Toniettis were the first
- concessionaires of the iron mines on the eastern side of Elba after the
- unification of Italy. Coppedè is known for the Via Dora area in Rome.
- *
- *
- *
+The small port is the nearest place to the mainland, and has water and
+refuelling facilities for pleasure boats. In 1849, Giuseppe Garibaldi stopped
+there on his way to the Island of Caprera.
- Request a free quote [100]0 My choice
+You can also admire the [123]Tonietti Mausoleum here; it is a unique, liberty
+style building that stands out above the wild vegetation on the island, and was
+designed by the architect Adolfo Coppedè (Florence 1871 - Montemurlo 1951) on
+behalf of the Tonietti family who wanted a sepulchral chapel. The Toniettis
+were the first concessionaires of the iron mines on the eastern side of Elba
+after the unification of Italy. Coppedè is known for the Via Dora area in Rome.
- Arrival ____________________
- Length [1 week___]
- Adults [2_]
- Children [0_]
- (BUTTON) Request a quote
- ElbaOk
+ • [124][app-elbasp]
+ • [125][infoelba-a]
+ • [126][guide-info]
- Do you want to book your holidays in time but you’re afraid of
- unexpected events (such as Coronavirus)? Insure your holidays with
- ElbaOK!
+Request a free quote [127] 0 My choice
+Arrival [128][ ]
+Length [129][1 week ]
+Adults [130][2 ]
+Children [131][0 ]
+Request a quote
+ElbaOk
- [101]Read more
+Do you want to book your holidays in time but you’re afraid of unexpected
+events (such as Coronavirus)? Insure your holidays with ElbaOK!
+
+[133] Read more
Advice from Infoelba
- [102]Cavo[103]Cala delle Alghe[104]GTE
+[134]Cavo[135]Cala delle Alghe[136]GTE
Further reading
- [105]Roman Villa of Capo Castello[106]Tonietti Mausoleum
- *
- *
- *
+[137]Roman Villa of Capo Castello[138]Tonietti Mausoleum
+[139] [o_dsc_5090]
+[140] [o_cavo_1]
+[141] [o_dsc_5052]
+[142] [o_dsc_5096]
+[143] [o_dsc_5111]
+[144] [o_dsc_5121]
- [107]See more
+ • [145][app-elbasp]
+ • [146][infoelba-a]
+ • [147][guide-info]
-[108]Elbadoc Camping Village 3 stars
+[148][featured] See more
- Cavo, Rio Marina
+[149]Elbadoc Camping Village 3 stars
- +39.0565949966
+Cavo, Rio Marina
- +39.3292262698
- [109]Contacts[110] Memorize
- [111]See more
++39.0565949966
-[112]Agriturismo Amandolo 3 ears
++39.3292262698
- Cavo, Rio Marina
+[150] Contacts[151] Memorize
+[152][featured] See more
- +39.0565931908
- [113]Contacts[114] Memorize
- [115]See more
+[153]Agriturismo Amandolo 3 ears
-[116]Ristoro dell'Amandolo
+Cavo, Rio Marina
- Cavo, Rio Marina
++39.0565931908
- +39.0565931908
- [117]Contacts[118] Memorize
- [119]See more
+[154] Contacts[155] Memorize
+[156][featured] See more
-[120]Appartamento La Luciana
+[157]Ristoro dell'Amandolo
- Cavo, Rio Marina
+Cavo, Rio Marina
- +39.3473107818
- [121]Contacts[122] Memorize
- * [123]Get to Elba
- * [124]How to get there
- * [125]Ferries
- * [126]Getting about on the island
- * [127]Hire
++39.0565931908
- * [128]Stay
- * [129]Hotels
- * [130]Residences
- * [131]Bed & Breakfasts
- * [132]Apartments
- * [133]Small villas and detached houses
- * [134]Villas
- * [135]Farm holiday centres
- * [136]Campsites
- * [137]Camper and caravan
- * [138]Farm holiday campsites
- * [139]Accommodation that is open all year round
- * [140]Luxury accommodation
- * [141]Tourist agencies and realtors
+[158] Contacts[159] Memorize
+[160][featured] See more
- * [142]Eat
- * [143]Restaurants and Pizzerias
- * [144]Food & Wine Experience
- * [145]Local recipes
- * [146]Wines
- * [147]Herbs and typical products
- * [148]Typical dishes
+[161]Appartamento La Luciana
- * [149]Useful information
- * [150]ElbaOK Insurance
- * [151]Useful phone numbers and addresses
- * [152]Weather
- * [153]Webcams
- * [154]Apps for your smartphone
+Cavo, Rio Marina
- * [155]Visit Elba
- * [156]Beaches and coasts
- * [157]Places to see
- * [158]Tuscan Archipelago National Park
- * [159]Guided excursions
- * [160]Useful advice
- * [161]Maps of the Island of Elba
- * [162]I am...
- * [163]Recommended itineraries
++39.3473107818
- * [164]Sports and free time
- * [165]Water sports
- * [166]Land sports
- * [167]Elba not to be missed
- * [168]Outdoor sports
- * [169]Enjoyment and relaxation
- * [170]Courses and study trips
- * [171]Shopping
- * [172]Special events and exhibitions
+[162] Contacts[163] Memorize
+[164] [app-infoel]
- * [173]Discovering Elba
- * [174]How many beaches are there in Elba?
- * [175]Paths and tracksin Elba
- * [176]Elba in winter
- * [177]Interesting facts
- * [178]History of Elba
- * [179]Geology of Elba
- * [180]Towns of Elba
- * [181]Media Gallery
+ • [165]Get to Elba
+ • [166]How to get there
+ • [167]Ferries
+ • [168]Getting about on the island
+ • [169]Hire
- * [182]Webcams
+ • [170]Stay
+ • [171]Hotels
+ • [172]Residences
+ • [173]Bed & Breakfasts
+ • [174]Apartments
+ • [175]Small villas and detached houses
+ • [176]Villas
+ • [177]Farm holiday centres
+ • [178]Campsites
+ • [179]Camper and caravan
+ • [180]Farm holiday campsites
+ • [181]Accommodation that is open all year round
+ • [182]Luxury accommodation
+ • [183]Tourist agencies and realtors
- Infoelba non si assume alcuna responsabilità per l'uso di marchi e
- slogan usati dagli inserzionisti e per eventuali errate indicazioni.
+ • [184]Eat
+ • [185]Restaurants and Pizzerias
+ • [186]Food & Wine Experience
+ • [187]Local recipes
+ • [188]Wines
+ • [189]Herbs and typical products
+ • [190]Typical dishes
- Informa inoltre che i listini prezzi, orari, date o altro materiale
- informativo pubblicato su questo sito è suscettibile a variazioni.
+ • [191]Useful information
+ • [192]ElbaOK Insurance
+ • [193]Useful phone numbers and addresses
+ • [194]Weather
+ • [195]Webcams
+ • [196]Apps for your smartphone
- :: Siete quindi invitati a chiedere conferma alle strutture interessate
- ::
- Infoelba
+ • [197]Visit Elba
+ • [198]Beaches and coasts
+ • [199]Places to see
+ • [200]Tuscan Archipelago National Park
+ • [201]Guided excursions
+ • [202]Useful advice
+ • [203]Maps of the Island of Elba
+ • [204]I am...
+ • [205]Recommended itineraries
- ©1999-2024 Infoelba s.r.l. Unipersonale - Viale Teseo Tesei, 12 -
- Centro Servizi Il Molino - 57037 Portoferraio (LI)
+ • [206]Sports and free time
+ • [207]Water sports
+ • [208]Land sports
+ • [209]Elba not to be missed
+ • [210]Outdoor sports
+ • [211]Enjoyment and relaxation
+ • [212]Courses and study trips
+ • [213]Shopping
+ • [214]Special events and exhibitions
- P. IVA e C.F. 01130150491 - capitale sociale €10.000,00 i.v. - registro
- imprese numero 01130150491 - REA: LI - 100635
+ • [215]Discovering Elba
+ • [216]How many beaches are there in Elba?
+ • [217]Paths and tracksin Elba
+ • [218]Elba in winter
+ • [219]Interesting facts
+ • [220]History of Elba
+ • [221]Geology of Elba
+ • [222]Towns of Elba
+ • [223]Media Gallery
- [183]infoelba® it is a registered trademark - all rights reserved -
- [184]Accesso all'area riservata - [185]Privacy Policy - [186]Cookie
- Policy
+ • [224] Webcams
- (BUTTON) top
+Infoelba non si assume alcuna responsabilità per l'uso di marchi e slogan usati
+dagli inserzionisti e per eventuali errate indicazioni.
- (BUTTON) ×Chiudi
+Informa inoltre che i listini prezzi, orari, date o altro materiale informativo
+pubblicato su questo sito è suscettibile a variazioni.
- (BUTTON) Close
+:: Siete quindi invitati a chiedere conferma alle strutture interessate ::
-References
+Infoelba
- Visible links:
- 1. https://www.infoelba.net/elba-entdecken/gemeinden-ortschaften/rio-marina/cavo/
- 2. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 3. https://www.iledelbe.net/decouvrir-elbe/communes-villes/rio-marina/cavo/
- 4. https://www.infoelba.it/scoprire-elba/comuni-paesi/rio-marina/cavo/
- 5. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 6. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 7. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
- 8. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/taxis/
- 9. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/buses/
- 10. https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/campers-caravas-facilities/
- 11. https://www.infoelba.com/where-to-sleep/search/
- 12. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
- 13. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 14. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 15. https://www.infoelba.com/island-of-elba/beaches/
- 16. https://www.infoelba.com/island-of-elba/beaches/bathing-establishments/
- 17. https://www.infoelba.com/sports-free-time/water-sports/diving/
- 18. https://www.infoelba.com/sports-free-time/water-sports/sailing/
- 19. https://www.infoelba.com/island-of-elba/guided-excursions/
- 20. https://www.infoelba.com/sports-free-time/
- 21. https://www.infoelba.com/island-of-elba/places-to-see/
- 22. https://www.infoelba.com/special-offers-island-of-elba/
- 23. https://www.infoelba.com/island-of-elba-last-minute-booking/
- 24. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
- 25. https://www.infoelba.com/
- 26. https://www.infoelba.com/arriving-getting-about/
- 27. https://www.infoelba.com/arriving-getting-about/how-to-get-there/
- 28. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
- 29. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
- 30. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
- 31. https://www.infoelba.com/where-to-sleep/
- 32. https://www.infoelba.com/where-to-sleep/hotels/
- 33. https://www.infoelba.com/where-to-sleep/residences/
- 34. https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
- 35. https://www.infoelba.com/where-to-sleep/apartments/
- 36. https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
- 37. https://www.infoelba.com/where-to-sleep/villas/
- 38. https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
- 39. https://www.infoelba.com/where-to-sleep/campsites/
- 40. https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
- 41. https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
- 42. https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
- 43. https://www.infoelba.com/where-to-sleep/luxury-holidays/
- 44. https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
- 45. https://www.infoelba.com/eating-cuisine/
- 46. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
- 47. https://www.infoelba.com/eating-cuisine/food-wine-experience/
- 48. https://www.infoelba.com/eating-cuisine/local-recipes/
- 49. https://www.infoelba.com/eating-cuisine/elba-wines/
- 50. https://www.infoelba.com/eating-cuisine/herbs-typical-products/
- 51. https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
- 52. https://www.infoelba.com/useful-information/
- 53. https://www.infoelba.com/useful-information/elbaok-insurance/
- 54. https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
- 55. https://www.infoelba.com/useful-information/weather-island-of-elba/
- 56. https://www.infoelba.com/useful-information/webcams/
- 57. https://www.infoelba.com/useful-information/smartphone-apps/
- 58. https://www.infoelba.com/island-of-elba/
- 59. https://www.infoelba.com/island-of-elba/beaches/
- 60. https://www.infoelba.com/island-of-elba/places-to-see/
- 61. https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
- 62. https://www.infoelba.com/island-of-elba/guided-excursions/
- 63. https://www.infoelba.com/island-of-elba/suggestions/
- 64. https://www.infoelba.com/island-of-elba/maps/
- 65. https://www.infoelba.com/island-of-elba/personalized-holidays/
- 66. https://www.infoelba.com/island-of-elba/recommended-itineraries/
- 67. https://www.infoelba.com/sports-free-time/
- 68. https://www.infoelba.com/sports-free-time/water-sports/
- 69. https://www.infoelba.com/sports-free-time/land-sports/
- 70. https://www.infoelba.com/sports-free-time/elba-experiences/
- 71. https://www.infoelba.com/sports-free-time/outdoor-sports/
- 72. https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
- 73. https://www.infoelba.com/sports-free-time/courses-study-trips/
- 74. https://www.infoelba.com/sports-free-time/shopping/
- 75. https://www.infoelba.com/sports-free-time/special-events-exhibitions/
- 76. https://www.infoelba.com/discovering-elba/
- 77. https://www.infoelba.com/elba-beaches/
- 78. https://www.infoelba.com/elba-paths-routes/
- 79. https://www.infoelba.com/elba-winter/
- 80. https://www.infoelba.com/discovering-elba/interesting-facts/
- 81. https://www.infoelba.com/discovering-elba/history-of-elba/
- 82. https://www.infoelba.com/discovering-elba/geology-of-elba/
- 83. https://www.infoelba.com/discovering-elba/communes-towns/
- 84. https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
- 85. https://www.infoelba.com/useful-information/webcams/
- 86. https://www.infoelba.com/
- 87. https://www.infoelba.com/my-choice/
- 88. https://www.infoelba.com/where-to-sleep/search/
- 89. https://www.infoelba.com/accommodation-price-availability/
- 90. https://www.infoelba.com/island-of-elba-last-minute-booking/
- 91. https://www.infoelba.com/special-offers-island-of-elba/
- 92. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
- 93. https://www.infoelba.com/real-estate-ads-elba/
- 94. https://www.infoelba.com/
- 95. https://www.infoelba.com/discovering-elba/
- 96. https://www.infoelba.com/discovering-elba/communes-towns/
- 97. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/
- 98. https://www.infoelba.com/island-of-elba/places-to-see/historical-places/roman-villa-capo-castello/
- 99. https://www.infoelba.com/island-of-elba/places-to-see/historical-places/tonietti-mausoleum/
- 100. https://www.infoelba.com/my-choice/
- 101. https://www.infoelba.com/useful-information/covid-19-safe-holidays/elbaok-insurance/
- 102. https://www.infoelba.com/island-of-elba/beaches/cavo-beach/
- 103. https://www.infoelba.com/island-of-elba/beaches/cala-delle-alghe-beach/
- 104. https://www.infoelba.com/sports-free-time/land-sports/trekking/routes-paths/gte/
- 105. https://www.infoelba.com/island-of-elba/places-to-see/historical-places/roman-villa-capo-castello/
- 106. https://www.infoelba.com/island-of-elba/places-to-see/historical-places/tonietti-mausoleum/
- 107. https://www.infoelba.com/where-to-sleep/campsites/elbadoc-camping-village-1511/
- 108. https://www.infoelba.com/where-to-sleep/campsites/elbadoc-camping-village-1511/
- 109. https://www.infoelba.com/requests/direct-popup.asp?struttura=1511
- 110. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 111. https://www.infoelba.com/where-to-sleep/farm-holiday-centres/agriturismo-amandolo-1666/
- 112. https://www.infoelba.com/where-to-sleep/farm-holiday-centres/agriturismo-amandolo-1666/
- 113. https://www.infoelba.com/requests/direct-popup.asp?struttura=1666
- 114. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 115. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/ristoro-dell-amandolo-1667/
- 116. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/ristoro-dell-amandolo-1667/
- 117. https://www.infoelba.com/requests/direct-popup.asp?struttura=1667
- 118. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 119. https://www.infoelba.com/where-to-sleep/apartments/appartamento-la-luciana-1739/
- 120. https://www.infoelba.com/where-to-sleep/apartments/appartamento-la-luciana-1739/
- 121. https://www.infoelba.com/requests/direct-popup.asp?struttura=1739
- 122. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 123. https://www.infoelba.com/arriving-getting-about/
- 124. https://www.infoelba.com/arriving-getting-about/how-to-get-there/
- 125. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
- 126. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
- 127. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
- 128. https://www.infoelba.com/where-to-sleep/
- 129. https://www.infoelba.com/where-to-sleep/hotels/
- 130. https://www.infoelba.com/where-to-sleep/residences/
- 131. https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
- 132. https://www.infoelba.com/where-to-sleep/apartments/
- 133. https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
- 134. https://www.infoelba.com/where-to-sleep/villas/
- 135. https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
- 136. https://www.infoelba.com/where-to-sleep/campsites/
- 137. https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
- 138. https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
- 139. https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
- 140. https://www.infoelba.com/where-to-sleep/luxury-holidays/
- 141. https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
- 142. https://www.infoelba.com/eating-cuisine/
- 143. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
- 144. https://www.infoelba.com/eating-cuisine/food-wine-experience/
- 145. https://www.infoelba.com/eating-cuisine/local-recipes/
- 146. https://www.infoelba.com/eating-cuisine/elba-wines/
- 147. https://www.infoelba.com/eating-cuisine/herbs-typical-products/
- 148. https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
- 149. https://www.infoelba.com/useful-information/
- 150. https://www.infoelba.com/useful-information/elbaok-insurance/
- 151. https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
- 152. https://www.infoelba.com/useful-information/weather-island-of-elba/
- 153. https://www.infoelba.com/useful-information/webcams/
- 154. https://www.infoelba.com/useful-information/smartphone-apps/
- 155. https://www.infoelba.com/island-of-elba/
- 156. https://www.infoelba.com/island-of-elba/beaches/
- 157. https://www.infoelba.com/island-of-elba/places-to-see/
- 158. https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
- 159. https://www.infoelba.com/island-of-elba/guided-excursions/
- 160. https://www.infoelba.com/island-of-elba/suggestions/
- 161. https://www.infoelba.com/island-of-elba/maps/
- 162. https://www.infoelba.com/island-of-elba/personalized-holidays/
- 163. https://www.infoelba.com/island-of-elba/recommended-itineraries/
- 164. https://www.infoelba.com/sports-free-time/
- 165. https://www.infoelba.com/sports-free-time/water-sports/
- 166. https://www.infoelba.com/sports-free-time/land-sports/
- 167. https://www.infoelba.com/sports-free-time/elba-experiences/
- 168. https://www.infoelba.com/sports-free-time/outdoor-sports/
- 169. https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
- 170. https://www.infoelba.com/sports-free-time/courses-study-trips/
- 171. https://www.infoelba.com/sports-free-time/shopping/
- 172. https://www.infoelba.com/sports-free-time/special-events-exhibitions/
- 173. https://www.infoelba.com/discovering-elba/
- 174. https://www.infoelba.com/elba-beaches/
- 175. https://www.infoelba.com/elba-paths-routes/
- 176. https://www.infoelba.com/elba-winter/
- 177. https://www.infoelba.com/discovering-elba/interesting-facts/
- 178. https://www.infoelba.com/discovering-elba/history-of-elba/
- 179. https://www.infoelba.com/discovering-elba/geology-of-elba/
- 180. https://www.infoelba.com/discovering-elba/communes-towns/
- 181. https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
- 182. https://www.infoelba.com/useful-information/webcams/
- 183. https://www.infoelba.com/
- 184. https://areariservata.infoelba.it/
- 185. https://www.infoelba.com/privacy-policy/
- 186. https://www.infoelba.com/cookie-policy/
+©1999-2024 Infoelba s.r.l. Unipersonale - Viale Teseo Tesei, 12 - Centro
+Servizi Il Molino - 57037 Portoferraio (LI)
- Hidden links:
- 188. https://facebook.com/Infoelba
- 189. https://twitter.com/infoelba
- 190. https://instagram.com/infoelba
- 191. https://youtube.com/infoelba
- 192. https://www.infoelba.it/scoprire-elba/comuni-paesi/rio-marina/cavo/
- 193. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 194. https://www.infoelba.net/elba-entdecken/gemeinden-ortschaften/rio-marina/cavo/
- 195. https://www.iledelbe.net/decouvrir-elbe/communes-villes/rio-marina/cavo/
- 196. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 197. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 198. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 199. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 200. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 201. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 202. https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
- 203. https://www.infoelba.com/where-to-sleep/search/
- 204. https://www.infoelba.com/accommodation-price-availability/
- 205. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
- 206. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/booking-on-line/
- 207. https://www.infoelba.com/arriving-getting-about/how-to-get-there/planes/
- 208. https://www.infoelba.com/useful-information/smartphone-apps/#elbatraghetti
- 209. https://www.infoelba.com/real-estate-ads-elba/
- 210. https://www.infoelba.com/useful-information/smartphone-apps/#elbaspiagge
- 211. https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5090.jpg?quality=90&mode=crop&w=1280
- 212. https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_cavo_1.jpg?quality=90&mode=crop&w=1280
- 213. https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5052.jpg?quality=90&mode=crop&w=1280
- 214. https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5096.jpg?quality=90&mode=crop&w=1280
- 215. https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5111.jpg?quality=90&mode=crop&w=1280
- 216. https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5121.jpg?quality=90&mode=crop&w=1280
- 217. https://www.infoelba.com/useful-information/smartphone-apps/#elbatraghetti
- 218. https://www.infoelba.com/real-estate-ads-elba/
- 219. https://www.infoelba.com/useful-information/smartphone-apps/#elbaspiagge
- 220. https://www.infoelba.com/app
+P. IVA e C.F. 01130150491 - capitale sociale €10.000,00 i.v. - registro imprese
+numero 01130150491 - REA: LI - 100635
+
+[225]infoelba® it is a registered trademark - all rights reserved - [226]
+Accesso all'area riservata - [227]Privacy Policy - [228]Cookie Policy
+
+top
+×Chiudi
+
+Close
+
+References:
+
+[2] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[3] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[4] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
+[5] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/taxis/
+[6] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/buses/
+[7] https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/campers-caravas-facilities/
+[8] https://www.infoelba.com/where-to-sleep/search/
+[9] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
+[10] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[11] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[12] https://www.infoelba.com/island-of-elba/beaches/
+[13] https://www.infoelba.com/island-of-elba/beaches/bathing-establishments/
+[14] https://www.infoelba.com/sports-free-time/water-sports/diving/
+[15] https://www.infoelba.com/sports-free-time/water-sports/sailing/
+[16] https://www.infoelba.com/island-of-elba/guided-excursions/
+[17] https://www.infoelba.com/sports-free-time/
+[18] https://www.infoelba.com/island-of-elba/places-to-see/
+[19] https://www.infoelba.com/special-offers-island-of-elba/
+[20] https://www.infoelba.com/island-of-elba-last-minute-booking/
+[21] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
+[24] https://facebook.com/Infoelba
+[25] https://twitter.com/infoelba
+[26] https://instagram.com/infoelba
+[27] https://youtube.com/infoelba
+[28] https://www.infoelba.it/scoprire-elba/comuni-paesi/rio-marina/cavo/
+[29] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/
+[30] https://www.infoelba.net/elba-entdecken/gemeinden-ortschaften/rio-marina/cavo/
+[31] https://www.iledelbe.net/decouvrir-elbe/communes-villes/rio-marina/cavo/
+[33] https://www.infoelba.com/
+[34] https://www.infoelba.com/arriving-getting-about/
+[35] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[36] https://www.infoelba.com/arriving-getting-about/how-to-get-there/
+[37] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
+[38] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
+[39] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
+[40] https://www.infoelba.com/where-to-sleep/
+[41] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[42] https://www.infoelba.com/where-to-sleep/hotels/
+[43] https://www.infoelba.com/where-to-sleep/residences/
+[44] https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
+[45] https://www.infoelba.com/where-to-sleep/apartments/
+[46] https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
+[47] https://www.infoelba.com/where-to-sleep/villas/
+[48] https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
+[49] https://www.infoelba.com/where-to-sleep/campsites/
+[50] https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
+[51] https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
+[52] https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
+[53] https://www.infoelba.com/where-to-sleep/luxury-holidays/
+[54] https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
+[55] https://www.infoelba.com/eating-cuisine/
+[56] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[57] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
+[58] https://www.infoelba.com/eating-cuisine/food-wine-experience/
+[59] https://www.infoelba.com/eating-cuisine/local-recipes/
+[60] https://www.infoelba.com/eating-cuisine/elba-wines/
+[61] https://www.infoelba.com/eating-cuisine/herbs-typical-products/
+[62] https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
+[63] https://www.infoelba.com/useful-information/
+[64] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[65] https://www.infoelba.com/useful-information/elbaok-insurance/
+[66] https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
+[67] https://www.infoelba.com/useful-information/weather-island-of-elba/
+[68] https://www.infoelba.com/useful-information/webcams/
+[69] https://www.infoelba.com/useful-information/smartphone-apps/
+[70] https://www.infoelba.com/island-of-elba/
+[71] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[72] https://www.infoelba.com/island-of-elba/beaches/
+[73] https://www.infoelba.com/island-of-elba/places-to-see/
+[74] https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
+[75] https://www.infoelba.com/island-of-elba/guided-excursions/
+[76] https://www.infoelba.com/island-of-elba/suggestions/
+[77] https://www.infoelba.com/island-of-elba/maps/
+[78] https://www.infoelba.com/island-of-elba/personalized-holidays/
+[79] https://www.infoelba.com/island-of-elba/recommended-itineraries/
+[80] https://www.infoelba.com/sports-free-time/
+[81] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[82] https://www.infoelba.com/sports-free-time/water-sports/
+[83] https://www.infoelba.com/sports-free-time/land-sports/
+[84] https://www.infoelba.com/sports-free-time/elba-experiences/
+[85] https://www.infoelba.com/sports-free-time/outdoor-sports/
+[86] https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
+[87] https://www.infoelba.com/sports-free-time/courses-study-trips/
+[88] https://www.infoelba.com/sports-free-time/shopping/
+[89] https://www.infoelba.com/sports-free-time/special-events-exhibitions/
+[90] https://www.infoelba.com/discovering-elba/
+[91] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[92] https://www.infoelba.com/elba-beaches/
+[93] https://www.infoelba.com/elba-paths-routes/
+[94] https://www.infoelba.com/elba-winter/
+[95] https://www.infoelba.com/discovering-elba/interesting-facts/
+[96] https://www.infoelba.com/discovering-elba/history-of-elba/
+[97] https://www.infoelba.com/discovering-elba/geology-of-elba/
+[98] https://www.infoelba.com/discovering-elba/communes-towns/
+[99] https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
+[100] https://www.infoelba.com/useful-information/webcams/
+[101] https://www.infoelba.com/
+[102] https://www.infoelba.com/where-to-sleep/search/
+[103] https://www.infoelba.com/accommodation-price-availability/
+[104] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
+[105] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/booking-on-line/
+[106] https://www.infoelba.com/arriving-getting-about/how-to-get-there/planes/
+[107] https://www.infoelba.com/my-choice/
+[110] https://www.infoelba.com/where-to-sleep/search/
+[111] https://www.infoelba.com/accommodation-price-availability/
+[112] https://www.infoelba.com/island-of-elba-last-minute-booking/
+[113] https://www.infoelba.com/special-offers-island-of-elba/
+[114] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
+[115] https://www.infoelba.com/real-estate-ads-elba/
+[118] https://www.infoelba.com/
+[119] https://www.infoelba.com/discovering-elba/
+[120] https://www.infoelba.com/discovering-elba/communes-towns/
+[121] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/
+[122] https://www.infoelba.com/island-of-elba/places-to-see/historical-places/roman-villa-capo-castello/
+[123] https://www.infoelba.com/island-of-elba/places-to-see/historical-places/tonietti-mausoleum/
+[124] https://www.infoelba.com/useful-information/smartphone-apps/#elbaspiagge
+[125] https://www.infoelba.com/real-estate-ads-elba/
+[126] https://www.elbaspiagge.it/shop-guida/?aff=79
+[127] https://www.infoelba.com/my-choice/
+[133] https://www.infoelba.com/useful-information/covid-19-safe-holidays/elbaok-insurance/
+[134] https://www.infoelba.com/island-of-elba/beaches/cavo-beach/
+[135] https://www.infoelba.com/island-of-elba/beaches/cala-delle-alghe-beach/
+[136] https://www.infoelba.com/sports-free-time/land-sports/trekking/routes-paths/gte/
+[137] https://www.infoelba.com/island-of-elba/places-to-see/historical-places/roman-villa-capo-castello/
+[138] https://www.infoelba.com/island-of-elba/places-to-see/historical-places/tonietti-mausoleum/
+[139] https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5090.jpg?quality=90&mode=crop&w=1280
+[140] https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_cavo_1.jpg?quality=90&mode=crop&w=1280
+[141] https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5052.jpg?quality=90&mode=crop&w=1280
+[142] https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5096.jpg?quality=90&mode=crop&w=1280
+[143] https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5111.jpg?quality=90&mode=crop&w=1280
+[144] https://dati.infoelba.it/media/photos/isola-d-elba/paesi/rio-marina/cavo/o_dsc_5121.jpg?quality=90&mode=crop&w=1280
+[145] https://www.infoelba.com/useful-information/smartphone-apps/#elbaspiagge
+[146] https://www.infoelba.com/real-estate-ads-elba/
+[147] https://www.elbaspiagge.it/shop-guida/?aff=79
+[148] https://www.infoelba.com/where-to-sleep/campsites/elbadoc-camping-village-1511/
+[149] https://www.infoelba.com/where-to-sleep/campsites/elbadoc-camping-village-1511/
+[150] https://www.infoelba.com/requests/direct-popup.asp?struttura=1511
+[151] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[152] https://www.infoelba.com/where-to-sleep/farm-holiday-centres/agriturismo-amandolo-1666/
+[153] https://www.infoelba.com/where-to-sleep/farm-holiday-centres/agriturismo-amandolo-1666/
+[154] https://www.infoelba.com/requests/direct-popup.asp?struttura=1666
+[155] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[156] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/ristoro-dell-amandolo-1667/
+[157] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/ristoro-dell-amandolo-1667/
+[158] https://www.infoelba.com/requests/direct-popup.asp?struttura=1667
+[159] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[160] https://www.infoelba.com/where-to-sleep/apartments/appartamento-la-luciana-1739/
+[161] https://www.infoelba.com/where-to-sleep/apartments/appartamento-la-luciana-1739/
+[162] https://www.infoelba.com/requests/direct-popup.asp?struttura=1739
+[163] https://www.infoelba.com/discovering-elba/communes-towns/rio-marina/cavo/#
+[164] https://www.infoelba.com/app
+[165] https://www.infoelba.com/arriving-getting-about/
+[166] https://www.infoelba.com/arriving-getting-about/how-to-get-there/
+[167] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
+[168] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
+[169] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
+[170] https://www.infoelba.com/where-to-sleep/
+[171] https://www.infoelba.com/where-to-sleep/hotels/
+[172] https://www.infoelba.com/where-to-sleep/residences/
+[173] https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
+[174] https://www.infoelba.com/where-to-sleep/apartments/
+[175] https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
+[176] https://www.infoelba.com/where-to-sleep/villas/
+[177] https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
+[178] https://www.infoelba.com/where-to-sleep/campsites/
+[179] https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
+[180] https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
+[181] https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
+[182] https://www.infoelba.com/where-to-sleep/luxury-holidays/
+[183] https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
+[184] https://www.infoelba.com/eating-cuisine/
+[185] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
+[186] https://www.infoelba.com/eating-cuisine/food-wine-experience/
+[187] https://www.infoelba.com/eating-cuisine/local-recipes/
+[188] https://www.infoelba.com/eating-cuisine/elba-wines/
+[189] https://www.infoelba.com/eating-cuisine/herbs-typical-products/
+[190] https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
+[191] https://www.infoelba.com/useful-information/
+[192] https://www.infoelba.com/useful-information/elbaok-insurance/
+[193] https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
+[194] https://www.infoelba.com/useful-information/weather-island-of-elba/
+[195] https://www.infoelba.com/useful-information/webcams/
+[196] https://www.infoelba.com/useful-information/smartphone-apps/
+[197] https://www.infoelba.com/island-of-elba/
+[198] https://www.infoelba.com/island-of-elba/beaches/
+[199] https://www.infoelba.com/island-of-elba/places-to-see/
+[200] https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
+[201] https://www.infoelba.com/island-of-elba/guided-excursions/
+[202] https://www.infoelba.com/island-of-elba/suggestions/
+[203] https://www.infoelba.com/island-of-elba/maps/
+[204] https://www.infoelba.com/island-of-elba/personalized-holidays/
+[205] https://www.infoelba.com/island-of-elba/recommended-itineraries/
+[206] https://www.infoelba.com/sports-free-time/
+[207] https://www.infoelba.com/sports-free-time/water-sports/
+[208] https://www.infoelba.com/sports-free-time/land-sports/
+[209] https://www.infoelba.com/sports-free-time/elba-experiences/
+[210] https://www.infoelba.com/sports-free-time/outdoor-sports/
+[211] https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
+[212] https://www.infoelba.com/sports-free-time/courses-study-trips/
+[213] https://www.infoelba.com/sports-free-time/shopping/
+[214] https://www.infoelba.com/sports-free-time/special-events-exhibitions/
+[215] https://www.infoelba.com/discovering-elba/
+[216] https://www.infoelba.com/elba-beaches/
+[217] https://www.infoelba.com/elba-paths-routes/
+[218] https://www.infoelba.com/elba-winter/
+[219] https://www.infoelba.com/discovering-elba/interesting-facts/
+[220] https://www.infoelba.com/discovering-elba/history-of-elba/
+[221] https://www.infoelba.com/discovering-elba/geology-of-elba/
+[222] https://www.infoelba.com/discovering-elba/communes-towns/
+[223] https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
+[224] https://www.infoelba.com/useful-information/webcams/
+[225] https://www.infoelba.com/
+[226] https://areariservata.infoelba.it/
+[227] https://www.infoelba.com/privacy-policy/
+[228] https://www.infoelba.com/cookie-policy/
diff --git a/static/archive/www-infoelba-com-pmih4w.txt b/static/archive/www-infoelba-com-pmih4w.txt
index 1a16d29..81f1c85 100644
--- a/static/archive/www-infoelba-com-pmih4w.txt
+++ b/static/archive/www-infoelba-com-pmih4w.txt
@@ -1,601 +1,595 @@
- #[1]alternate [2]alternate [3]alternate [4]alternate
+*
+Menu
- [tr?id=126960367902655&ev=PageView&noscript=1]
+ • [2] Getting about
- (BUTTON) Menu
+ Getting about
- * [5]Getting about
+ [3]Back
+ □ [4] Rentals
+ □ [5] Taxi services
+ □ [6] Bus services
+ □ [7] Park areas
+ • [8] Stays
+ • [9] Eat
+ • [10] Sea
-Getting about
- [6]Back
- + [7]Rentals
- + [8]Taxi services
- + [9]Bus services
- + [10]Park areas
- * [11]Stays
- * [12]Eat
- * [13]Sea
+ Sea
-Sea
- [14]Back
- + [15]Beaches
- + [16]Bathing establishments
- + [17]Diving centers
- + [18]Sailing
- * [19]Guided excursions
- * [20]Sports
- * [21]Places to see
- * [22]Special offers
- * [23]Last minute offers
- * [24]Ferries
+ [11]Back
+ □ [12] Beaches
+ □ [13] Bathing establishments
+ □ [14] Diving centers
+ □ [15] Sailing
+ • [16] Guided excursions
+ • [17] Sports
+ • [18] Places to see
+ • [19] Special offers
+ • [20] Last minute offers
+ • [21] Ferries
- Search on the site ____________________
- (BUTTON) Start the search
- *
- *
- *
- *
+Search on the site [22][ ]
+Start the search
+ • [24]
+ • [25]
+ • [26]
+ • [27]
- *
- *
- *
- *
+ • [28][it-IT]
+ • [29][en-GB]
+ • [30][de-DE]
+ • [31][fr-FR]
- (BUTTON) Navigation [25]Infoelba
- * [26]Get to Elba
- + [27]How to get there Getting to the Island of Elba
- + [28]Ferries The shipping companies that connect the island
- + [29]Getting about on the island Public transport and taxis
- + [30]Hire Car, motorbike and boat hire/rental
- * [31]Stay
- + [32]Hotels Hotels to meet all needs
- + [33]Residences For an independent holiday
- + [34]Bed & Breakfasts Always ready to discover the island
- + [35]Apartments Feeling at home in Elba
- + [36]Small villas and detached houses For an autonomous holiday
- + [37]Villas Surrounded by luxury and relaxation
- + [38]Farm holiday centres Nature and flavours everywhere
- + [39]Campsites Socializing and having a good time surrounded by
- nature
- + [40]Camper and caravan Parking, water tank and facility areas
- + [41]Farm holiday campsites An open air holiday
- + [42]Accommodation that is open all year round Elba: a
- destination for all seasons
- + [43]Luxury accommodation For a dream vacation
- + [44]Tourist agencies and realtors Let your holiday be
- organised for you
- * [45]Eat
- + [46]Restaurants and Pizzerias Typical sea, home or more
- refined cuisine
- + [47]Food & Wine Experience Experiences of gastronomy and wine
- tasting
- + [48]Local recipes The best dishes of the Elba cuisine
- + [49]Wines Aleatico, Moscato and Ansonica: Elba wines
- + [50]Herbs and typical products Honey, beer, oil, wild and
- aromatic plants
- + [51]Typical dishes History and origins of Elba dishes
- * [52]Useful information
- + [53]ElbaOK Insurance The anti Covid-19 policy and much more
- + [54]Useful phone numbers and addresses Public and emergency
- utilities
- + [55]Weather Temperatures and weather forecast
- + [56]Webcams A window always open on the Elbe
- + [57]Apps for your smartphone Elba on your mobile
- * [58]Visit Elba
- + [59]Beaches and coasts A different beach each day
- + [60]Places to see Museums, ancient monuments, breathtaking
- views
- + [61]Tuscan Archipelago National Park Seven pearls rising up
- from the sea
- + [62]Guided excursions Letting others take you round the island
- + [63]Useful advice What to do if...
- + [64]Maps of the Island of Elba The Island in the palm of your
- hand
- + [65]I am... Elba just as it suits you
- + [66]Recommended itineraries What can we go and see today?
- * [67]Sports and free time
- + [68]Water sports Scuba diving, going snorkelling, fishing,
- sailing
- + [69]Land sports Cycling, trekking, free climbing!
- + [70]Elba not to be missed The unmissable experiences to do on
- holiday
- + [71]Outdoor sports Elba: A paradise for lovers of outdoor
- sports
- + [72]Enjoyment and relaxation Night life, cinemas and much more
- + [73]Courses and study trips Learn while you have fun
- + [74]Shopping Scents, colors and flavors of Elba
- + [75]Special events and exhibitions What shall we do this
- evening?
- * [76]Discovering Elba
- + [77]How many beaches are there in Elba? 126 beaches of 1000
- colours
- + [78]Paths and tracksin Elba 1000 paths to live the island to
- the full
- + [79]Elba in winter Making the most of Elba all year round
- + [80]Interesting facts A different Elba
- + [81]History of Elba Historical notes concerning Elba and its
- origins
- + [82]Geology of Elba Geological origins of the Island of Elba
- + [83]Towns of Elba Administration of Elba and its eight
- Communes
- + [84]Media Gallery Live and feel Elba through photographs
- * [85]Webcams
+Navigation [33] Infoelba
- [86]Infoelba - Dove natura è vacanza
- *
- *
- *
- *
- *
- * [87]0
+ • [34]Get to Elba [35]
+ □ [36] How to get there Getting to the Island of Elba
+ □ [37] Ferries The shipping companies that connect the island
+ □ [38] Getting about on the island Public transport and taxis
+ □ [39] Hire Car, motorbike and boat hire/rental
+ • [40]Stay [41]
+ □ [42] Hotels Hotels to meet all needs
+ □ [43] Residences For an independent holiday
+ □ [44] Bed & Breakfasts Always ready to discover the island
+ □ [45] Apartments Feeling at home in Elba
+ □ [46] Small villas and detached houses For an autonomous holiday
+ □ [47] Villas Surrounded by luxury and relaxation
+ □ [48] Farm holiday centres Nature and flavours everywhere
+ □ [49] Campsites Socializing and having a good time surrounded by nature
+ □ [50] Camper and caravan Parking, water tank and facility areas
+ □ [51] Farm holiday campsites An open air holiday
+ □ [52] Accommodation that is open all year round Elba: a destination for
+ all seasons
+ □ [53] Luxury accommodation For a dream vacation
+ □ [54] Tourist agencies and realtors Let your holiday be organised for
+ you
+ • [55]Eat [56]
+ □ [57] Restaurants and Pizzerias Typical sea, home or more refined
+ cuisine
+ □ [58] Food & Wine Experience Experiences of gastronomy and wine tasting
+ □ [59] Local recipes The best dishes of the Elba cuisine
+ □ [60] Wines Aleatico, Moscato and Ansonica: Elba wines
+ □ [61] Herbs and typical products Honey, beer, oil, wild and aromatic
+ plants
+ □ [62] Typical dishes History and origins of Elba dishes
+ • [63]Useful information [64]
+ □ [65] ElbaOK Insurance The anti Covid-19 policy and much more
+ □ [66] Useful phone numbers and addresses Public and emergency utilities
+ □ [67] Weather Temperatures and weather forecast
+ □ [68] Webcams A window always open on the Elbe
+ □ [69] Apps for your smartphone Elba on your mobile
+ • [70]Visit Elba [71]
+ □ [72] Beaches and coasts A different beach each day
+ □ [73] Places to see Museums, ancient monuments, breathtaking views
+ □ [74] Tuscan Archipelago National Park Seven pearls rising up from the
+ sea
+ □ [75] Guided excursions Letting others take you round the island
+ □ [76] Useful advice What to do if...
+ □ [77] Maps of the Island of Elba The Island in the palm of your hand
+ □ [78] I am... Elba just as it suits you
+ □ [79] Recommended itineraries What can we go and see today?
+ • [80]Sports and free time [81]
+ □ [82] Water sports Scuba diving, going snorkelling, fishing, sailing
+ □ [83] Land sports Cycling, trekking, free climbing!
+ □ [84] Elba not to be missed The unmissable experiences to do on holiday
+ □ [85] Outdoor sports Elba: A paradise for lovers of outdoor sports
+ □ [86] Enjoyment and relaxation Night life, cinemas and much more
+ □ [87] Courses and study trips Learn while you have fun
+ □ [88] Shopping Scents, colors and flavors of Elba
+ □ [89] Special events and exhibitions What shall we do this evening?
+ • [90]Discovering Elba [91]
+ □ [92] How many beaches are there in Elba? 126 beaches of 1000 colours
+ □ [93] Paths and tracksin Elba 1000 paths to live the island to the full
+ □ [94] Elba in winter Making the most of Elba all year round
+ □ [95] Interesting facts A different Elba
+ □ [96] History of Elba Historical notes concerning Elba and its origins
+ □ [97] Geology of Elba Geological origins of the Island of Elba
+ □ [98] Towns of Elba Administration of Elba and its eight Communes
+ □ [99] Media Gallery Live and feel Elba through photographs
+ • [100] Webcams
+
+[101] Infoelba - Dove natura è vacanza
+
+ • [102]
+ • [103]
+ • [104]
+ • [105]
+ • [106]
+ • [107] 0
Sansone beach in Portoferraio, on the Island of Elba
- (BUTTON)
- (BUTTON) Navigation
- * [88]Looking for accommodation
- * [89]Accommodation price and availability
- * [90]Last minute booking
- * [91]Offers
- * [92]Ferry tickets
- * [93]Real estate ads
+Navigation
- Search on the site
- ____________________ (BUTTON) Start the search
- 1. [94]Island of Elba
- 2. [95]The Island of Elba
- 3. [96]Beaches and coasts
- 4. Sansone
+ • [110] Looking for accommodation
+ • [111] Accommodation price and availability
+ • [112] Last minute booking
+ • [113] Offers
+ • [114] Ferry tickets
+ • [115] Real estate ads
+
+Search on the site
+[116][ ] Start the search
+ 1. [118]Island of Elba
+ 2. [119]The Island of Elba
+ 3. [120]Beaches and coasts
+ 4. Sansone
Enchanting white pebble beach
- This enchanting beach consisting of white pebbles and shingle is
- considered one of the [97]most beautiful beaches on the Island of Elba.
+[121][o_sansone_]
- Just off the steep, white cliffs that are so typical of the northern
- side of the island, from Capo Bianco to Capo Enfola, the water in this
- beach is unique and unbelievably clear.
+This enchanting beach consisting of white pebbles and shingle is considered one
+of the [122]most beautiful beaches on the Island of Elba.
- Sansone is truly unique and enchanting because on days when the
- scirocco wind is blowing the sea is calm and crystal clear, and the
- candid white sea bed is like no other. Here you will find numerous
- rocks, grottos and gorges that are rich in brightly coloured fish, so
- they are perfect if you are a snorkelling lover.
+Just off the steep, white cliffs that are so typical of the northern side of
+the island, from Capo Bianco to Capo Enfola, the water in this beach is unique
+and unbelievably clear.
- On the right hand side of the beach there is a rock that separates it
- from [page id="323=]Sorgente beach[/page], and it is very popular among
- teenagers who love to dive off it; on the left hand side the large
- cliffs are perfect if you love going on canoe and kayak excursions.
+Sansone is truly unique and enchanting because on days when the scirocco wind
+is blowing the sea is calm and crystal clear, and the candid white sea bed is
+like no other. Here you will find numerous rocks, grottos and gorges that are
+rich in brightly coloured fish, so they are perfect if you are a snorkelling
+lover.
- There is a bathing establishment on the beach where you can rent sun
- umbrellas and sun beds, pedalos and canoes, and there is also a small
- bar.
- There is a restaurant in the campsite on the nearby beach of Sorgente
- as well.
+On the right hand side of the beach there is a rock that separates it from
+[page id="323=]Sorgente beach[/page], and it is very popular among teenagers
+who love to dive off it; on the left hand side the large cliffs are perfect if
+you love going on canoe and kayak excursions.
+
+There is a bathing establishment on the beach where you can rent sun umbrellas
+and sun beds, pedalos and canoes, and there is also a small bar.
+There is a restaurant in the campsite on the nearby beach of Sorgente as well.
How to get to Sansone beach
- If you want to drive there, take the main road from Portoferraio to
- Enfola and after about 4,5 km you'll see the pedestrian path on your
- right and the sign for the beach. Either park your car at the side of
- the road or in the fee paying car park, then follow the short path
- until you get to [98]Sorgente beach that, like Sansone, is a tiny beach
- made up of small, white pebbles. Since this part of the path is rather
- bumpy we suggest you avoid wearing flip flops which might make the walk
- down somewhat difficult.
+If you want to drive there, take the main road from Portoferraio to Enfola and
+after about 4,5 km you'll see the pedestrian path on your right and the sign
+for the beach. Either park your car at the side of the road or in the fee
+paying car park, then follow the short path until you get to [123]Sorgente
+beach that, like Sansone, is a tiny beach made up of small, white
+pebbles. Since this part of the path is rather bumpy we suggest you avoid
+wearing flip flops which might make the walk down somewhat difficult.
- If you want to get to Sansone beach keep going along a second path,
- with the entrance to the campsite on your left, and go up a small hill.
- Once you're at the top of the promontory between the two beaches, go a
- little further along - it is a bit steep at times - and at last you'll
- find yourself at the beach.
+If you want to get to Sansone beach keep going along a second path, with the
+entrance to the campsite on your left, and go up a small hill. Once you're at
+the top of the promontory between the two beaches, go a little further along -
+it is a bit steep at times - and at last you'll find yourself at the beach.
- The beauty of the area more than makes up for your effort.
+The beauty of the area more than makes up for your effort.
- Request a free quote [99]0 My choice
+Request a free quote [124] 0 My choice
+Arrival [125][ ]
+Length [126][1 week ]
+Adults [127][2 ]
+Children [128][0 ]
+Request a quote
+ElbaOk
- Arrival ____________________
- Length [1 week___]
- Adults [2_]
- Children [0_]
- (BUTTON) Request a quote
- ElbaOk
+Do you want to book your holidays in time but you’re afraid of unexpected
+events (such as Coronavirus)? Insure your holidays with ElbaOK!
- Do you want to book your holidays in time but you’re afraid of
- unexpected events (such as Coronavirus)? Insure your holidays with
- ElbaOK!
-
- [100]Read more
+[130] Read more
Information and facilities
- Commune Portoferraio
- Side North
- Recommended with the following winds Sirocco, South Wind, Sout-West
- Wind
- Composition Shingles
- Length 240 m
- Facilities Bar, Minibus, Canoe/kayak rental, Boat / pedalo hire/rental,
- Sun umbrella / sun bed hire/rental, Pedalo rental, Car park, Bathing
- establishment
- Nearby beaches [101]Sorgente (0,16 km), [102]Acquaviva (0,45 km),
- [103]Viticcio (0,62 km), [104]Pinetina (0,71 km), [105]Enfola (0,92
- km), [106]Seccione (1,4 km), [107]Forno (1,96 km), [108]Sottobomba
- (2,23 km), [109]Scaglieri (2,23 km), [110]Biodola (2,58 km), [111]Capo
- Bianco (2,8 km), [112]Padulella (2,9 km), [113]Lamaia (3,16 km),
- [114]Cala dei Frati (3,2 km), [115]Porticciolo (3,22 km), [116]Le
- Ghiaie (3,58 km), [117]Le Viste (4,13 km), [118]Procchio (4,88 km)
- *
+ Commune Portoferraio
+ Side North
+Recommended
+ with the Sirocco, South Wind, Sout-West Wind
+ following
+ winds
+Composition Shingles
+ Length 240 m
+ Bar, Minibus, Canoe/kayak rental, Boat / pedalo hire/rental, Sun
+Facilities umbrella / sun bed hire/rental, Pedalo rental, Car park, Bathing
+ establishment
+ [131]Sorgente (0,16 km), [132]Acquaviva (0,45 km), [133]Viticcio
+ (0,62 km), [134]Pinetina (0,71 km), [135]Enfola (0,92 km), [136]
+ Nearby Seccione (1,4 km), [137]Forno (1,96 km), [138]Sottobomba (2,23 km),
+ beaches [139]Scaglieri (2,23 km), [140]Biodola (2,58 km), [141]Capo Bianco
+ (2,8 km), [142]Padulella (2,9 km), [143]Lamaia (3,16 km), [144]Cala
+ dei Frati (3,2 km), [145]Porticciolo (3,22 km), [146]Le Ghiaie
+ (3,58 km), [147]Le Viste (4,13 km), [148]Procchio (4,88 km)
+
+ • [149] [infoelba-s]
+
+[150] [o_sansone_]
+[151] [o_sansone_]
+[152] [o_sansone-]
+[153] [o_sansone-]
+[154] [o_sansone-]
+[155] [o_sansone-]
+[156] [o_sansone-]
+[157] [o_sansone-]
+[158] [o_sansone-]
+[159] [o_sansone-]
Sansone
Legend of points of interest
- Hotels
- Campsites
- Apartaments
- Beach of Sansone
+[ht3] Hotels
+[cp2] Campsites
+[ap0] Apartaments
+[2_1] Beach of Sansone
- 3 structures near the beach of Sansone see on map
+3 structures near the beach of Sansone see on map
Apartaments near the beach of Sansone
- [119]See more
+[160][1] See more
-[120]Casa di Alessio
+[161]Casa di Alessio
- Portoferraio
+Portoferraio
- +39.3288423392
- [121]Contacts[122] Memorize
++39.3288423392
+
+[162] Contacts[163] Memorize
Campsites near the beach of Sansone
- [123]See more
+[164][featured] See more
-[124]Camping La Sorgente 2 stars
+[165]Camping La Sorgente 2 stars
- Acquaviva, Portoferraio
+Acquaviva, Portoferraio
- +39.0565917139
- [125]Contacts[126] Estimate[127] Memorize
++39.0565917139
+
+[166] Contacts[167] Estimate[168] Memorize
Hotels near the beach of Sansone
- [128]See more
+[169][featured] See more
-[129]Hotel Paradiso 3 stars
+[170]Hotel Paradiso 3 stars
- Viticcio, Portoferraio
+Viticcio, Portoferraio
- +39.0565939034
++39.0565939034
- +39.3456800683
- [130]Contacts[131] Memorize
- * [132]Get to Elba
- * [133]How to get there
- * [134]Ferries
- * [135]Getting about on the island
- * [136]Hire
++39.3456800683
- * [137]Stay
- * [138]Hotels
- * [139]Residences
- * [140]Bed & Breakfasts
- * [141]Apartments
- * [142]Small villas and detached houses
- * [143]Villas
- * [144]Farm holiday centres
- * [145]Campsites
- * [146]Camper and caravan
- * [147]Farm holiday campsites
- * [148]Accommodation that is open all year round
- * [149]Luxury accommodation
- * [150]Tourist agencies and realtors
+[171] Contacts[172] Memorize
+[173] [app-infoel]
- * [151]Eat
- * [152]Restaurants and Pizzerias
- * [153]Food & Wine Experience
- * [154]Local recipes
- * [155]Wines
- * [156]Herbs and typical products
- * [157]Typical dishes
+ • [174]Get to Elba
+ • [175]How to get there
+ • [176]Ferries
+ • [177]Getting about on the island
+ • [178]Hire
- * [158]Useful information
- * [159]ElbaOK Insurance
- * [160]Useful phone numbers and addresses
- * [161]Weather
- * [162]Webcams
- * [163]Apps for your smartphone
+ • [179]Stay
+ • [180]Hotels
+ • [181]Residences
+ • [182]Bed & Breakfasts
+ • [183]Apartments
+ • [184]Small villas and detached houses
+ • [185]Villas
+ • [186]Farm holiday centres
+ • [187]Campsites
+ • [188]Camper and caravan
+ • [189]Farm holiday campsites
+ • [190]Accommodation that is open all year round
+ • [191]Luxury accommodation
+ • [192]Tourist agencies and realtors
- * [164]Visit Elba
- * [165]Beaches and coasts
- * [166]Places to see
- * [167]Tuscan Archipelago National Park
- * [168]Guided excursions
- * [169]Useful advice
- * [170]Maps of the Island of Elba
- * [171]I am...
- * [172]Recommended itineraries
+ • [193]Eat
+ • [194]Restaurants and Pizzerias
+ • [195]Food & Wine Experience
+ • [196]Local recipes
+ • [197]Wines
+ • [198]Herbs and typical products
+ • [199]Typical dishes
- * [173]Sports and free time
- * [174]Water sports
- * [175]Land sports
- * [176]Elba not to be missed
- * [177]Outdoor sports
- * [178]Enjoyment and relaxation
- * [179]Courses and study trips
- * [180]Shopping
- * [181]Special events and exhibitions
+ • [200]Useful information
+ • [201]ElbaOK Insurance
+ • [202]Useful phone numbers and addresses
+ • [203]Weather
+ • [204]Webcams
+ • [205]Apps for your smartphone
- * [182]Discovering Elba
- * [183]How many beaches are there in Elba?
- * [184]Paths and tracksin Elba
- * [185]Elba in winter
- * [186]Interesting facts
- * [187]History of Elba
- * [188]Geology of Elba
- * [189]Towns of Elba
- * [190]Media Gallery
+ • [206]Visit Elba
+ • [207]Beaches and coasts
+ • [208]Places to see
+ • [209]Tuscan Archipelago National Park
+ • [210]Guided excursions
+ • [211]Useful advice
+ • [212]Maps of the Island of Elba
+ • [213]I am...
+ • [214]Recommended itineraries
- * [191]Webcams
+ • [215]Sports and free time
+ • [216]Water sports
+ • [217]Land sports
+ • [218]Elba not to be missed
+ • [219]Outdoor sports
+ • [220]Enjoyment and relaxation
+ • [221]Courses and study trips
+ • [222]Shopping
+ • [223]Special events and exhibitions
- Infoelba non si assume alcuna responsabilità per l'uso di marchi e
- slogan usati dagli inserzionisti e per eventuali errate indicazioni.
+ • [224]Discovering Elba
+ • [225]How many beaches are there in Elba?
+ • [226]Paths and tracksin Elba
+ • [227]Elba in winter
+ • [228]Interesting facts
+ • [229]History of Elba
+ • [230]Geology of Elba
+ • [231]Towns of Elba
+ • [232]Media Gallery
- Informa inoltre che i listini prezzi, orari, date o altro materiale
- informativo pubblicato su questo sito è suscettibile a variazioni.
+ • [233] Webcams
- :: Siete quindi invitati a chiedere conferma alle strutture interessate
- ::
- Infoelba
+Infoelba non si assume alcuna responsabilità per l'uso di marchi e slogan usati
+dagli inserzionisti e per eventuali errate indicazioni.
- ©1999-2024 Infoelba s.r.l. Unipersonale - Viale Teseo Tesei, 12 -
- Centro Servizi Il Molino - 57037 Portoferraio (LI)
+Informa inoltre che i listini prezzi, orari, date o altro materiale informativo
+pubblicato su questo sito è suscettibile a variazioni.
- P. IVA e C.F. 01130150491 - capitale sociale €10.000,00 i.v. - registro
- imprese numero 01130150491 - REA: LI - 100635
+:: Siete quindi invitati a chiedere conferma alle strutture interessate ::
- [192]infoelba® it is a registered trademark - all rights reserved -
- [193]Accesso all'area riservata - [194]Privacy Policy - [195]Cookie
- Policy
+Infoelba
- (BUTTON) top
+©1999-2024 Infoelba s.r.l. Unipersonale - Viale Teseo Tesei, 12 - Centro
+Servizi Il Molino - 57037 Portoferraio (LI)
- (BUTTON) ×Chiudi
+P. IVA e C.F. 01130150491 - capitale sociale €10.000,00 i.v. - registro imprese
+numero 01130150491 - REA: LI - 100635
- (BUTTON) Close
+[234]infoelba® it is a registered trademark - all rights reserved - [235]
+Accesso all'area riservata - [236]Privacy Policy - [237]Cookie Policy
-References
+top
+×Chiudi
- Visible links:
- 1. https://www.infoelba.net/insel-elba/straende/strand-sansone/
- 2. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 3. https://www.iledelbe.net/ile-d-elbe/plages/plage-sansone/
- 4. https://www.infoelba.it/isola-d-elba/spiagge/spiaggia-sansone/
- 5. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 6. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 7. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
- 8. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/taxis/
- 9. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/buses/
- 10. https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/campers-caravas-facilities/
- 11. https://www.infoelba.com/where-to-sleep/search/
- 12. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
- 13. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 14. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 15. https://www.infoelba.com/island-of-elba/beaches/
- 16. https://www.infoelba.com/island-of-elba/beaches/bathing-establishments/
- 17. https://www.infoelba.com/sports-free-time/water-sports/diving/
- 18. https://www.infoelba.com/sports-free-time/water-sports/sailing/
- 19. https://www.infoelba.com/island-of-elba/guided-excursions/
- 20. https://www.infoelba.com/sports-free-time/
- 21. https://www.infoelba.com/island-of-elba/places-to-see/
- 22. https://www.infoelba.com/special-offers-island-of-elba/
- 23. https://www.infoelba.com/island-of-elba-last-minute-booking/
- 24. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
- 25. https://www.infoelba.com/
- 26. https://www.infoelba.com/arriving-getting-about/
- 27. https://www.infoelba.com/arriving-getting-about/how-to-get-there/
- 28. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
- 29. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
- 30. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
- 31. https://www.infoelba.com/where-to-sleep/
- 32. https://www.infoelba.com/where-to-sleep/hotels/
- 33. https://www.infoelba.com/where-to-sleep/residences/
- 34. https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
- 35. https://www.infoelba.com/where-to-sleep/apartments/
- 36. https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
- 37. https://www.infoelba.com/where-to-sleep/villas/
- 38. https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
- 39. https://www.infoelba.com/where-to-sleep/campsites/
- 40. https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
- 41. https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
- 42. https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
- 43. https://www.infoelba.com/where-to-sleep/luxury-holidays/
- 44. https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
- 45. https://www.infoelba.com/eating-cuisine/
- 46. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
- 47. https://www.infoelba.com/eating-cuisine/food-wine-experience/
- 48. https://www.infoelba.com/eating-cuisine/local-recipes/
- 49. https://www.infoelba.com/eating-cuisine/elba-wines/
- 50. https://www.infoelba.com/eating-cuisine/herbs-typical-products/
- 51. https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
- 52. https://www.infoelba.com/useful-information/
- 53. https://www.infoelba.com/useful-information/elbaok-insurance/
- 54. https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
- 55. https://www.infoelba.com/useful-information/weather-island-of-elba/
- 56. https://www.infoelba.com/useful-information/webcams/
- 57. https://www.infoelba.com/useful-information/smartphone-apps/
- 58. https://www.infoelba.com/island-of-elba/
- 59. https://www.infoelba.com/island-of-elba/beaches/
- 60. https://www.infoelba.com/island-of-elba/places-to-see/
- 61. https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
- 62. https://www.infoelba.com/island-of-elba/guided-excursions/
- 63. https://www.infoelba.com/island-of-elba/suggestions/
- 64. https://www.infoelba.com/island-of-elba/maps/
- 65. https://www.infoelba.com/island-of-elba/personalized-holidays/
- 66. https://www.infoelba.com/island-of-elba/recommended-itineraries/
- 67. https://www.infoelba.com/sports-free-time/
- 68. https://www.infoelba.com/sports-free-time/water-sports/
- 69. https://www.infoelba.com/sports-free-time/land-sports/
- 70. https://www.infoelba.com/sports-free-time/elba-experiences/
- 71. https://www.infoelba.com/sports-free-time/outdoor-sports/
- 72. https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
- 73. https://www.infoelba.com/sports-free-time/courses-study-trips/
- 74. https://www.infoelba.com/sports-free-time/shopping/
- 75. https://www.infoelba.com/sports-free-time/special-events-exhibitions/
- 76. https://www.infoelba.com/discovering-elba/
- 77. https://www.infoelba.com/elba-beaches/
- 78. https://www.infoelba.com/elba-paths-routes/
- 79. https://www.infoelba.com/elba-winter/
- 80. https://www.infoelba.com/discovering-elba/interesting-facts/
- 81. https://www.infoelba.com/discovering-elba/history-of-elba/
- 82. https://www.infoelba.com/discovering-elba/geology-of-elba/
- 83. https://www.infoelba.com/discovering-elba/communes-towns/
- 84. https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
- 85. https://www.infoelba.com/useful-information/webcams/
- 86. https://www.infoelba.com/
- 87. https://www.infoelba.com/my-choice/
- 88. https://www.infoelba.com/where-to-sleep/search/
- 89. https://www.infoelba.com/accommodation-price-availability/
- 90. https://www.infoelba.com/island-of-elba-last-minute-booking/
- 91. https://www.infoelba.com/special-offers-island-of-elba/
- 92. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
- 93. https://www.infoelba.com/real-estate-ads-elba/
- 94. https://www.infoelba.com/
- 95. https://www.infoelba.com/island-of-elba/
- 96. https://www.infoelba.com/island-of-elba/beaches/
- 97. https://www.infoelba.com/island-of-elba/beaches/most-beautiful-beaches-in-elba/
- 98. https://www.infoelba.com/island-of-elba/beaches/sorgente-beach/
- 99. https://www.infoelba.com/my-choice/
- 100. https://www.infoelba.com/useful-information/covid-19-safe-holidays/elbaok-insurance/
- 101. https://www.infoelba.com/island-of-elba/beaches/sorgente-beach/
- 102. https://www.infoelba.com/island-of-elba/beaches/acquaviva-beach/
- 103. https://www.infoelba.com/island-of-elba/beaches/viticcio-beach/
- 104. https://www.infoelba.com/island-of-elba/beaches/pinetina-beach/
- 105. https://www.infoelba.com/island-of-elba/beaches/enfola-beach/
- 106. https://www.infoelba.com/island-of-elba/beaches/seccione-beach/
- 107. https://www.infoelba.com/island-of-elba/beaches/forno-beach/
- 108. https://www.infoelba.com/island-of-elba/beaches/sottobomba-beach/
- 109. https://www.infoelba.com/island-of-elba/beaches/scaglieri-beach/
- 110. https://www.infoelba.com/island-of-elba/beaches/biodola-beach/
- 111. https://www.infoelba.com/island-of-elba/beaches/capo-bianco-beach/
- 112. https://www.infoelba.com/island-of-elba/beaches/padulella-beach/
- 113. https://www.infoelba.com/island-of-elba/beaches/lamaia-beach/
- 114. https://www.infoelba.com/island-of-elba/beaches/cala-dei-frati-beach/
- 115. https://www.infoelba.com/island-of-elba/beaches/porticciolo-beach/
- 116. https://www.infoelba.com/island-of-elba/beaches/le-ghiaie-beach/
- 117. https://www.infoelba.com/island-of-elba/beaches/le-viste-beach/
- 118. https://www.infoelba.com/island-of-elba/beaches/procchio-beach/
- 119. https://www.infoelba.com/where-to-sleep/apartments/casa-di-alessio-1772/
- 120. https://www.infoelba.com/where-to-sleep/apartments/casa-di-alessio-1772/
- 121. https://www.infoelba.com/requests/direct-popup.asp?struttura=1772
- 122. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 123. https://www.infoelba.com/where-to-sleep/campsites/camping-la-sorgente-489/
- 124. https://www.infoelba.com/where-to-sleep/campsites/camping-la-sorgente-489/
- 125. https://www.infoelba.com/requests/direct-popup.asp?struttura=489
- 126. https://pricelists.infoelba.it/Estimate.aspx?structure=489&language=en-GB
- 127. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 128. https://www.infoelba.com/where-to-sleep/hotels/hotel-paradiso-186/
- 129. https://www.infoelba.com/where-to-sleep/hotels/hotel-paradiso-186/
- 130. https://www.infoelba.com/requests/direct-popup.asp?struttura=186
- 131. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 132. https://www.infoelba.com/arriving-getting-about/
- 133. https://www.infoelba.com/arriving-getting-about/how-to-get-there/
- 134. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
- 135. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
- 136. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
- 137. https://www.infoelba.com/where-to-sleep/
- 138. https://www.infoelba.com/where-to-sleep/hotels/
- 139. https://www.infoelba.com/where-to-sleep/residences/
- 140. https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
- 141. https://www.infoelba.com/where-to-sleep/apartments/
- 142. https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
- 143. https://www.infoelba.com/where-to-sleep/villas/
- 144. https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
- 145. https://www.infoelba.com/where-to-sleep/campsites/
- 146. https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
- 147. https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
- 148. https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
- 149. https://www.infoelba.com/where-to-sleep/luxury-holidays/
- 150. https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
- 151. https://www.infoelba.com/eating-cuisine/
- 152. https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
- 153. https://www.infoelba.com/eating-cuisine/food-wine-experience/
- 154. https://www.infoelba.com/eating-cuisine/local-recipes/
- 155. https://www.infoelba.com/eating-cuisine/elba-wines/
- 156. https://www.infoelba.com/eating-cuisine/herbs-typical-products/
- 157. https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
- 158. https://www.infoelba.com/useful-information/
- 159. https://www.infoelba.com/useful-information/elbaok-insurance/
- 160. https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
- 161. https://www.infoelba.com/useful-information/weather-island-of-elba/
- 162. https://www.infoelba.com/useful-information/webcams/
- 163. https://www.infoelba.com/useful-information/smartphone-apps/
- 164. https://www.infoelba.com/island-of-elba/
- 165. https://www.infoelba.com/island-of-elba/beaches/
- 166. https://www.infoelba.com/island-of-elba/places-to-see/
- 167. https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
- 168. https://www.infoelba.com/island-of-elba/guided-excursions/
- 169. https://www.infoelba.com/island-of-elba/suggestions/
- 170. https://www.infoelba.com/island-of-elba/maps/
- 171. https://www.infoelba.com/island-of-elba/personalized-holidays/
- 172. https://www.infoelba.com/island-of-elba/recommended-itineraries/
- 173. https://www.infoelba.com/sports-free-time/
- 174. https://www.infoelba.com/sports-free-time/water-sports/
- 175. https://www.infoelba.com/sports-free-time/land-sports/
- 176. https://www.infoelba.com/sports-free-time/elba-experiences/
- 177. https://www.infoelba.com/sports-free-time/outdoor-sports/
- 178. https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
- 179. https://www.infoelba.com/sports-free-time/courses-study-trips/
- 180. https://www.infoelba.com/sports-free-time/shopping/
- 181. https://www.infoelba.com/sports-free-time/special-events-exhibitions/
- 182. https://www.infoelba.com/discovering-elba/
- 183. https://www.infoelba.com/elba-beaches/
- 184. https://www.infoelba.com/elba-paths-routes/
- 185. https://www.infoelba.com/elba-winter/
- 186. https://www.infoelba.com/discovering-elba/interesting-facts/
- 187. https://www.infoelba.com/discovering-elba/history-of-elba/
- 188. https://www.infoelba.com/discovering-elba/geology-of-elba/
- 189. https://www.infoelba.com/discovering-elba/communes-towns/
- 190. https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
- 191. https://www.infoelba.com/useful-information/webcams/
- 192. https://www.infoelba.com/
- 193. https://areariservata.infoelba.it/
- 194. https://www.infoelba.com/privacy-policy/
- 195. https://www.infoelba.com/cookie-policy/
+Close
- Hidden links:
- 197. https://facebook.com/Infoelba
- 198. https://twitter.com/infoelba
- 199. https://instagram.com/infoelba
- 200. https://youtube.com/infoelba
- 201. https://www.infoelba.it/isola-d-elba/spiagge/spiaggia-sansone/
- 202. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 203. https://www.infoelba.net/insel-elba/straende/strand-sansone/
- 204. https://www.iledelbe.net/ile-d-elbe/plages/plage-sansone/
- 205. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 206. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 207. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 208. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 209. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 210. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 211. https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
- 212. https://www.infoelba.com/where-to-sleep/search/
- 213. https://www.infoelba.com/accommodation-price-availability/
- 214. https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
- 215. https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/booking-on-line/
- 216. https://www.infoelba.com/arriving-getting-about/how-to-get-there/planes/
- 217. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone_dsc_9769-20.jpg?quality=90&mode=crop&w=1280
- 218. https://www.elbaspiagge.it/shop/
- 219. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone_drone.jpg?quality=90&mode=crop&w=1280
- 220. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone_mo.jpg?quality=90&mode=crop&w=1280
- 221. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-sansone1.jpg?quality=90&mode=crop&w=1280
- 222. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_9780.jpg?quality=90&mode=crop&w=1280
- 223. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_9766.jpg?quality=90&mode=crop&w=1280
- 224. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0053.jpg?quality=90&mode=crop&w=1280
- 225. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0009.jpg?quality=90&mode=crop&w=1280
- 226. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0007.jpg?quality=90&mode=crop&w=1280
- 227. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0003.jpg?quality=90&mode=crop&w=1280
- 228. https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0142.jpg?quality=90&mode=crop&w=1280
- 229. https://www.infoelba.com/app
+References:
+
+[2] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[3] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[4] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
+[5] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/taxis/
+[6] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/buses/
+[7] https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/campers-caravas-facilities/
+[8] https://www.infoelba.com/where-to-sleep/search/
+[9] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
+[10] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[11] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[12] https://www.infoelba.com/island-of-elba/beaches/
+[13] https://www.infoelba.com/island-of-elba/beaches/bathing-establishments/
+[14] https://www.infoelba.com/sports-free-time/water-sports/diving/
+[15] https://www.infoelba.com/sports-free-time/water-sports/sailing/
+[16] https://www.infoelba.com/island-of-elba/guided-excursions/
+[17] https://www.infoelba.com/sports-free-time/
+[18] https://www.infoelba.com/island-of-elba/places-to-see/
+[19] https://www.infoelba.com/special-offers-island-of-elba/
+[20] https://www.infoelba.com/island-of-elba-last-minute-booking/
+[21] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
+[24] https://facebook.com/Infoelba
+[25] https://twitter.com/infoelba
+[26] https://instagram.com/infoelba
+[27] https://youtube.com/infoelba
+[28] https://www.infoelba.it/isola-d-elba/spiagge/spiaggia-sansone/
+[29] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/
+[30] https://www.infoelba.net/insel-elba/straende/strand-sansone/
+[31] https://www.iledelbe.net/ile-d-elbe/plages/plage-sansone/
+[33] https://www.infoelba.com/
+[34] https://www.infoelba.com/arriving-getting-about/
+[35] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[36] https://www.infoelba.com/arriving-getting-about/how-to-get-there/
+[37] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
+[38] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
+[39] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
+[40] https://www.infoelba.com/where-to-sleep/
+[41] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[42] https://www.infoelba.com/where-to-sleep/hotels/
+[43] https://www.infoelba.com/where-to-sleep/residences/
+[44] https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
+[45] https://www.infoelba.com/where-to-sleep/apartments/
+[46] https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
+[47] https://www.infoelba.com/where-to-sleep/villas/
+[48] https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
+[49] https://www.infoelba.com/where-to-sleep/campsites/
+[50] https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
+[51] https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
+[52] https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
+[53] https://www.infoelba.com/where-to-sleep/luxury-holidays/
+[54] https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
+[55] https://www.infoelba.com/eating-cuisine/
+[56] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[57] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
+[58] https://www.infoelba.com/eating-cuisine/food-wine-experience/
+[59] https://www.infoelba.com/eating-cuisine/local-recipes/
+[60] https://www.infoelba.com/eating-cuisine/elba-wines/
+[61] https://www.infoelba.com/eating-cuisine/herbs-typical-products/
+[62] https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
+[63] https://www.infoelba.com/useful-information/
+[64] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[65] https://www.infoelba.com/useful-information/elbaok-insurance/
+[66] https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
+[67] https://www.infoelba.com/useful-information/weather-island-of-elba/
+[68] https://www.infoelba.com/useful-information/webcams/
+[69] https://www.infoelba.com/useful-information/smartphone-apps/
+[70] https://www.infoelba.com/island-of-elba/
+[71] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[72] https://www.infoelba.com/island-of-elba/beaches/
+[73] https://www.infoelba.com/island-of-elba/places-to-see/
+[74] https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
+[75] https://www.infoelba.com/island-of-elba/guided-excursions/
+[76] https://www.infoelba.com/island-of-elba/suggestions/
+[77] https://www.infoelba.com/island-of-elba/maps/
+[78] https://www.infoelba.com/island-of-elba/personalized-holidays/
+[79] https://www.infoelba.com/island-of-elba/recommended-itineraries/
+[80] https://www.infoelba.com/sports-free-time/
+[81] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[82] https://www.infoelba.com/sports-free-time/water-sports/
+[83] https://www.infoelba.com/sports-free-time/land-sports/
+[84] https://www.infoelba.com/sports-free-time/elba-experiences/
+[85] https://www.infoelba.com/sports-free-time/outdoor-sports/
+[86] https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
+[87] https://www.infoelba.com/sports-free-time/courses-study-trips/
+[88] https://www.infoelba.com/sports-free-time/shopping/
+[89] https://www.infoelba.com/sports-free-time/special-events-exhibitions/
+[90] https://www.infoelba.com/discovering-elba/
+[91] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[92] https://www.infoelba.com/elba-beaches/
+[93] https://www.infoelba.com/elba-paths-routes/
+[94] https://www.infoelba.com/elba-winter/
+[95] https://www.infoelba.com/discovering-elba/interesting-facts/
+[96] https://www.infoelba.com/discovering-elba/history-of-elba/
+[97] https://www.infoelba.com/discovering-elba/geology-of-elba/
+[98] https://www.infoelba.com/discovering-elba/communes-towns/
+[99] https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
+[100] https://www.infoelba.com/useful-information/webcams/
+[101] https://www.infoelba.com/
+[102] https://www.infoelba.com/where-to-sleep/search/
+[103] https://www.infoelba.com/accommodation-price-availability/
+[104] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
+[105] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/booking-on-line/
+[106] https://www.infoelba.com/arriving-getting-about/how-to-get-there/planes/
+[107] https://www.infoelba.com/my-choice/
+[110] https://www.infoelba.com/where-to-sleep/search/
+[111] https://www.infoelba.com/accommodation-price-availability/
+[112] https://www.infoelba.com/island-of-elba-last-minute-booking/
+[113] https://www.infoelba.com/special-offers-island-of-elba/
+[114] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/booking/
+[115] https://www.infoelba.com/real-estate-ads-elba/
+[118] https://www.infoelba.com/
+[119] https://www.infoelba.com/island-of-elba/
+[120] https://www.infoelba.com/island-of-elba/beaches/
+[121] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone_dsc_9769-20.jpg?quality=90&mode=crop&w=1280
+[122] https://www.infoelba.com/island-of-elba/beaches/most-beautiful-beaches-in-elba/
+[123] https://www.infoelba.com/island-of-elba/beaches/sorgente-beach/
+[124] https://www.infoelba.com/my-choice/
+[130] https://www.infoelba.com/useful-information/covid-19-safe-holidays/elbaok-insurance/
+[131] https://www.infoelba.com/island-of-elba/beaches/sorgente-beach/
+[132] https://www.infoelba.com/island-of-elba/beaches/acquaviva-beach/
+[133] https://www.infoelba.com/island-of-elba/beaches/viticcio-beach/
+[134] https://www.infoelba.com/island-of-elba/beaches/pinetina-beach/
+[135] https://www.infoelba.com/island-of-elba/beaches/enfola-beach/
+[136] https://www.infoelba.com/island-of-elba/beaches/seccione-beach/
+[137] https://www.infoelba.com/island-of-elba/beaches/forno-beach/
+[138] https://www.infoelba.com/island-of-elba/beaches/sottobomba-beach/
+[139] https://www.infoelba.com/island-of-elba/beaches/scaglieri-beach/
+[140] https://www.infoelba.com/island-of-elba/beaches/biodola-beach/
+[141] https://www.infoelba.com/island-of-elba/beaches/capo-bianco-beach/
+[142] https://www.infoelba.com/island-of-elba/beaches/padulella-beach/
+[143] https://www.infoelba.com/island-of-elba/beaches/lamaia-beach/
+[144] https://www.infoelba.com/island-of-elba/beaches/cala-dei-frati-beach/
+[145] https://www.infoelba.com/island-of-elba/beaches/porticciolo-beach/
+[146] https://www.infoelba.com/island-of-elba/beaches/le-ghiaie-beach/
+[147] https://www.infoelba.com/island-of-elba/beaches/le-viste-beach/
+[148] https://www.infoelba.com/island-of-elba/beaches/procchio-beach/
+[149] https://www.elbaspiagge.it/shop/
+[150] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone_drone.jpg?quality=90&mode=crop&w=1280
+[151] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone_mo.jpg?quality=90&mode=crop&w=1280
+[152] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-sansone1.jpg?quality=90&mode=crop&w=1280
+[153] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_9780.jpg?quality=90&mode=crop&w=1280
+[154] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_9766.jpg?quality=90&mode=crop&w=1280
+[155] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0053.jpg?quality=90&mode=crop&w=1280
+[156] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0009.jpg?quality=90&mode=crop&w=1280
+[157] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0007.jpg?quality=90&mode=crop&w=1280
+[158] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0003.jpg?quality=90&mode=crop&w=1280
+[159] https://dati.infoelba.it/media/photos/isola-d-elba/spiagge/sansone/o_sansone-dsc_0142.jpg?quality=90&mode=crop&w=1280
+[160] https://www.infoelba.com/where-to-sleep/apartments/casa-di-alessio-1772/
+[161] https://www.infoelba.com/where-to-sleep/apartments/casa-di-alessio-1772/
+[162] https://www.infoelba.com/requests/direct-popup.asp?struttura=1772
+[163] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[164] https://www.infoelba.com/where-to-sleep/campsites/camping-la-sorgente-489/
+[165] https://www.infoelba.com/where-to-sleep/campsites/camping-la-sorgente-489/
+[166] https://www.infoelba.com/requests/direct-popup.asp?struttura=489
+[167] https://pricelists.infoelba.it/Estimate.aspx?structure=489&language=en-GB
+[168] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[169] https://www.infoelba.com/where-to-sleep/hotels/hotel-paradiso-186/
+[170] https://www.infoelba.com/where-to-sleep/hotels/hotel-paradiso-186/
+[171] https://www.infoelba.com/requests/direct-popup.asp?struttura=186
+[172] https://www.infoelba.com/island-of-elba/beaches/sansone-beach/#
+[173] https://www.infoelba.com/app
+[174] https://www.infoelba.com/arriving-getting-about/
+[175] https://www.infoelba.com/arriving-getting-about/how-to-get-there/
+[176] https://www.infoelba.com/arriving-getting-about/how-to-get-there/ferries/
+[177] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/
+[178] https://www.infoelba.com/arriving-getting-about/getting-about-on-the-island/hire-rental/
+[179] https://www.infoelba.com/where-to-sleep/
+[180] https://www.infoelba.com/where-to-sleep/hotels/
+[181] https://www.infoelba.com/where-to-sleep/residences/
+[182] https://www.infoelba.com/where-to-sleep/bed-and-breakfasts/
+[183] https://www.infoelba.com/where-to-sleep/apartments/
+[184] https://www.infoelba.com/where-to-sleep/small-villas-detached-houses/
+[185] https://www.infoelba.com/where-to-sleep/villas/
+[186] https://www.infoelba.com/where-to-sleep/farm-holiday-centres/
+[187] https://www.infoelba.com/where-to-sleep/campsites/
+[188] https://www.infoelba.com/where-to-sleep/campers-caravas-facilities/
+[189] https://www.infoelba.com/where-to-sleep/farm-holiday-campsites/
+[190] https://www.infoelba.com/where-to-sleep/accommodation-open-all-year-round/
+[191] https://www.infoelba.com/where-to-sleep/luxury-holidays/
+[192] https://www.infoelba.com/where-to-sleep/travel-agencies-realtors/
+[193] https://www.infoelba.com/eating-cuisine/
+[194] https://www.infoelba.com/eating-cuisine/restaurants-pizzerias/
+[195] https://www.infoelba.com/eating-cuisine/food-wine-experience/
+[196] https://www.infoelba.com/eating-cuisine/local-recipes/
+[197] https://www.infoelba.com/eating-cuisine/elba-wines/
+[198] https://www.infoelba.com/eating-cuisine/herbs-typical-products/
+[199] https://www.infoelba.com/eating-cuisine/origins-typical-dishes/
+[200] https://www.infoelba.com/useful-information/
+[201] https://www.infoelba.com/useful-information/elbaok-insurance/
+[202] https://www.infoelba.com/useful-information/useful-phone-numbers-addresses/
+[203] https://www.infoelba.com/useful-information/weather-island-of-elba/
+[204] https://www.infoelba.com/useful-information/webcams/
+[205] https://www.infoelba.com/useful-information/smartphone-apps/
+[206] https://www.infoelba.com/island-of-elba/
+[207] https://www.infoelba.com/island-of-elba/beaches/
+[208] https://www.infoelba.com/island-of-elba/places-to-see/
+[209] https://www.infoelba.com/island-of-elba/tuscan-archipelago-national-park/
+[210] https://www.infoelba.com/island-of-elba/guided-excursions/
+[211] https://www.infoelba.com/island-of-elba/suggestions/
+[212] https://www.infoelba.com/island-of-elba/maps/
+[213] https://www.infoelba.com/island-of-elba/personalized-holidays/
+[214] https://www.infoelba.com/island-of-elba/recommended-itineraries/
+[215] https://www.infoelba.com/sports-free-time/
+[216] https://www.infoelba.com/sports-free-time/water-sports/
+[217] https://www.infoelba.com/sports-free-time/land-sports/
+[218] https://www.infoelba.com/sports-free-time/elba-experiences/
+[219] https://www.infoelba.com/sports-free-time/outdoor-sports/
+[220] https://www.infoelba.com/sports-free-time/enjoyment-relaxation/
+[221] https://www.infoelba.com/sports-free-time/courses-study-trips/
+[222] https://www.infoelba.com/sports-free-time/shopping/
+[223] https://www.infoelba.com/sports-free-time/special-events-exhibitions/
+[224] https://www.infoelba.com/discovering-elba/
+[225] https://www.infoelba.com/elba-beaches/
+[226] https://www.infoelba.com/elba-paths-routes/
+[227] https://www.infoelba.com/elba-winter/
+[228] https://www.infoelba.com/discovering-elba/interesting-facts/
+[229] https://www.infoelba.com/discovering-elba/history-of-elba/
+[230] https://www.infoelba.com/discovering-elba/geology-of-elba/
+[231] https://www.infoelba.com/discovering-elba/communes-towns/
+[232] https://www.infoelba.com/discovering-elba/media-gallery-island-of-elba/
+[233] https://www.infoelba.com/useful-information/webcams/
+[234] https://www.infoelba.com/
+[235] https://areariservata.infoelba.it/
+[236] https://www.infoelba.com/privacy-policy/
+[237] https://www.infoelba.com/cookie-policy/
diff --git a/static/archive/www-newyorker-com-41taro.txt b/static/archive/www-newyorker-com-41taro.txt
index 03829da..3e54e67 100644
--- a/static/archive/www-newyorker-com-41taro.txt
+++ b/static/archive/www-newyorker-com-41taro.txt
@@ -1,723 +1,689 @@
- #[1]alternate
+[1]Skip to main content
+[2]The New Yorker
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-NX5LSK3
+ • [3]Newsletter
- [3]Skip to main content
+To revisit this article, select My Account, then [4]View saved stories
- [4]The New Yorker
+Close Alert
+[6]Sign In
+[7]Search
- * [5]Newsletter
+ • [8]The Latest
+ • [9]News
+ • [10]Books & Culture
+ • [11]Fiction & Poetry
+ • [12]Humor & Cartoons
+ • [13]Magazine
+ • [14]Puzzles & Games
+ • [15]Video
+ • [16]Podcasts
+ • [17]Goings On
+ • [18]Shop
- To revisit this article, select My Account, then [6]View saved stories
- (BUTTON) Close Alert
- [7]Sign In
- [8]Search
+Open Navigation Menu
- * [9]The Latest
- * [10]News
- * [11]Books & Culture
- * [12]Fiction & Poetry
- * [13]Humor & Cartoons
- * [14]Magazine
- * [15]Puzzles & Games
- * [16]Video
- * [17]Podcasts
- * [18]Goings On
- * [19]Shop
+Find anything you save across the site in your account [20]
- (BUTTON) Open Navigation Menu
-
- Find anything you save across the site in your account
- (BUTTON) Close Alert
- [20]The New Yorker
-
- [21]Personal History
+Close Alert
+[22]The New Yorker
+[23]Personal History
A Coder Considers the Waning Days of the Craft
- Coding has always felt to me like an endlessly deep and rich domain.
- Now I find myself wanting to write a eulogy for it.
+Coding has always felt to me like an endlessly deep and rich domain. Now I find
+myself wanting to write a eulogy for it.
- By [22]James Somers
- November 13, 2023
- *
- *
- *
- *
- *
+By [24]James Somers
- (BUTTON) Play/Pause Button
- Artificial intelligence still can’t beat a human when it comes to
- programming. But it’s only a matter of time.Illustration by Dev
- Valladares
+November 13, 2023
- (BUTTON) Save this story
- (BUTTON) Save this story
+ • [25]
+ • [26]
+ • [27]
+ • [28]
+ • [29]
- I have always taken it for granted that, just as my parents made sure
- that I could read and write, I would make sure that my kids could
- program computers. It is among the newer arts but also among the most
- essential, and ever more so by the day, encompassing everything from
- filmmaking to physics. Fluency with code would round out my children’s
- literacy—and keep them employable. But as I write this my wife is
- pregnant with our first child, due in about three weeks. I code
- professionally, but, by the time that child can type, coding as a
- valuable skill might have faded from the world.
+Play/Pause Button
+Artificial intelligence still can’t beat a human when it comes to programming.
+But it’s only a matter of time.Illustration by Dev Valladares
+Save this story
+Save this story
- I first began to believe this on a Friday morning this past summer,
- while working on a small hobby project. A few months back, my friend
- Ben and I had resolved to create a Times-style crossword puzzle
- entirely by computer. In 2018, we’d made a Saturday puzzle with the
- help of software and were surprised by how little we contributed—just
- applying our taste here and there. Now we would attempt to build a
- crossword-making program that didn’t require a human touch.
+I have always taken it for granted that, just as my parents made sure that I
+could read and write, I would make sure that my kids could program computers.
+It is among the newer arts but also among the most essential, and ever more so
+by the day, encompassing everything from filmmaking to physics. Fluency with
+code would round out my children’s literacy—and keep them employable. But as I
+write this my wife is pregnant with our first child, due in about three weeks.
+I code professionally, but, by the time that child can type, coding as a
+valuable skill might have faded from the world.
- When we’ve taken on projects like this in the past, they’ve had both a
- hardware component and a software component, with Ben’s strengths
- running toward the former. We once made a neon sign that would glow
- when the subway was approaching the stop near our apartments. Ben bent
- the glass and wired up the transformer’s circuit board. I wrote code to
- process the transit data. Ben has some professional coding experience
- of his own, but it was brief, shallow, and now about twenty years out
- of date; the serious coding was left to me. For the new crossword
- project, though, Ben had introduced a third party. He’d signed up for a
- ChatGPT Plus subscription and was using GPT-4 as a coding assistant.
- [23]More on A.I.
+I first began to believe this on a Friday morning this past summer, while
+working on a small hobby project. A few months back, my friend Ben and I had
+resolved to create a Times-style crossword puzzle entirely by computer. In
+2018, we’d made a Saturday puzzle with the help of software and were surprised
+by how little we contributed—just applying our taste here and there. Now we
+would attempt to build a crossword-making program that didn’t require a human
+touch.
- [24]Sign up for The New Yorker’s weekly Science & Technology
- newsletter.
+When we’ve taken on projects like this in the past, they’ve had both a hardware
+component and a software component, with Ben’s strengths running toward the
+former. We once made a neon sign that would glow when the subway was
+approaching the stop near our apartments. Ben bent the glass and wired up the
+transformer’s circuit board. I wrote code to process the transit data. Ben has
+some professional coding experience of his own, but it was brief, shallow, and
+now about twenty years out of date; the serious coding was left to me. For the
+new crossword project, though, Ben had introduced a third party. He’d signed up
+for a ChatGPT Plus subscription and was using GPT-4 as a coding assistant.
- Something strange started happening. Ben and I would talk about a bit
- of software we wanted for the project. Then, a shockingly short time
- later, Ben would deliver it himself. At one point, we wanted a command
- that would print a hundred random lines from a dictionary file. I
- thought about the problem for a few minutes, and, when thinking failed,
- tried Googling. I made some false starts using what I could gather, and
- while I did my thing—programming—Ben told GPT-4 what he wanted and got
- code that ran perfectly.
+[33]More on A.I.
- Fine: commands like those are notoriously fussy, and everybody looks
- them up anyway. It’s not real programming. A few days later, Ben talked
- about how it would be nice to have an iPhone app to rate words from the
- dictionary. But he had no idea what a pain it is to make an iPhone app.
- I’d tried a few times and never got beyond something that half worked.
- I found Apple’s programming environment forbidding. You had to learn
- not just a new language but a new program for editing and running code;
- you had to learn a zoo of “U.I. components” and all the complicated
- ways of stitching them together; and, finally, you had to figure out
- how to package the app. The mountain of new things to learn never
- seemed worth it. The next morning, I woke up to an app in my in-box
- that did exactly what Ben had said he wanted. It worked perfectly, and
- even had a cute design. Ben said that he’d made it in a few hours.
- GPT-4 had done most of the heavy lifting.
+[34]Sign up for The New Yorker’s weekly Science & Technology newsletter.
- By now, most people have had experiences with A.I. Not everyone has
- been impressed. Ben recently said, “I didn’t start really respecting it
- until I started having it write code for me.” I suspect that
- non-programmers who are skeptical by nature, and who have seen ChatGPT
- turn out wooden prose or bogus facts, are still underestimating what’s
- happening.
+Something strange started happening. Ben and I would talk about a bit of
+software we wanted for the project. Then, a shockingly short time later, Ben
+would deliver it himself. At one point, we wanted a command that would print a
+hundred random lines from a dictionary file. I thought about the problem for a
+few minutes, and, when thinking failed, tried Googling. I made some false
+starts using what I could gather, and while I did my thing—programming—Ben told
+GPT-4 what he wanted and got code that ran perfectly.
- Bodies of knowledge and skills that have traditionally taken lifetimes
- to master are being swallowed at a gulp. Coding has always felt to me
- like an endlessly deep and rich domain. Now I find myself wanting to
- write a eulogy for it. I keep thinking of Lee Sedol. Sedol was one of
- the world’s best Go players, and a national hero in South Korea, but is
- now best known for losing, in 2016, to a computer program called
- AlphaGo. Sedol had walked into the competition believing that he would
- easily defeat the A.I. By the end of the days-long match, he was proud
- of having eked out a single game. As it became clear that he was going
- to lose, Sedol said, in a press conference, “I want to apologize for
- being so powerless.” He retired three years later. Sedol seemed weighed
- down by a question that has started to feel familiar, and urgent: What
- will become of this thing I’ve given so much of my life to?
+Fine: commands like those are notoriously fussy, and everybody looks them up
+anyway. It’s not real programming. A few days later, Ben talked about how it
+would be nice to have an iPhone app to rate words from the dictionary. But he
+had no idea what a pain it is to make an iPhone app. I’d tried a few times and
+never got beyond something that half worked. I found Apple’s programming
+environment forbidding. You had to learn not just a new language but a new
+program for editing and running code; you had to learn a zoo of “U.I.
+components” and all the complicated ways of stitching them together; and,
+finally, you had to figure out how to package the app. The mountain of new
+things to learn never seemed worth it. The next morning, I woke up to an app in
+my in-box that did exactly what Ben had said he wanted. It worked perfectly,
+and even had a cute design. Ben said that he’d made it in a few hours. GPT-4
+had done most of the heavy lifting.
- My first enchantment with computers came when I was about six years
- old, in Montreal in the early nineties, playing Mortal Kombat with my
- oldest brother. He told me about some “fatalities”—gruesome, witty ways
- of killing your opponent. Neither of us knew how to inflict them. He
- dialled up an FTP server (where files were stored) in an MS-DOS
- terminal and typed obscure commands. Soon, he had printed out a page of
- codes—instructions for every fatality in the game. We went back to the
- basement and exploded each other’s heads.
+By now, most people have had experiences with A.I. Not everyone has been
+impressed. Ben recently said, “I didn’t start really respecting it until I
+started having it write code for me.” I suspect that non-programmers who are
+skeptical by nature, and who have seen ChatGPT turn out wooden prose or bogus
+facts, are still underestimating what’s happening.
- I thought that my brother was a hacker. Like many programmers, I
- dreamed of breaking into and controlling remote systems. The point
- wasn’t to cause mayhem—it was to find hidden places and learn hidden
- things. “My crime is that of curiosity,” goes “The Hacker’s Manifesto,”
- written in 1986 by Loyd Blankenship. My favorite scene from the 1995
- movie “Hackers” is when Dade Murphy, a newcomer, proves himself at an
- underground club. Someone starts pulling a rainbow of computer books
- out of a backpack, and Dade recognizes each one from the cover: the
- green book on international Unix environments; the red one on
- N.S.A.-trusted networks; the one with the pink-shirted guy on I.B.M.
- PCs. Dade puts his expertise to use when he turns on the sprinkler
- system at school, and helps right the ballast of an oil tanker—all by
- tap-tapping away at a keyboard. The lesson was that knowledge is power.
+Bodies of knowledge and skills that have traditionally taken lifetimes to
+master are being swallowed at a gulp. Coding has always felt to me like an
+endlessly deep and rich domain. Now I find myself wanting to write a eulogy for
+it. I keep thinking of Lee Sedol. Sedol was one of the world’s best Go players,
+and a national hero in South Korea, but is now best known for losing, in 2016,
+to a computer program called AlphaGo. Sedol had walked into the competition
+believing that he would easily defeat the A.I. By the end of the days-long
+match, he was proud of having eked out a single game. As it became clear that
+he was going to lose, Sedol said, in a press conference, “I want to apologize
+for being so powerless.” He retired three years later. Sedol seemed weighed
+down by a question that has started to feel familiar, and urgent: What will
+become of this thing I’ve given so much of my life to?
- But how do you actually learn to hack? My family had settled in New
- Jersey by the time I was in fifth grade, and when I was in high school
- I went to the Borders bookstore in the Short Hills mall and bought
- “Beginning Visual C++,” by Ivor Horton. It ran to twelve hundred
- pages—my first grimoire. Like many tutorials, it was easy at first and
- then, suddenly, it wasn’t. Medieval students called the moment at which
- casual learners fail the pons asinorum, or “bridge of asses.” The term
- was inspired by Proposition 5 of Euclid’s Elements I, the first truly
- difficult idea in the book. Those who crossed the bridge would go on to
- master geometry; those who didn’t would remain dabblers. Section 4.3 of
- “Beginning Visual C++,” on “Dynamic Memory Allocation,” was my bridge
- of asses. I did not cross.
+My first enchantment with computers came when I was about six years old, in
+Montreal in the early nineties, playing Mortal Kombat with my oldest brother.
+He told me about some “fatalities”—gruesome, witty ways of killing your
+opponent. Neither of us knew how to inflict them. He dialled up an FTP server
+(where files were stored) in an MS-DOS terminal and typed obscure commands.
+Soon, he had printed out a page of codes—instructions for every fatality in the
+game. We went back to the basement and exploded each other’s heads.
- But neither did I drop the subject. I remember the moment things began
- to turn. I was on a long-haul flight, and I’d brought along a boxy
- black laptop and a CD-ROM with the Borland C++ compiler. A compiler
- translates code you write into code that the machine can run; I had
- been struggling for days to get this one to work. By convention, every
- coder’s first program does nothing but generate the words “Hello,
- world.” When I tried to run my version, I just got angry error
- messages. Whenever I fixed one problem, another cropped up. I had read
- the “Harry Potter” books and felt as if I were in possession of a broom
- but had not yet learned the incantation to make it fly. Knowing what
- might be possible if I did, I kept at it with single-minded devotion.
- What I learned was that programming is not really about knowledge or
- skill but simply about patience, or maybe obsession. Programmers are
- people who can endure an endless parade of tedious obstacles. Imagine
- explaining to a simpleton how to assemble furniture over the phone,
- with no pictures, in a language you barely speak. Imagine, too, that
- the only response you ever get is that you’ve suggested an absurdity
- and the whole thing has gone awry. All the sweeter, then, when you
- manage to get something assembled. I have a distinct memory of lying on
- my stomach in the airplane aisle, and then hitting Enter one last time.
- I sat up. The computer, for once, had done what I’d told it to do. The
- words “Hello, world” appeared above my cursor, now in the computer’s
- own voice. It seemed as if an intelligence had woken up and introduced
- itself to me.
+I thought that my brother was a hacker. Like many programmers, I dreamed of
+breaking into and controlling remote systems. The point wasn’t to cause
+mayhem—it was to find hidden places and learn hidden things. “My crime is that
+of curiosity,” goes “The Hacker’s Manifesto,” written in 1986 by Loyd
+Blankenship. My favorite scene from the 1995 movie “Hackers” is when Dade
+Murphy, a newcomer, proves himself at an underground club. Someone starts
+pulling a rainbow of computer books out of a backpack, and Dade recognizes each
+one from the cover: the green book on international Unix environments; the red
+one on N.S.A.-trusted networks; the one with the pink-shirted guy on I.B.M.
+PCs. Dade puts his expertise to use when he turns on the sprinkler system at
+school, and helps right the ballast of an oil tanker—all by tap-tapping away at
+a keyboard. The lesson was that knowledge is power.
- Most of us never became the kind of hackers depicted in “Hackers.” To
- “hack,” in the parlance of a programmer, is just to tinker—to express
- ingenuity through code. I never formally studied programming; I just
- kept messing around, making computers do helpful or delightful little
- things. In my freshman year of college, I knew that I’d be on the road
- during the third round of the 2006 Masters Tournament, when Tiger Woods
- was moving up the field, and I wanted to know what was happening in
- real time. So I made a program that scraped the leaderboard on
- pgatour.com and sent me a text message anytime he birdied or bogeyed.
- Later, after reading “Ulysses” in an English class, I wrote a program
- that pulled random sentences from the book, counted their syllables,
- and assembled haikus—a more primitive regurgitation of language than
- you’d get from a chatbot these days, but nonetheless capable, I
- thought, of real poetry:
+But how do you actually learn to hack? My family had settled in New Jersey by
+the time I was in fifth grade, and when I was in high school I went to the
+Borders bookstore in the Short Hills mall and bought “Beginning Visual C++,” by
+Ivor Horton. It ran to twelve hundred pages—my first grimoire. Like many
+tutorials, it was easy at first and then, suddenly, it wasn’t. Medieval
+students called the moment at which casual learners fail the pons asinorum, or
+“bridge of asses.” The term was inspired by Proposition 5 of Euclid’s Elements
+I, the first truly difficult idea in the book. Those who crossed the bridge
+would go on to master geometry; those who didn’t would remain dabblers. Section
+4.3 of “Beginning Visual C++,” on “Dynamic Memory Allocation,” was my bridge of
+asses. I did not cross.
- I’ll flay him alive
- Uncertainly he waited
- Heavy of the past
+But neither did I drop the subject. I remember the moment things began to turn.
+I was on a long-haul flight, and I’d brought along a boxy black laptop and a
+CD-ROM with the Borland C++ compiler. A compiler translates code you write into
+code that the machine can run; I had been struggling for days to get this one
+to work. By convention, every coder’s first program does nothing but generate
+the words “Hello, world.” When I tried to run my version, I just got angry
+error messages. Whenever I fixed one problem, another cropped up. I had read
+the “Harry Potter” books and felt as if I were in possession of a broom but had
+not yet learned the incantation to make it fly. Knowing what might be possible
+if I did, I kept at it with single-minded devotion. What I learned was that
+programming is not really about knowledge or skill but simply about patience,
+or maybe obsession. Programmers are people who can endure an endless parade of
+tedious obstacles. Imagine explaining to a simpleton how to assemble furniture
+over the phone, with no pictures, in a language you barely speak. Imagine, too,
+that the only response you ever get is that you’ve suggested an absurdity and
+the whole thing has gone awry. All the sweeter, then, when you manage to get
+something assembled. I have a distinct memory of lying on my stomach in the
+airplane aisle, and then hitting Enter one last time. I sat up. The computer,
+for once, had done what I’d told it to do. The words “Hello, world” appeared
+above my cursor, now in the computer’s own voice. It seemed as if an
+intelligence had woken up and introduced itself to me.
- I began taking coding seriously. I offered to do programming for a
- friend’s startup. The world of computing, I came to learn, is vast but
- organized almost geologically, as if deposited in layers. From the Web
- browser down to the transistor, each sub-area or system is built atop
- some other, older sub-area or system, the layers dense but legible. The
- more one digs, the more one develops what the race-car driver Jackie
- Stewart called “mechanical sympathy,” a sense for the machine’s
- strengths and limits, of what one could make it do.
+Most of us never became the kind of hackers depicted in “Hackers.” To “hack,”
+in the parlance of a programmer, is just to tinker—to express ingenuity through
+code. I never formally studied programming; I just kept messing around, making
+computers do helpful or delightful little things. In my freshman year of
+college, I knew that I’d be on the road during the third round of the 2006
+Masters Tournament, when Tiger Woods was moving up the field, and I wanted to
+know what was happening in real time. So I made a program that scraped the
+leaderboard on pgatour.com and sent me a text message anytime he birdied or
+bogeyed. Later, after reading “Ulysses” in an English class, I wrote a program
+that pulled random sentences from the book, counted their syllables, and
+assembled haikus—a more primitive regurgitation of language than you’d get from
+a chatbot these days, but nonetheless capable, I thought, of real poetry:
- At my friend’s company, I felt my mechanical sympathy developing. In my
- sophomore year, I was watching “Jeopardy!” with a friend when he
- suggested that I make a playable version of the show. I thought about
- it for a few hours before deciding, with much disappointment, that it
- was beyond me. But when the idea came up again, in my junior year, I
- could see a way through it. I now had a better sense of what one could
- do with the machine. I spent the next fourteen hours building the game.
- Within weeks, playing “Jimbo Jeopardy!” had become a regular activity
- among my friends. The experience was profound. I could understand why
- people poured their lives into craft: there is nothing quite like
- watching someone enjoy a thing you’ve made.
+ I’ll flay him alive
+ Uncertainly he waited
+ Heavy of the past
- In the midst of all this, I had gone full “Paper Chase” and begun
- ignoring my grades. I worked voraciously, just not on my coursework.
- One night, I took over a half-dozen machines in a basement computer lab
- to run a program in parallel. I laid printouts full of numbers across
- the floor, thinking through a pathfinding algorithm. The cost was that
- I experienced for real that recurring nightmare in which you show up
- for a final exam knowing nothing of the material. (Mine was in Real
- Analysis, in the math department.) In 2009, during the most severe
- financial crisis in decades, I graduated with a 2.9 G.P.A.
+I began taking coding seriously. I offered to do programming for a friend’s
+startup. The world of computing, I came to learn, is vast but organized almost
+geologically, as if deposited in layers. From the Web browser down to the
+transistor, each sub-area or system is built atop some other, older sub-area or
+system, the layers dense but legible. The more one digs, the more one develops
+what the race-car driver Jackie Stewart called “mechanical sympathy,” a sense
+for the machine’s strengths and limits, of what one could make it do.
- And yet I got my first full-time job easily. I had work experience as a
- programmer; nobody asked about my grades. For the young coder, these
- were boom times. Companies were getting into bidding wars over top
- programmers. Solicitations for experienced programmers were so
- aggressive that they complained about “recruiter spam.” The popularity
- of university computer-science programs was starting to explode. (My
- degree was in economics.) Coding “boot camps” sprang up that could
- credibly claim to turn beginners into high-salaried programmers in less
- than a year. At one of my first job interviews, in my early twenties,
- the C.E.O. asked how much I thought I deserved to get paid. I dared to
- name a number that faintly embarrassed me. He drew up a contract on the
- spot, offering ten per cent more. The skills of a “software engineer”
- were vaunted. At one company where I worked, someone got in trouble for
- using HipChat, a predecessor to Slack, to ask one of my colleagues a
- question. “Never HipChat an engineer directly,” he was told. We were
- too important for that.
+At my friend’s company, I felt my mechanical sympathy developing. In my
+sophomore year, I was watching “Jeopardy!” with a friend when he suggested that
+I make a playable version of the show. I thought about it for a few hours
+before deciding, with much disappointment, that it was beyond me. But when the
+idea came up again, in my junior year, I could see a way through it. I now had
+a better sense of what one could do with the machine. I spent the next fourteen
+hours building the game. Within weeks, playing “Jimbo Jeopardy!” had become a
+regular activity among my friends. The experience was profound. I could
+understand why people poured their lives into craft: there is nothing quite
+like watching someone enjoy a thing you’ve made.
- This was an era of near-zero interest rates and extraordinary
- tech-sector growth. Certain norms were established. Companies like
- Google taught the industry that coders were to have free espresso and
- catered hot food, world-class health care and parental leave, on-site
- gyms and bike rooms, a casual dress code, and “twenty-per-cent time,”
- meaning that they could devote one day a week to working on whatever
- they pleased. Their skills were considered so crucial and delicate that
- a kind of superstition developed around the work. For instance, it was
- considered foolish to estimate how long a coding task might take, since
- at any moment the programmer might turn over a rock and discover a
- tangle of bugs. Deadlines were anathema. If the pressure to deliver
- ever got too intense, a coder needed only to speak the word “burnout”
- to buy a few months.
+In the midst of all this, I had gone full “Paper Chase” and begun ignoring my
+grades. I worked voraciously, just not on my coursework. One night, I took over
+a half-dozen machines in a basement computer lab to run a program in parallel.
+I laid printouts full of numbers across the floor, thinking through a
+pathfinding algorithm. The cost was that I experienced for real that recurring
+nightmare in which you show up for a final exam knowing nothing of the
+material. (Mine was in Real Analysis, in the math department.) In 2009, during
+the most severe financial crisis in decades, I graduated with a 2.9 G.P.A.
- From the beginning, I had the sense that there was something
- wrongheaded in all this. Was what we did really so precious? How long
- could the boom last? In my teens, I had done a little Web design, and,
- at the time, that work had been in demand and highly esteemed. You
- could earn thousands of dollars for a project that took a weekend. But
- along came tools like Squarespace, which allowed pizzeria owners and
- freelance artists to make their own Web sites just by clicking around.
- For professional coders, a tranche of high-paying, relatively
- low-effort work disappeared.
- [25]“I should have known he has absolutely no morals—Ive seen how he
- loads a dishwasher.”
- “I should have known he has absolutely no morals—I’ve seen how he loads
- a dishwasher.”
- Cartoon by Hartley Lin
- (BUTTON) Copy link to cartoon
+And yet I got my first full-time job easily. I had work experience as a
+programmer; nobody asked about my grades. For the young coder, these were boom
+times. Companies were getting into bidding wars over top programmers.
+Solicitations for experienced programmers were so aggressive that they
+complained about “recruiter spam.” The popularity of university
+computer-science programs was starting to explode. (My degree was in
+economics.) Coding “boot camps” sprang up that could credibly claim to turn
+beginners into high-salaried programmers in less than a year. At one of my
+first job interviews, in my early twenties, the C.E.O. asked how much I thought
+I deserved to get paid. I dared to name a number that faintly embarrassed me.
+He drew up a contract on the spot, offering ten per cent more. The skills of a
+“software engineer” were vaunted. At one company where I worked, someone got in
+trouble for using HipChat, a predecessor to Slack, to ask one of my colleagues
+a question. “Never HipChat an engineer directly,” he was told. We were too
+important for that.
- Link copied
- (BUTTON) Shop
+This was an era of near-zero interest rates and extraordinary tech-sector
+growth. Certain norms were established. Companies like Google taught the
+industry that coders were to have free espresso and catered hot food,
+world-class health care and parental leave, on-site gyms and bike rooms, a
+casual dress code, and “twenty-per-cent time,” meaning that they could devote
+one day a week to working on whatever they pleased. Their skills were
+considered so crucial and delicate that a kind of superstition developed around
+the work. For instance, it was considered foolish to estimate how long a coding
+task might take, since at any moment the programmer might turn over a rock and
+discover a tangle of bugs. Deadlines were anathema. If the pressure to deliver
+ever got too intense, a coder needed only to speak the word “burnout” to buy a
+few months.
- The response from the programmer community to these developments was
- just, Yeah, you have to keep levelling up your skills. Learn difficult,
- obscure things. Software engineers, as a species, love automation.
- Inevitably, the best of them build tools that make other kinds of work
- obsolete. This very instinct explained why we were so well taken care
- of: code had immense leverage. One piece of software could affect the
- work of millions of people. Naturally, this sometimes displaced
- programmers themselves. We were to think of these advances as a tide
- coming in, nipping at our bare feet. So long as we kept learning we
- would stay dry. Sound advice—until there’s a tsunami.
+From the beginning, I had the sense that there was something wrongheaded in all
+this. Was what we did really so precious? How long could the boom last? In my
+teens, I had done a little Web design, and, at the time, that work had been in
+demand and highly esteemed. You could earn thousands of dollars for a project
+that took a weekend. But along came tools like Squarespace, which allowed
+pizzeria owners and freelance artists to make their own Web sites just by
+clicking around. For professional coders, a tranche of high-paying, relatively
+low-effort work disappeared.
- When we were first allowed to use A.I. chatbots at work, for
- programming assistance, I studiously avoided them. I expected that my
- colleagues would, too. But soon I started seeing the telltale colors of
- an A.I. chat session—the zebra pattern of call-and-response—on
- programmers’ screens as I walked to my desk. A common refrain was that
- these tools made you more productive; in some cases, they helped you
- solve problems ten times faster.
+[35]“I should have known he has absolutely no morals—Ive seen how he loads a
+dishwasher.”
+“I should have known he has absolutely no morals—I’ve seen how he loads a
+dishwasher.”
+Cartoon by Hartley Lin
+Copy link to cartoon
- I wasn’t sure I wanted that. I enjoy the act of programming and I like
- to feel useful. The tools I’m familiar with, like the text editor I use
- to format and to browse code, serve both ends. They enhance my practice
- of the craft—and, though they allow me to deliver work faster, I still
- feel that I deserve the credit. But A.I., as it was being described,
- seemed different. It provided a lot of help. I worried that it would
- rob me of both the joy of working on puzzles and the satisfaction of
- being the one who solved them. I could be infinitely productive, and
- all I’d have to show for it would be the products themselves.
+Link copied
- The actual work product of most programmers is rarely exciting. In
- fact, it tends to be almost comically humdrum. A few months ago, I came
- home from the office and told my wife about what a great day I’d had
- wrestling a particularly fun problem. I was working on a program that
- generated a table, and someone had wanted to add a header that spanned
- more than one column—something that the custom layout engine we’d
- written didn’t support. The work was urgent: these tables were being
- used in important documents, wanted by important people. So I
- sequestered myself in a room for the better part of the afternoon.
- There were lots of lovely sub-problems: How should I allow users of the
- layout engine to convey that they want a column-spanning header? What
- should their code look like? And there were fiddly details that, if
- ignored, would cause bugs. For instance, what if one of the columns
- that the header was supposed to span got dropped because it didn’t have
- any data? I knew it was a good day because I had to pull out pen and
- pad—I was drawing out possible scenarios, checking and double-checking
- my logic.
+Shop
- But taking a bird’s-eye view of what happened that day? A table got a
- new header. It’s hard to imagine anything more mundane. For me, the
- pleasure was entirely in the process, not the product. And what would
- become of the process if it required nothing more than a three-minute
- ChatGPT session? Yes, our jobs as programmers involve many things
- besides literally writing code, such as coaching junior hires and
- designing systems at a high level. But coding has always been the root
- of it. Throughout my career, I have been interviewed and selected
- precisely for my ability to solve fiddly little programming puzzles.
- Suddenly, this ability was less important.
+The response from the programmer community to these developments was just,
+Yeah, you have to keep levelling up your skills. Learn difficult, obscure
+things. Software engineers, as a species, love automation. Inevitably, the best
+of them build tools that make other kinds of work obsolete. This very instinct
+explained why we were so well taken care of: code had immense leverage. One
+piece of software could affect the work of millions of people. Naturally, this
+sometimes displaced programmers themselves. We were to think of these advances
+as a tide coming in, nipping at our bare feet. So long as we kept learning we
+would stay dry. Sound advice—until there’s a tsunami.
- I had gathered as much from Ben, who kept telling me about the
- spectacular successes he’d been having with GPT-4. It turned out that
- it was not only good at the fiddly stuff but also had the qualities of
- a senior engineer: from a deep well of knowledge, it could suggest ways
- of approaching a problem. For one project, Ben had wired a small
- speaker and a red L.E.D. light bulb into the frame of a portrait of
- King Charles, the light standing in for the gem in his crown; the idea
- was that when you entered a message on an accompanying Web site the
- speaker would play a tune and the light would flash out the message in
- Morse code. (This was a gift for an eccentric British expat.)
- Programming the device to fetch new messages eluded Ben; it seemed to
- require specialized knowledge not just of the microcontroller he was
- using but of Firebase, the back-end server technology that stored the
- messages. Ben asked me for advice, and I mumbled a few possibilities;
- in truth, I wasn’t sure that what he wanted would be possible. Then he
- asked GPT-4. It told Ben that Firebase had a capability that would make
- the project much simpler. Here it was—and here was some code to use
- that would be compatible with the microcontroller.
+When we were first allowed to use A.I. chatbots at work, for programming
+assistance, I studiously avoided them. I expected that my colleagues would,
+too. But soon I started seeing the telltale colors of an A.I. chat session—the
+zebra pattern of call-and-response—on programmers’ screens as I walked to my
+desk. A common refrain was that these tools made you more productive; in some
+cases, they helped you solve problems ten times faster.
- Afraid to use GPT-4 myself—and feeling somewhat unclean about the
- prospect of paying OpenAI twenty dollars a month for it—I nonetheless
- started probing its capabilities, via Ben. We’d sit down to work on our
- crossword project, and I’d say, “Why don’t you try prompting it this
- way?” He’d offer me the keyboard. “No, you drive,” I’d say. Together,
- we developed a sense of what the A.I. could do. Ben, who had more
- experience with it than I did, seemed able to get more out of it in a
- stroke. As he later put it, his own neural network had begun to align
- with GPT-4’s. I would have said that he had achieved mechanical
- sympathy. Once, in a feat I found particularly astonishing, he had the
- A.I. build him a Snake game, like the one on old Nokia phones. But
- then, after a brief exchange with GPT-4, he got it to modify the game
- so that when you lost it would show you how far you strayed from the
- most efficient route. It took the bot about ten seconds to achieve
- this. It was a task that, frankly, I was not sure I could do myself.
+I wasn’t sure I wanted that. I enjoy the act of programming and I like to feel
+useful. The tools I’m familiar with, like the text editor I use to format and
+to browse code, serve both ends. They enhance my practice of the craft—and,
+though they allow me to deliver work faster, I still feel that I deserve the
+credit. But A.I., as it was being described, seemed different. It provided a
+lot of help. I worried that it would rob me of both the joy of working on
+puzzles and the satisfaction of being the one who solved them. I could be
+infinitely productive, and all I’d have to show for it would be the products
+themselves.
- In chess, which for decades now has been dominated by A.I., a player’s
- only hope is pairing up with a bot. Such half-human, half-A.I. teams,
- known as centaurs, might still be able to beat the best humans and the
- best A.I. engines working alone. Programming has not yet gone the way
- of chess. But the centaurs have arrived. GPT-4 on its own is, for the
- moment, a worse programmer than I am. Ben is much worse. But Ben plus
- GPT-4 is a dangerous thing.
+The actual work product of most programmers is rarely exciting. In fact, it
+tends to be almost comically humdrum. A few months ago, I came home from the
+office and told my wife about what a great day I’d had wrestling a particularly
+fun problem. I was working on a program that generated a table, and someone had
+wanted to add a header that spanned more than one column—something that the
+custom layout engine we’d written didn’t support. The work was urgent: these
+tables were being used in important documents, wanted by important people. So I
+sequestered myself in a room for the better part of the afternoon. There were
+lots of lovely sub-problems: How should I allow users of the layout engine to
+convey that they want a column-spanning header? What should their code look
+like? And there were fiddly details that, if ignored, would cause bugs. For
+instance, what if one of the columns that the header was supposed to span got
+dropped because it didn’t have any data? I knew it was a good day because I had
+to pull out pen and pad—I was drawing out possible scenarios, checking and
+double-checking my logic.
- It wasn’t long before I caved. I was making a little search tool at
- work and wanted to highlight the parts of the user’s query that matched
- the results. But I was splitting up the query by words in a way that
- made things much more complicated. I found myself short on patience. I
- started thinking about GPT-4. Perhaps instead of spending an afternoon
- programming I could spend some time “prompting,” or having a
- conversation with an A.I.
+But taking a bird’s-eye view of what happened that day? A table got a new
+header. It’s hard to imagine anything more mundane. For me, the pleasure was
+entirely in the process, not the product. And what would become of the process
+if it required nothing more than a three-minute ChatGPT session? Yes, our jobs
+as programmers involve many things besides literally writing code, such as
+coaching junior hires and designing systems at a high level. But coding has
+always been the root of it. Throughout my career, I have been interviewed and
+selected precisely for my ability to solve fiddly little programming puzzles.
+Suddenly, this ability was less important.
- In a 1978 essay titled “On the Foolishness of ‘Natural Language
- Programming,’ ” the computer scientist Edsger W. Dijkstra argued that
- if you were to instruct computers not in a specialized language like
- C++ or Python but in your native tongue you’d be rejecting the very
- precision that made computers useful. Formal programming languages, he
- wrote, are “an amazingly effective tool for ruling out all sorts of
- nonsense that, when we use our native tongues, are almost impossible to
- avoid.” Dijkstra’s argument became a truism in programming circles.
- When the essay made the rounds on Reddit in 2014, a top commenter
- wrote, “I’m not sure which of the following is scariest. Just how
- trivially obvious this idea is” or the fact that “many still do not
- know it.”
+I had gathered as much from Ben, who kept telling me about the spectacular
+successes he’d been having with GPT-4. It turned out that it was not only good
+at the fiddly stuff but also had the qualities of a senior engineer: from a
+deep well of knowledge, it could suggest ways of approaching a problem. For one
+project, Ben had wired a small speaker and a red L.E.D. light bulb into the
+frame of a portrait of King Charles, the light standing in for the gem in his
+crown; the idea was that when you entered a message on an accompanying Web site
+the speaker would play a tune and the light would flash out the message in
+Morse code. (This was a gift for an eccentric British expat.) Programming the
+device to fetch new messages eluded Ben; it seemed to require specialized
+knowledge not just of the microcontroller he was using but of Firebase, the
+back-end server technology that stored the messages. Ben asked me for advice,
+and I mumbled a few possibilities; in truth, I wasn’t sure that what he wanted
+would be possible. Then he asked GPT-4. It told Ben that Firebase had a
+capability that would make the project much simpler. Here it was—and here was
+some code to use that would be compatible with the microcontroller.
- When I first used GPT-4, I could see what Dijkstra was talking about.
- You can’t just say to the A.I., “Solve my problem.” That day may come,
- but for now it is more like an instrument you must learn to play. You
- have to specify what you want carefully, as though talking to a
- beginner. In the search-highlighting problem, I found myself asking
- GPT-4 to do too much at once, watching it fail, and then starting over.
- Each time, my prompts became less ambitious. By the end of the
- conversation, I wasn’t talking about search or highlighting; I had
- broken the problem into specific, abstract, unambiguous sub-problems
- that, together, would give me what I wanted.
+Afraid to use GPT-4 myself—and feeling somewhat unclean about the prospect of
+paying OpenAI twenty dollars a month for it—I nonetheless started probing its
+capabilities, via Ben. We’d sit down to work on our crossword project, and I’d
+say, “Why don’t you try prompting it this way?” He’d offer me the keyboard.
+“No, you drive,” I’d say. Together, we developed a sense of what the A.I. could
+do. Ben, who had more experience with it than I did, seemed able to get more
+out of it in a stroke. As he later put it, his own neural network had begun to
+align with GPT-4’s. I would have said that he had achieved mechanical sympathy.
+Once, in a feat I found particularly astonishing, he had the A.I. build him a
+Snake game, like the one on old Nokia phones. But then, after a brief exchange
+with GPT-4, he got it to modify the game so that when you lost it would show
+you how far you strayed from the most efficient route. It took the bot about
+ten seconds to achieve this. It was a task that, frankly, I was not sure I
+could do myself.
- Having found the A.I.’s level, I felt almost instantly that my working
- life had been transformed. Everywhere I looked I could see GPT-4-size
- holes; I understood, finally, why the screens around the office were
- always filled with chat sessions—and how Ben had become so productive.
- I opened myself up to trying it more often.
+In chess, which for decades now has been dominated by A.I., a player’s only
+hope is pairing up with a bot. Such half-human, half-A.I. teams, known as
+centaurs, might still be able to beat the best humans and the best A.I. engines
+working alone. Programming has not yet gone the way of chess. But the centaurs
+have arrived. GPT-4 on its own is, for the moment, a worse programmer than I
+am. Ben is much worse. But Ben plus GPT-4 is a dangerous thing.
- I returned to the crossword project. Our puzzle generator printed its
- output in an ugly text format, with lines like
- "s""c""a""r""*""k""u""n""i""s""*" "a""r""e""a". I wanted to turn output
- like that into a pretty Web page that allowed me to explore the words
- in the grid, showing scoring information at a glance. But I knew the
- task would be tricky: each letter had to be tagged with the words it
- belonged to, both the across and the down. This was a detailed problem,
- one that could easily consume the better part of an evening. With the
- baby on the way, I was short on free evenings. So I began a
- conversation with GPT-4. Some back-and-forth was required; at one
- point, I had to read a few lines of code myself to understand what it
- was doing. But I did little of the kind of thinking I once believed to
- be constitutive of coding. I didn’t think about numbers, patterns, or
- loops; I didn’t use my mind to simulate the activity of the computer.
- As another coder, Geoffrey Litt, wrote after a similar experience, “I
- never engaged my detailed programmer brain.” So what did I do?
+It wasn’t long before I caved. I was making a little search tool at work and
+wanted to highlight the parts of the user’s query that matched the results. But
+I was splitting up the query by words in a way that made things much more
+complicated. I found myself short on patience. I started thinking about GPT-4.
+Perhaps instead of spending an afternoon programming I could spend some time
+“prompting,” or having a conversation with an A.I.
- Perhaps what pushed Lee Sedol to retire from the game of Go was the
- sense that the game had been forever cheapened. When I got into
- programming, it was because computers felt like a form of magic. The
- machine gave you powers but required you to study its arcane secrets—to
- learn a spell language. This took a particular cast of mind. I felt
- selected. I devoted myself to tedium, to careful thinking, and to the
- accumulation of obscure knowledge. Then, one day, it became possible to
- achieve many of the same ends without the thinking and without the
- knowledge. Looked at in a certain light, this can make quite a lot of
- one’s working life seem like a waste of time.
+In a 1978 essay titled “On the Foolishness of ‘Natural Language Programming,’ ”
+the computer scientist Edsger W. Dijkstra argued that if you were to instruct
+computers not in a specialized language like C++ or Python but in your native
+tongue you’d be rejecting the very precision that made computers useful. Formal
+programming languages, he wrote, are “an amazingly effective tool for ruling
+out all sorts of nonsense that, when we use our native tongues, are almost
+impossible to avoid.” Dijkstra’s argument became a truism in programming
+circles. When the essay made the rounds on Reddit in 2014, a top commenter
+wrote, “I’m not sure which of the following is scariest. Just how trivially
+obvious this idea is” or the fact that “many still do not know it.”
- But whenever I think about Sedol I think about chess. After machines
- conquered that game, some thirty years ago, the fear was that there
- would be no reason to play it anymore. Yet chess has never been more
- popular—A.I. has enlivened the game. A friend of mine picked it up
- recently. At all hours, he has access to an A.I. coach that can feed
- him chess problems just at the edge of his ability and can tell him,
- after he’s lost a game, exactly where he went wrong. Meanwhile, at the
- highest levels, grandmasters study moves the computer proposes as if
- reading tablets from the gods. Learning chess has never been easier;
- studying its deepest secrets has never been more exciting.
+When I first used GPT-4, I could see what Dijkstra was talking about. You can’t
+just say to the A.I., “Solve my problem.” That day may come, but for now it is
+more like an instrument you must learn to play. You have to specify what you
+want carefully, as though talking to a beginner. In the search-highlighting
+problem, I found myself asking GPT-4 to do too much at once, watching it fail,
+and then starting over. Each time, my prompts became less ambitious. By the end
+of the conversation, I wasn’t talking about search or highlighting; I had
+broken the problem into specific, abstract, unambiguous sub-problems that,
+together, would give me what I wanted.
- Computing is not yet overcome. GPT-4 is impressive, but a layperson
- can’t wield it the way a programmer can. I still feel secure in my
- profession. In fact, I feel somewhat more secure than before. As
- software gets easier to make, it’ll proliferate; programmers will be
- tasked with its design, its configuration, and its maintenance. And
- though I’ve always found the fiddly parts of programming the most
- calming, and the most essential, I’m not especially good at them. I’ve
- failed many classic coding interview tests of the kind you find at Big
- Tech companies. The thing I’m relatively good at is knowing what’s
- worth building, what users like, how to communicate both technically
- and humanely. A friend of mine has called this A.I. moment “the revenge
- of the so-so programmer.” As coding per se begins to matter less, maybe
- softer skills will shine.
+Having found the A.I.’s level, I felt almost instantly that my working life had
+been transformed. Everywhere I looked I could see GPT-4-size holes; I
+understood, finally, why the screens around the office were always filled with
+chat sessions—and how Ben had become so productive. I opened myself up to
+trying it more often.
- That still leaves open the matter of what to teach my unborn child. I
- suspect that, as my child comes of age, we will think of “the
- programmer” the way we now look back on “the computer,” when that
- phrase referred to a person who did calculations by hand. Programming
- by typing C++ or Python yourself might eventually seem as ridiculous as
- issuing instructions in binary onto a punch card. Dijkstra would be
- appalled, but getting computers to do precisely what you want might
- become a matter of asking politely.
+I returned to the crossword project. Our puzzle generator printed its output in
+an ugly text format, with lines like "s""c""a""r""*""k""u""n""i""s""*"
+"a""r""e""a". I wanted to turn output like that into a pretty Web page that
+allowed me to explore the words in the grid, showing scoring information at a
+glance. But I knew the task would be tricky: each letter had to be tagged with
+the words it belonged to, both the across and the down. This was a detailed
+problem, one that could easily consume the better part of an evening. With the
+baby on the way, I was short on free evenings. So I began a conversation with
+GPT-4. Some back-and-forth was required; at one point, I had to read a few
+lines of code myself to understand what it was doing. But I did little of the
+kind of thinking I once believed to be constitutive of coding. I didn’t think
+about numbers, patterns, or loops; I didn’t use my mind to simulate the
+activity of the computer. As another coder, Geoffrey Litt, wrote after a
+similar experience, “I never engaged my detailed programmer brain.” So what did
+I do?
- So maybe the thing to teach isn’t a skill but a spirit. I sometimes
- think of what I might have been doing had I been born in a different
- time. The coders of the agrarian days probably futzed with waterwheels
- and crop varietals; in the Newtonian era, they might have been obsessed
- with glass, and dyes, and timekeeping. I was reading an oral history of
- neural networks recently, and it struck me how many of the people
- interviewed—people born in and around the nineteen-thirties—had played
- with radios when they were little. Maybe the next cohort will spend
- their late nights in the guts of the A.I.s their parents once regarded
- as black boxes. I shouldn’t worry that the era of coding is winding
- down. Hacking is forever. ♦
+Perhaps what pushed Lee Sedol to retire from the game of Go was the sense that
+the game had been forever cheapened. When I got into programming, it was
+because computers felt like a form of magic. The machine gave you powers but
+required you to study its arcane secrets—to learn a spell language. This took a
+particular cast of mind. I felt selected. I devoted myself to tedium, to
+careful thinking, and to the accumulation of obscure knowledge. Then, one day,
+it became possible to achieve many of the same ends without the thinking and
+without the knowledge. Looked at in a certain light, this can make quite a lot
+of one’s working life seem like a waste of time.
- Published in the print edition of the [26]November 20, 2023, issue,
- with the headline “Begin End.”
+But whenever I think about Sedol I think about chess. After machines conquered
+that game, some thirty years ago, the fear was that there would be no reason to
+play it anymore. Yet chess has never been more popular—A.I. has enlivened the
+game. A friend of mine picked it up recently. At all hours, he has access to an
+A.I. coach that can feed him chess problems just at the edge of his ability and
+can tell him, after he’s lost a game, exactly where he went wrong. Meanwhile,
+at the highest levels, grandmasters study moves the computer proposes as if
+reading tablets from the gods. Learning chess has never been easier; studying
+its deepest secrets has never been more exciting.
+
+Computing is not yet overcome. GPT-4 is impressive, but a layperson can’t wield
+it the way a programmer can. I still feel secure in my profession. In fact, I
+feel somewhat more secure than before. As software gets easier to make, it’ll
+proliferate; programmers will be tasked with its design, its configuration, and
+its maintenance. And though I’ve always found the fiddly parts of programming
+the most calming, and the most essential, I’m not especially good at them. I’ve
+failed many classic coding interview tests of the kind you find at Big Tech
+companies. The thing I’m relatively good at is knowing what’s worth building,
+what users like, how to communicate both technically and humanely. A friend of
+mine has called this A.I. moment “the revenge of the so-so programmer.” As
+coding per se begins to matter less, maybe softer skills will shine.
+
+That still leaves open the matter of what to teach my unborn child. I suspect
+that, as my child comes of age, we will think of “the programmer” the way we
+now look back on “the computer,” when that phrase referred to a person who did
+calculations by hand. Programming by typing C++ or Python yourself might
+eventually seem as ridiculous as issuing instructions in binary onto a punch
+card. Dijkstra would be appalled, but getting computers to do precisely what
+you want might become a matter of asking politely.
+
+So maybe the thing to teach isn’t a skill but a spirit. I sometimes think of
+what I might have been doing had I been born in a different time. The coders of
+the agrarian days probably futzed with waterwheels and crop varietals; in the
+Newtonian era, they might have been obsessed with glass, and dyes, and
+timekeeping. I was reading an oral history of neural networks recently, and it
+struck me how many of the people interviewed—people born in and around the
+nineteen-thirties—had played with radios when they were little. Maybe the next
+cohort will spend their late nights in the guts of the A.I.s their parents once
+regarded as black boxes. I shouldn’t worry that the era of coding is winding
+down. Hacking is forever. ♦
+
+Published in the print edition of the [38]November 20, 2023, issue, with the
+headline “Begin End.”
More Science and Technology
- * Can we [27]stop runaway A.I.?
- * Saving the climate will depend on blue-collar workers. Can we train
- enough of them [28]before time runs out?
- * There are ways of controlling A.I.—but first we [29]need to stop
- mythologizing it.
- * A security camera [30]for the entire planet.
- * What’s the point of [31]reading writing by humans?
- * A heat shield for [32]the most important ice on Earth.
- * The climate solutions [33]we can’t live without.
+ • Can we [39]stop runaway A.I.?
- [34]Sign up for our daily newsletter to receive the best stories from
- The New Yorker.
- [35]James Somers is a writer and a programmer based in New York.
+ • Saving the climate will depend on blue-collar workers. Can we train enough
+ of them [40]before time runs out?
+
+ • There are ways of controlling A.I.—but first we [41]need to stop
+ mythologizing it.
+
+ • A security camera [42]for the entire planet.
+
+ • What’s the point of [43]reading writing by humans?
+
+ • A heat shield for [44]the most important ice on Earth.
+
+ • The climate solutions [45]we can’t live without.
+
+[46]Sign up for our daily newsletter to receive the best stories from The New
+Yorker.
+
+[47]James Somers is a writer and a programmer based in New York.
Weekly
- Enjoy our flagship newsletter as a digest delivered once a week.
- E-mail address
- ____________________
- (BUTTON) Sign up
+Enjoy our flagship newsletter as a digest delivered once a week.
+E-mail address
+[48][ ]
+Sign up
- By signing up, you agree to our [36]User Agreement and [37]Privacy
- Policy & Cookie Statement. This site is protected by reCAPTCHA and the
- Google[38] Privacy Policy and[39] Terms of Service apply.
+By signing up, you agree to our [50]User Agreement and [51]Privacy Policy &
+Cookie Statement. This site is protected by reCAPTCHA and the Google[52]
+Privacy Policy and[53] Terms of Service apply.
- Read More
- [40]
- The Beach House
- Fiction
- The Beach House
- [41]
- The Beach House
- Her father said that he loved her—he just wasn’t going to leave her the
- beach house, which to him had become not the beach house at all but, in
- truth, something else entirely.
+Read More
+[54]
+How a Notorious Gangster Was Exposed by His Own Sister
+Letter from Amsterdam
+[55]
+How a Notorious Gangster Was Exposed by His Own Sister
+[56]
+How a Notorious Gangster Was Exposed by His Own Sister
+Astrid Holleeder secretly recorded her brother’s murderous confessions. Will he
+exact revenge?
- By Joy Williams
- [42]“Crown Heights North”
- Fiction
- “Crown Heights North”
- [43]
- “Crown Heights North”
- The dead man decided to try the running app.
+By Patrick Radden Keefe
- By Rivka Galchen
- [44]Can Crosswords Be More Inclusive?
- Annals of Gaming
- Can Crosswords Be More Inclusive?
- [45]
- Can Crosswords Be More Inclusive?
- The puzzles spread from the United States across the globe, but the
- American crossword today doesn’t always reflect the linguistic changes
- that immigration brings.
+[57]
+When Foster Parents Don’t Want to Give Back the Baby
+Annals of Law
+[58]
+When Foster Parents Don’t Want to Give Back the Baby
+[59]
+When Foster Parents Don’t Want to Give Back the Baby
+In many states, adoption lawyers are pushing a new legal strategy that forces
+biological parents to compete for custody of their children.
- By Natan Last
- [46]Coming of Age at the Dawn of the Social Internet
- The Weekend Essay
- Coming of Age at the Dawn of the Social Internet
- [47]
- Coming of Age at the Dawn of the Social Internet
- Online platforms allowed me to cultivate a freer version of myself.
- Then the digital world began to close off.
+By Eli Hager
- By Kyle Chayka
+[60]
+Trial by Twitter
+A Reporter at Large
+[61]
+Trial by Twitter
- [48]The New Yorker
+By Ariel Levy
- (BUTTON) Sections
- * [49]News
- * [50]Books & Culture
- * [51]Fiction & Poetry
- * [52]Humor & Cartoons
- * [53]Magazine
- * [54]Crossword
- * [55]Video
- * [56]Podcasts
- * [57]Archive
- * [58]Goings On
+[62]
+Britney Spears’s Conservatorship Nightmare
+American Chronicles
+[63]
+Britney Spears’s Conservatorship Nightmare
+[64]
+Britney Spears’s Conservatorship Nightmare
+How the pop star’s father and a team of lawyers seized control of her life—and
+have held on to it for thirteen years.
- (BUTTON) More
- * [59]Customer Care
- * [60]Shop The New Yorker
- * [61]Buy Covers and Cartoons
- * [62]Condé Nast Store
- * [63]Digital Access
- * [64]Newsletters
- * [65]Jigsaw Puzzle
- * [66]RSS
+By Ronan Farrow
- * [67]About
- * [68]Careers
- * [69]Contact
- * [70]F.A.Q.
- * [71]Media Kit
- * [72]Press
- * [73]Accessibility Help
+[65]The New Yorker
- © 2024 Condé Nast. All rights reserved. Use of this site constitutes
- acceptance of our [74]User Agreement and [75]Privacy Policy and Cookie
- Statement and [76]Your California Privacy Rights. The New Yorker may
- earn a portion of sales from products that are purchased through our
- site as part of our Affiliate Partnerships with retailers. The material
- on this site may not be reproduced, distributed, transmitted, cached or
- otherwise used, except with the prior written permission of Condé Nast.
- [77]Ad Choices
- *
- *
- *
- *
- *
+Sections
- (BUTTON) Do Not Sell My Personal Info
+ • [67]News
+ • [68]Books & Culture
+ • [69]Fiction & Poetry
+ • [70]Humor & Cartoons
+ • [71]Magazine
+ • [72]Crossword
+ • [73]Video
+ • [74]Podcasts
+ • [75]Archive
+ • [76]Goings On
-References
+More
- Visible links:
- 1. https://www.newyorker.com/feed/rss
- 2. https://www.googletagmanager.com/ns.html?id=GTM-NX5LSK3
- 3. https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?currentPage=all#main-content
- 4. https://www.newyorker.com/
- 5. https://www.newyorker.com/newsletters
- 6. https://www.newyorker.com/account/saved
- 7. https://www.newyorker.com/auth/initiate?redirectURL=/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft&source=VERSO_NAVIGATION
- 8. https://www.newyorker.com/search
- 9. https://www.newyorker.com/latest
- 10. https://www.newyorker.com/news
- 11. https://www.newyorker.com/culture
- 12. https://www.newyorker.com/fiction-and-poetry
- 13. https://www.newyorker.com/humor
- 14. https://www.newyorker.com/magazine
- 15. https://www.newyorker.com/crossword-puzzles-and-games
- 16. https://www.newyorker.com/video
- 17. https://www.newyorker.com/podcasts
- 18. https://www.newyorker.com/goings-on
- 19. https://store.newyorker.com/
- 20. https://www.newyorker.com/
- 21. https://www.newyorker.com/magazine/personal-history
- 22. https://www.newyorker.com/contributors/james-somers
- 23. https://www.newyorker.com/newsletter/science-technology
- 24. https://www.newyorker.com/newsletter/science-technology
- 25. https://www.newyorker.com/cartoon/a27287
- 26. https://www.newyorker.com/magazine/2023/11/20
- 27. https://www.newyorker.com/science/annals-of-artificial-intelligence/can-we-stop-the-singularity
- 28. https://www.newyorker.com/news/dept-of-energy/the-great-electrician-shortage
- 29. https://www.newyorker.com/science/annals-of-artificial-intelligence/there-is-no-ai
- 30. https://www.newyorker.com/news/annals-of-climate-action/a-security-camera-for-the-planet
- 31. https://www.newyorker.com/news/our-columnists/whats-the-point-of-reading-writing-by-humans
- 32. https://www.newyorker.com/news/the-control-of-nature/a-heat-shield-for-the-most-important-ice-on-earth
- 33. https://www.newyorker.com/news/annals-of-a-warming-planet/the-climate-solutions-we-cant-live-without
- 34. https://www.newyorker.com/newsletter/daily?sourceCode=BottomStories
- 35. https://www.newyorker.com/contributors/james-somers
- 36. https://www.condenast.com/user-agreement
- 37. https://www.condenast.com/privacy-policy
- 38. https://policies.google.com/privacy
- 39. https://policies.google.com/terms
- 40. https://www.newyorker.com/magazine/2024/01/15/the-beach-house-fiction-joy-williams#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1
- 41. https://www.newyorker.com/magazine/2024/01/15/the-beach-house-fiction-joy-williams#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1
- 42. https://www.newyorker.com/magazine/2024/01/01/crown-heights-north-fiction-rivka-galchen#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 43. https://www.newyorker.com/magazine/2024/01/01/crown-heights-north-fiction-rivka-galchen#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 44. https://www.newyorker.com/magazine/2023/12/25/can-crosswords-be-more-inclusive#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 45. https://www.newyorker.com/magazine/2023/12/25/can-crosswords-be-more-inclusive#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 46. https://www.newyorker.com/culture/the-weekend-essay/coming-of-age-at-the-dawn-of-the-social-internet#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 47. https://www.newyorker.com/culture/the-weekend-essay/coming-of-age-at-the-dawn-of-the-social-internet#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 48. https://www.newyorker.com/
- 49. https://www.newyorker.com/news
- 50. https://www.newyorker.com/culture
- 51. https://www.newyorker.com/fiction-and-poetry
- 52. https://www.newyorker.com/humor
- 53. https://www.newyorker.com/magazine
- 54. https://www.newyorker.com/crossword-puzzles-and-games
- 55. https://video.newyorker.com/
- 56. https://www.newyorker.com/podcast
- 57. https://www.newyorker.com/archive
- 58. https://www.newyorker.com/goings-on-about-town
- 59. http://w1.buysub.com/servlet/CSGateway?cds_mag_code=NYR
- 60. https://store.newyorker.com/
- 61. https://condenaststore.com/art/new+yorker+covers
- 62. https://condenaststore.com/conde-nast-brand/thenewyorker
- 63. https://www.newyorker.com/digital-editions
- 64. https://www.newyorker.com/newsletter
- 65. https://www.newyorker.com/jigsaw
- 66. https://www.newyorker.com/about/feeds
- 67. https://www.newyorker.com/about/us
- 68. https://www.newyorker.com/about/careers
- 69. https://www.newyorker.com/about/contact
- 70. https://www.newyorker.com/about/faq
- 71. https://www.condenast.com/advertising
- 72. https://www.newyorker.com/about/press
- 73. https://www.newyorker.com/about/accessibility-help
- 74. https://www.condenast.com/user-agreement/
- 75. http://www.condenast.com/privacy-policy#privacypolicy
- 76. http://www.condenast.com/privacy-policy#privacypolicy-california
- 77. http://www.condenast.com/privacy-policy#privacypolicy-optout
+ • [78]Customer Care
+ • [79]Shop The New Yorker
+ • [80]Buy Covers and Cartoons
+ • [81]Condé Nast Store
+ • [82]Digital Access
+ • [83]Newsletters
+ • [84]Jigsaw Puzzle
+ • [85]RSS
- Hidden links:
- 79. https://www.newyorker.com/account/saved
- 80. https://www.facebook.com/dialog/feed?&display=popup&caption=A%20Coder%20Considers%20the%20Waning%20Days%20of%20the%20Craft&app_id=1147169538698836&link=https%3A%2F%2Fwww.newyorker.com%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft%3Futm_source%3Dfacebook%26utm_medium%3Dsocial%26utm_campaign%3Donsite-share%26utm_brand%3Dthe-new-yorker%26utm_social-type%3Dearned
- 81. https://twitter.com/intent/tweet/?url=https%3A%2F%2Fwww.newyorker.com%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft%3Futm_source%3Dtwitter%26utm_medium%3Dsocial%26utm_campaign%3Donsite-share%26utm_brand%3Dthe-new-yorker%26utm_social-type%3Dearned&text=A%20Coder%20Considers%20the%20Waning%20Days%20of%20the%20Craft&via=NewYorker
- 82. mailto:?subject=A%20Coder%20Considers%20the%20Waning%20Days%20of%20the%20Craft&body=https%3A%2F%2Fwww.newyorker.com%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft%3Futm_source%3Donsite-share%26utm_medium%3Demail%26utm_campaign%3Donsite-share%26utm_brand%3Dthe-new-yorker
- 83. https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?currentPage=all
- 84. https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?currentPage=all
- 85. https://www.newyorker.com/magazine/2024/01/15/the-beach-house-fiction-joy-williams#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1
- 86. https://www.newyorker.com/magazine/2024/01/01/crown-heights-north-fiction-rivka-galchen#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 87. https://www.newyorker.com/magazine/2023/12/25/can-crosswords-be-more-inclusive#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 88. https://www.newyorker.com/culture/the-weekend-essay/coming-of-age-at-the-dawn-of-the-social-internet#intcid=_the-new-yorker-bottom-recirc-v2_79ab568c-4ce6-4a2a-b03a-653b1f80b65b_roberta-similarity1_fallback_text2vec1
- 89. https://www.facebook.com/newyorker/
- 90. https://twitter.com/NewYorker/
- 91. https://www.snapchat.com/add/newyorkermag
- 92. https://www.youtube.com/user/NewYorkerDotCom/
- 93. https://instagram.com/newyorkermag/
+ • [86]About
+ • [87]Careers
+ • [88]Contact
+ • [89]F.A.Q.
+ • [90]Media Kit
+ • [91]Press
+ • [92]Accessibility Help
+
+© 2024 Condé Nast. All rights reserved. Use of this site constitutes acceptance
+of our [93]User Agreement and [94]Privacy Policy and Cookie Statement and [95]
+Your California Privacy Rights. The New Yorker may earn a portion of sales from
+products that are purchased through our site as part of our Affiliate
+Partnerships with retailers. The material on this site may not be reproduced,
+distributed, transmitted, cached or otherwise used, except with the prior
+written permission of Condé Nast. [96]Ad Choices
+
+ • [97]
+ • [98]
+ • [99]
+ • [100]
+ • [101]
+
+Do Not Sell My Personal Info
+
+References:
+
+[1] https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?currentPage=all#main-content
+[2] https://www.newyorker.com/
+[3] https://www.newyorker.com/newsletters
+[4] https://www.newyorker.com/account/saved
+[6] https://www.newyorker.com/auth/initiate?redirectURL=%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft&source=VERSO_NAVIGATION
+[7] https://www.newyorker.com/search
+[8] https://www.newyorker.com/latest
+[9] https://www.newyorker.com/news
+[10] https://www.newyorker.com/culture
+[11] https://www.newyorker.com/fiction-and-poetry
+[12] https://www.newyorker.com/humor
+[13] https://www.newyorker.com/magazine
+[14] https://www.newyorker.com/crossword-puzzles-and-games
+[15] https://www.newyorker.com/video
+[16] https://www.newyorker.com/podcasts
+[17] https://www.newyorker.com/goings-on
+[18] https://store.newyorker.com/
+[20] https://www.newyorker.com/account/saved
+[22] https://www.newyorker.com/
+[23] https://www.newyorker.com/magazine/personal-history
+[24] https://www.newyorker.com/contributors/james-somers
+[25] https://www.facebook.com/dialog/feed?&display=popup&caption=A%20Coder%20Considers%20the%20Waning%20Days%20of%20the%20Craft&app_id=1147169538698836&link=https%3A%2F%2Fwww.newyorker.com%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft%3Futm_source%3Dfacebook%26utm_medium%3Dsocial%26utm_campaign%3Donsite-share%26utm_brand%3Dthe-new-yorker%26utm_social-type%3Dearned
+[26] https://twitter.com/intent/tweet/?url=https%3A%2F%2Fwww.newyorker.com%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft%3Futm_source%3Dtwitter%26utm_medium%3Dsocial%26utm_campaign%3Donsite-share%26utm_brand%3Dthe-new-yorker%26utm_social-type%3Dearned&text=A%20Coder%20Considers%20the%20Waning%20Days%20of%20the%20Craft&via=NewYorker
+[27] mailto:?subject=A%20Coder%20Considers%20the%20Waning%20Days%20of%20the%20Craft&body=https%3A%2F%2Fwww.newyorker.com%2Fmagazine%2F2023%2F11%2F20%2Fa-coder-considers-the-waning-days-of-the-craft%3Futm_source%3Donsite-share%26utm_medium%3Demail%26utm_campaign%3Donsite-share%26utm_brand%3Dthe-new-yorker
+[28] https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?currentPage=all#
+[29] https://www.newyorker.com/magazine/2023/11/20/a-coder-considers-the-waning-days-of-the-craft?currentPage=all#
+[33] https://www.newyorker.com/newsletter/science-technology
+[34] https://www.newyorker.com/newsletter/science-technology
+[35] https://www.newyorker.com/cartoon/a27287
+[38] https://www.newyorker.com/magazine/2023/11/20
+[39] https://www.newyorker.com/science/annals-of-artificial-intelligence/can-we-stop-the-singularity
+[40] https://www.newyorker.com/news/dept-of-energy/the-great-electrician-shortage
+[41] https://www.newyorker.com/science/annals-of-artificial-intelligence/there-is-no-ai
+[42] https://www.newyorker.com/news/annals-of-climate-action/a-security-camera-for-the-planet
+[43] https://www.newyorker.com/news/our-columnists/whats-the-point-of-reading-writing-by-humans
+[44] https://www.newyorker.com/news/the-control-of-nature/a-heat-shield-for-the-most-important-ice-on-earth
+[45] https://www.newyorker.com/news/annals-of-a-warming-planet/the-climate-solutions-we-cant-live-without
+[46] https://www.newyorker.com/newsletter/daily?sourceCode=BottomStories
+[47] https://www.newyorker.com/contributors/james-somers
+[50] https://www.condenast.com/user-agreement
+[51] https://www.condenast.com/privacy-policy
+[52] https://policies.google.com/privacy
+[53] https://policies.google.com/terms
+[54] https://www.newyorker.com/magazine/2018/08/06/how-a-notorious-gangster-was-exposed-by-his-own-sister#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[55] https://www.newyorker.com/magazine/2018/08/06/how-a-notorious-gangster-was-exposed-by-his-own-sister#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[56] https://www.newyorker.com/magazine/2018/08/06/how-a-notorious-gangster-was-exposed-by-his-own-sister#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[57] https://www.newyorker.com/magazine/2023/10/23/foster-family-biological-parents-adoption-intervenors#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[58] https://www.newyorker.com/magazine/2023/10/23/foster-family-biological-parents-adoption-intervenors#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[59] https://www.newyorker.com/magazine/2023/10/23/foster-family-biological-parents-adoption-intervenors#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[60] https://www.newyorker.com/magazine/2013/08/05/trial-by-twitter#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[61] https://www.newyorker.com/magazine/2013/08/05/trial-by-twitter#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[62] https://www.newyorker.com/news/american-chronicles/britney-spears-conservatorship-nightmare#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[63] https://www.newyorker.com/news/american-chronicles/britney-spears-conservatorship-nightmare#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[64] https://www.newyorker.com/news/american-chronicles/britney-spears-conservatorship-nightmare#intcid=_the-new-yorker-bottom-recirc-version3_cbaf7871-3046-4dc4-b609-4b3c76e51880_user-activetime-evergreen
+[65] https://www.newyorker.com/
+[67] https://www.newyorker.com/news
+[68] https://www.newyorker.com/culture
+[69] https://www.newyorker.com/fiction-and-poetry
+[70] https://www.newyorker.com/humor
+[71] https://www.newyorker.com/magazine
+[72] https://www.newyorker.com/crossword-puzzles-and-games
+[73] https://video.newyorker.com/
+[74] https://www.newyorker.com/podcast
+[75] https://www.newyorker.com/archive
+[76] https://www.newyorker.com/goings-on-about-town
+[78] http://w1.buysub.com/servlet/CSGateway?cds_mag_code=NYR
+[79] https://store.newyorker.com/
+[80] https://condenaststore.com/art/new+yorker+covers
+[81] https://condenaststore.com/conde-nast-brand/thenewyorker
+[82] https://www.newyorker.com/digital-editions
+[83] https://www.newyorker.com/newsletter
+[84] https://www.newyorker.com/jigsaw
+[85] https://www.newyorker.com/about/feeds
+[86] https://www.newyorker.com/about/us
+[87] https://www.newyorker.com/about/careers
+[88] https://www.newyorker.com/about/contact
+[89] https://www.newyorker.com/about/faq
+[90] https://www.condenast.com/advertising
+[91] https://www.newyorker.com/about/press
+[92] https://www.newyorker.com/about/accessibility-help
+[93] https://www.condenast.com/user-agreement/
+[94] http://www.condenast.com/privacy-policy#privacypolicy
+[95] http://www.condenast.com/privacy-policy#privacypolicy-california
+[96] http://www.condenast.com/privacy-policy#privacypolicy-optout
+[97] https://www.facebook.com/newyorker/
+[98] https://twitter.com/NewYorker/
+[99] https://www.snapchat.com/add/newyorkermag
+[100] https://www.youtube.com/user/NewYorkerDotCom/
+[101] https://instagram.com/newyorkermag/
diff --git a/static/archive/www-nytimes-com-gvijqf.txt b/static/archive/www-nytimes-com-gvijqf.txt
index 14f7a7b..38a1dc5 100644
--- a/static/archive/www-nytimes-com-gvijqf.txt
+++ b/static/archive/www-nytimes-com-gvijqf.txt
@@ -1,307 +1,296 @@
- #[1]alternate [2]Julia Cameron Wants You to Do Your Morning Pages
+[1]Skip to content[2]Skip to site index
+[3]
+[4]Style|Julia Cameron Wants You to Do Your Morning Pages
+[5][6]
+https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html
- (BUTTON)
- (BUTTON) Sections
- (BUTTON) SEARCH
- [3]Skip to content
+ • Share full article
+ •
+ •
- [4]Style|Julia Cameron Wants You to Do Your Morning Pages
- https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.
- html
- * (BUTTON) Give this article
- * (BUTTON)
- * (BUTTON)
-
- Julia Cameron, making change at 70.
- Julia Cameron, making change at 70.Credit...Ramsay de Give for The New
- York Times
+[merlin_149295975_44170fa1-6d57-454f-a8b4-112222add07b-articleLarge]
+Julia Cameron, making change at 70.Credit...Ramsay de Give for The New York
+Times
Julia Cameron Wants You to Do Your Morning Pages
- With “The Artist’s Way,” Julia Cameron invented the way people renovate
- the creative soul.
+With “The Artist’s Way,” Julia Cameron invented the way people renovate the
+creative soul.
- Julia Cameron, making change at 70.Credit...Ramsay de Give for The New
- York Times
+Julia Cameron, making change at 70.Credit...Ramsay de Give for The New York
+Times
- Supported by
- [5]Continue reading the main story
- * Send any friend a story
- As a subscriber, you have 10 gift articles to give each month.
- Anyone can read what you share.
- (BUTTON)
- (BUTTON) Give this article
- * (BUTTON)
- * (BUTTON)
+Supported by
- [6]Penelope Green
+[10]SKIP ADVERTISEMENT
- By [7]Penelope Green
- * Feb. 2, 2019
+ • Share full article
+ •
+ •
- SANTA FE, N.M. — On any given day, someone somewhere is likely leading
- an Artist’s Way group, gamely knocking back the exercises of “The
- Artist’s Way” book, the quasi-spiritual manual for “creative recovery,”
- as its author Julia Cameron puts it, that has been a lodestar to
- blocked writers and other artistic hopefuls for more than a quarter of
- a century. There have been Artist’s Way clusters in the Australian
- outback and the Panamanian jungle; in Brazil, Russia, the United
- Kingdom and Japan; and also, as a cursory scan of Artist’s Way Meetups
- reveals, in Des Moines and Toronto. It has been taught in prisons and
- sober communities, at spiritual retreats and New Age centers, from
- Esalen to Sedona, from the Omega Institute to the [8]Open Center, where
- Ms. Cameron will appear in late March, as she does most years.
- Adherents of “The Artist’s Way” include the authors Patricia Cornwell
- and Sarah Ban Breathnach. Pete Townshend, Alicia Keys and Helmut Newton
- have all noted its influence on their work.
+[14]Penelope Green
- So has Tim Ferriss, the hyperactive productivity guru behind “The Four
- Hour Workweek,” though to save time he didn’t actually read the book,
- “which was recommended to me by many megaselling authors,” [9]he
- writes. He just did the “Morning Pages,” one of the book’s central
- exercises. It requires you write three pages, by hand, first thing in
- the morning, about whatever comes to mind. (Fortunes would seem to have
- been made on the journals printed to support this effort.) The book’s
- other main dictum is the “Artist’s Date” — two hours of alone time each
- week to be spent at a gallery, say, or any place where a new experience
- might be possible.
+By [15]Penelope Green
- Elizabeth Gilbert, who has “done” the book three times, said there
- would be no “Eat, Pray, Love,” without “The Artist’s Way.” Without it,
- there might be no [10]adult coloring books, no [11]journaling fever.
- “Creativity” would not have its own publishing niche or have become a
- ubiquitous buzzword — the “fat-free” of the self-help world — and
- business pundits would not deploy it as a specious organizing
- principle.
- Image
+ • Feb. 2, 2019
- The book’s enduring success — over 4 million copies have been sold
- since its publication in 1992 — have made its author, a shy
- Midwesterner who had a bit of early fame in the 1970s for practicing
- lively New Journalism at the Washington Post and Rolling Stone, among
- other publications, and for being married, briefly, to Martin Scorsese,
- with whom she has a daughter, Domenica — an unlikely celebrity. With
- its gentle affirmations, inspirational quotes, fill-in-the-blank lists
- and tasks — write yourself a thank-you letter, describe yourself at 80,
- for example — “The Artist’s Way” proposes an egalitarian view of
- creativity: Everyone’s got it.
+SANTA FE, N.M. — On any given day, someone somewhere is likely leading an
+Artist’s Way group, gamely knocking back the exercises of “The Artist’s Way”
+book, the quasi-spiritual manual for “creative recovery,” as its author Julia
+Cameron puts it, that has been a lodestar to blocked writers and other artistic
+hopefuls for more than a quarter of a century. There have been Artist’s Way
+clusters in the Australian outback and the Panamanian jungle; in Brazil,
+Russia, the United Kingdom and Japan; and also, as a cursory scan of Artist’s
+Way Meetups reveals, in Des Moines and Toronto. It has been taught in prisons
+and sober communities, at spiritual retreats and New Age centers, from Esalen
+to Sedona, from the Omega Institute to the [16]Open Center, where Ms. Cameron
+will appear in late March, as she does most years. Adherents of “The Artist’s
+Way” include the authors Patricia Cornwell and Sarah Ban Breathnach. Pete
+Townshend, Alicia Keys and Helmut Newton have all noted its influence on their
+work.
- The book promises to free up that inner artist in 12 weeks. It’s a
- template that would seem to reflect the practices of 12-step programs,
- particularly its invocations to a higher power. But according to Ms.
- Cameron, who has been sober since she was 29, “12 weeks is how long it
- takes for people to cook.”
+So has Tim Ferriss, the hyperactive productivity guru behind “The Four Hour
+Workweek,” though to save time he didn’t actually read the book, “which was
+recommended to me by many megaselling authors,” [17]he writes. He just did the
+“Morning Pages,” one of the book’s central exercises. It requires you write
+three pages, by hand, first thing in the morning, about whatever comes to mind.
+(Fortunes would seem to have been made on the journals printed to support this
+effort.) The book’s other main dictum is the “Artist’s Date” — two hours of
+alone time each week to be spent at a gallery, say, or any place where a new
+experience might be possible.
- Now 70, she lives in a spare adobe house in Santa Fe, overlooking an
- acre of scrub and the Sangre de Cristo mountain range. She moved a few
- years ago from Manhattan, following an exercise from her book to list
- 25 things you love. As she recalled, “I wrote juniper, sage brush,
- chili, mountains and sky and I said, ‘This is not the Chrysler
- Building.’” On a recent snowy afternoon, Ms. Cameron, who has enormous
- blue eyes and a nimbus of blonde hair, admitted to the jitters before
- this interview. “I asked three friends to pray for me,” she said. “I
- also wrote a note to myself to be funny.”
+Elizabeth Gilbert, who has “done” the book three times, said there would be no
+“Eat, Pray, Love,” without “The Artist’s Way.” Without it, there might be no
+[18]adult coloring books, no [19]journaling fever. “Creativity” would not have
+its own publishing niche or have become a ubiquitous buzzword — the “fat-free”
+of the self-help world — and business pundits would not deploy it as a specious
+organizing principle.
- In the early 1970s, Ms. Cameron, who is the second oldest of seven
- children and grew up just north of Chicago, was making $67 a week
- working in the mail room of the Washington Post. At the same time, she
- was writing deft lifestyle pieces for the paper — like an East Coast
- Eve Babitz. “With a byline, no one knows you’re just a gofer,” she
- said.
+Image
- In her reporting, Ms. Cameron observed an epidemic of green nail polish
- and other “Cabaret”-inspired behaviors in Beltway bars, and slyly
- reviewed a new party drug, methaqualone. She was also, by her own
- admission, a blackout drunk. “I thought drinking was something you did
- and your friends told you about it later,” she said. “In retrospect, in
- cozy retrospect, I was in trouble from my first drink.”
+The book’s enduring success — over 4 million copies have been sold since its
+publication in 1992 — have made its author, a shy Midwesterner who had a bit of
+early fame in the 1970s for practicing lively New Journalism at the Washington
+Post and Rolling Stone, among other publications, and for being married,
+briefly, to Martin Scorsese, with whom she has a daughter, Domenica — an
+unlikely celebrity. With its gentle affirmations, inspirational quotes,
+fill-in-the-blank lists and tasks — write yourself a thank-you letter, describe
+yourself at 80, for example — “The Artist’s Way” proposes an egalitarian view
+of creativity: Everyone’s got it.
- She met Mr. Scorsese on assignment for Oui magazine and fell hard for
- him. She did a bit of script-doctoring on “Taxi Driver,” and followed
- the director to Los Angeles. “I got pregnant on our wedding night,” she
- said. “Like a good Catholic girl.” When Mr. Scorsese took up with Liza
- Minnelli while all three were working on “New York, New York,” the
- marriage was done. (She recently made a painting depicting herself as a
- white horse and Mr. Scorsese as a lily. “I wanted to make a picture
- about me and Marty,” she said. “He was magical-seeming to me and when I
- look at it I think, ‘Oh, she’s fascinated, but she doesn’t
- understand.’”)
+The book promises to free up that inner artist in 12 weeks. It’s a template
+that would seem to reflect the practices of 12-step programs, particularly its
+invocations to a higher power. But according to Ms. Cameron, who has been sober
+since she was 29, “12 weeks is how long it takes for people to cook.”
- Image Under the pines.
- Under the pines.Credit...Ramsay de Give for The New York Times
+Now 70, she lives in a spare adobe house in Santa Fe, overlooking an acre of
+scrub and the Sangre de Cristo mountain range. She moved a few years ago from
+Manhattan, following an exercise from her book to list 25 things you love. As
+she recalled, “I wrote juniper, sage brush, chili, mountains and sky and I
+said, ‘This is not the Chrysler Building.’” On a recent snowy afternoon, Ms.
+Cameron, who has enormous blue eyes and a nimbus of blonde hair, admitted to
+the jitters before this interview. “I asked three friends to pray for me,” she
+said. “I also wrote a note to myself to be funny.”
- In her memoir, “Floor Sample,” published in 2006, Ms. Cameron recounts
- the brutality of Hollywood, of her life there as a screenwriter and a
- drunk. Pauline Kael, she writes, described her as a “pornographic
- Victorian valentine, like a young Angela Lansbury.” Don’t marry her for
- tax reasons, Ms. Kael warns Mr. Scorsese. Andy Warhol, who escorts her
- to the premiere of “New York, New York,” inscribes her into his diary
- as a “lush.” A cocaine dealer soothes her — “You have a tiny little
- wife’s habit” — and a doctor shoos her away from his hospital when she
- asks for help, telling her she’s no alcoholic, just a “sensitive young
- woman.” She goes into labor in full makeup and a Chinese dressing gown,
- vowing to be “no trouble.”
+In the early 1970s, Ms. Cameron, who is the second oldest of seven children and
+grew up just north of Chicago, was making $67 a week working in the mail room
+of the Washington Post. At the same time, she was writing deft lifestyle pieces
+for the paper — like an East Coast Eve Babitz. “With a byline, no one knows
+you’re just a gofer,” she said.
- “I think it’s fair to say that drinking and drugs stopped looking like
- a path to success,” she said. “So I luckily stopped. I had a couple of
- sober friends and they said, ‘Try and let the higher power write
- through you.’ And I said, What if he doesn’t want to?’ They said, ‘Just
- try it.’”
+In her reporting, Ms. Cameron observed an epidemic of green nail polish and
+other “Cabaret”-inspired behaviors in Beltway bars, and slyly reviewed a new
+party drug, methaqualone. She was also, by her own admission, a blackout drunk.
+“I thought drinking was something you did and your friends told you about it
+later,” she said. “In retrospect, in cozy retrospect, I was in trouble from my
+first drink.”
- So she did. She wrote novels and screenplays. She wrote poems and
- musicals. She wasn’t always well-reviewed, but she took the knocks with
- typical grit, and she schooled others to do so as well. “I have
- unblocked poets, lawyers and painters,” she said. She taught her tools
- in living rooms and classrooms — “if someone was dumb enough to lend us
- one,” she said — and back in New York, at the Feminist Art Institute.
- Over the years, she refined her tools, typed them up, and sold Xeroxed
- copies in local bookstores for $20. It was her second husband, Mark
- Bryan, a writer, who needled her into making the pages into a proper
- book.
+She met Mr. Scorsese on assignment for Oui magazine and fell hard for him. She
+did a bit of script-doctoring on “Taxi Driver,” and followed the director to
+Los Angeles. “I got pregnant on our wedding night,” she said. “Like a good
+Catholic girl.” When Mr. Scorsese took up with Liza Minnelli while all three
+were working on “New York, New York,” the marriage was done. (She recently made
+a painting depicting herself as a white horse and Mr. Scorsese as a lily. “I
+wanted to make a picture about me and Marty,” she said. “He was magical-seeming
+to me and when I look at it I think, ‘Oh, she’s fascinated, but she doesn’t
+understand.’”)
- The first printing was about 9,000 copies, said Joel Fotinos, formerly
- the publisher at Tarcher/Penguin, which published the book in 1992.
- There was concern that it wouldn’t sell. “Part of the reason,” Mr.
- Fotinos said, “was that this was a book that wasn’t like anything else.
- We didn’t know where to put it on the shelves — did it go in religion
- or self-help? Eventually there was a category called ‘creativity,’ and
- ‘The Artist’s Way’ launched it.” Now an editorial director at St.
- Martin’s Press, Mr. Fotinos said he is deluged with pitches from
- authors claiming they’ve written “the new Artist’s Way.”
+Image[merlin_149296134_e17f3630-d6d2-4d46-961e-bddec24c3feb-articleLarge]
+Under the pines.Credit...Ramsay de Give for The New York Times
- “But for Julia, creativity was a tool for survival,” he said. “It was
- literally her medicine and that’s why the book is so authentic, and
- resonates with so many people.”
+In her memoir, “Floor Sample,” published in 2006, Ms. Cameron recounts the
+brutality of Hollywood, of her life there as a screenwriter and a drunk.
+Pauline Kael, she writes, described her as a “pornographic Victorian valentine,
+like a young Angela Lansbury.” Don’t marry her for tax reasons, Ms. Kael warns
+Mr. Scorsese. Andy Warhol, who escorts her to the premiere of “New York, New
+York,” inscribes her into his diary as a “lush.” A cocaine dealer soothes her —
+“You have a tiny little wife’s habit” — and a doctor shoos her away from his
+hospital when she asks for help, telling her she’s no alcoholic, just a
+“sensitive young woman.” She goes into labor in full makeup and a Chinese
+dressing gown, vowing to be “no trouble.”
- “I am my tool kits,” Ms. Cameron said.
+“I think it’s fair to say that drinking and drugs stopped looking like a path
+to success,” she said. “So I luckily stopped. I had a couple of sober friends
+and they said, ‘Try and let the higher power write through you.’ And I said,
+What if he doesn’t want to?’ They said, ‘Just try it.’”
- And, indeed, “The Artist’s Way” is stuffed with tools: worksheets to be
- filled with thoughts about money, childhood games, old hurts; wish
- lists and exercises, many of which seem exhaustive and exhausting —
- “Write down any resistance, angers and fears,” e.g. — and others that
- are more practical: “Take a 20 minutes walk,” “Mend any mending” and
- “repot any pinched and languishing plants.” It anticipates the work of
- the indefatigable [12]Gretchen Rubin, the happiness maven, if Ms. Rubin
- were a bit kinder but less Type-A.
+So she did. She wrote novels and screenplays. She wrote poems and musicals. She
+wasn’t always well-reviewed, but she took the knocks with typical grit, and she
+schooled others to do so as well. “I have unblocked poets, lawyers and
+painters,” she said. She taught her tools in living rooms and classrooms — “if
+someone was dumb enough to lend us one,” she said — and back in New York, at
+the Feminist Art Institute. Over the years, she refined her tools, typed them
+up, and sold Xeroxed copies in local bookstores for $20. It was her second
+husband, Mark Bryan, a writer, who needled her into making the pages into a
+proper book.
- “When I teach, it’s like watching the lights come on,” said Ms.
- Cameron. “My students don’t get lectured to. I think they feel safe.
- Rather than try and fix themselves, they learn to accept themselves. I
- think my work makes people autonomous. I feel like people fall in love
- with themselves.”
+The first printing was about 9,000 copies, said Joel Fotinos, formerly the
+publisher at Tarcher/Penguin, which published the book in 1992. There was
+concern that it wouldn’t sell. “Part of the reason,” Mr. Fotinos said, “was
+that this was a book that wasn’t like anything else. We didn’t know where to
+put it on the shelves — did it go in religion or self-help? Eventually there
+was a category called ‘creativity,’ and ‘The Artist’s Way’ launched it.” Now an
+editorial director at St. Martin’s Press, Mr. Fotinos said he is deluged with
+pitches from authors claiming they’ve written “the new Artist’s Way.”
- Anne Lamott, the inspirational writer and novelist, said that when she
- was teaching writing full-time, her own students swore by “The Artist’s
- Way.” “That exercise — three pages of automatic writing — was a
- sacrament for people,” Ms. Lamott wrote in a recent email. “They could
- plug into something bigger than the rat exercise wheel of self-loathing
- and grandiosity that every writer experiences: ‘This could very easily
- end up being an Oprah Book,’ or ‘Who do I think I’m fooling? I’m a
- subhuman blowhard.’”
+“But for Julia, creativity was a tool for survival,” he said. “It was literally
+her medicine and that’s why the book is so authentic, and resonates with so
+many people.”
- “She’s given you an assignment that is doable, and I think it’s kind of
- a cognitive centering device. Like scribbly meditation,” Ms. Lamott
- wrote. “It’s sort of like how manicurists put smooth pebbles in the
- warm soaking water, so your fingers have something to do, and you don’t
- climb the walls.”
+“I am my tool kits,” Ms. Cameron said.
- Image
- In the wild.Credit...Ramsay de Give for The New York Times
+And, indeed, “The Artist’s Way” is stuffed with tools: worksheets to be filled
+with thoughts about money, childhood games, old hurts; wish lists and
+exercises, many of which seem exhaustive and exhausting — “Write down any
+resistance, angers and fears,” e.g. — and others that are more practical: “Take
+a 20 minutes walk,” “Mend any mending” and “repot any pinched and languishing
+plants.” It anticipates the work of the indefatigable [20]Gretchen Rubin, the
+happiness maven, if Ms. Rubin were a bit kinder but less Type-A.
- Ms. Cameron continues to write her Morning Pages every day, even though
- she continues, as she said, to be grouchy upon awakening. She eats
- oatmeal at a local cafe and walks Lily, an eager white Westie. She
- reads no newspapers, or social media (perhaps the most grueling tenet
- of “The Artist’s Way” is a week of “reading deprivation”), though an
- assistant runs a Twitter and Instagram account on her behalf. She
- writes for hours, mostly musicals, collaborating with her daughter, a
- film director, and others.
+“When I teach, it’s like watching the lights come on,” said Ms. Cameron. “My
+students don’t get lectured to. I think they feel safe. Rather than try and fix
+themselves, they learn to accept themselves. I think my work makes people
+autonomous. I feel like people fall in love with themselves.”
- Ms. Cameron may be a veteran of the modern self-care movement but her
- life has not been all moonbeams and rainbows, and it shows. She was
- candid in conversation, if not quite at ease. “So I haven’t proven
- myself to be hilarious,” she said with a flash of dry humor, adding
- that even after so many years, she still gets stage-fright before
- beginning a workshop.
+Anne Lamott, the inspirational writer and novelist, said that when she was
+teaching writing full-time, her own students swore by “The Artist’s Way.” “That
+exercise — three pages of automatic writing — was a sacrament for people,” Ms.
+Lamott wrote in a recent email. “They could plug into something bigger than the
+rat exercise wheel of self-loathing and grandiosity that every writer
+experiences: ‘This could very easily end up being an Oprah Book,’ or ‘Who do I
+think I’m fooling? I’m a subhuman blowhard.’”
- She has written about her own internal critic, imagining a gay British
- interior designer she calls Nigel. “And nothing is ever good enough for
- Nigel,” she said. But she soldiers on.
+“She’s given you an assignment that is doable, and I think it’s kind of a
+cognitive centering device. Like scribbly meditation,” Ms. Lamott wrote. “It’s
+sort of like how manicurists put smooth pebbles in the warm soaking water, so
+your fingers have something to do, and you don’t climb the walls.”
- She will tell you that she has good boundaries. But like many
- successful women, she brushes off her achievements, attributing her
- unlooked-for wins to luck.
+Image
+In the wild.Credit...Ramsay de Give for The New York Times
- “If you have to learn how to do a movie, you might learn from Martin
- Scorsese. If you have to learn about entrepreneurship, you might learn
- from Mark” — her second husband. “So I’m very lucky,” she said. “If I
- have a hard time blowing my own horn, I’ve been attracted to people who
- blew it for me.”
+Ms. Cameron continues to write her Morning Pages every day, even though she
+continues, as she said, to be grouchy upon awakening. She eats oatmeal at a
+local cafe and walks Lily, an eager white Westie. She reads no newspapers, or
+social media (perhaps the most grueling tenet of “The Artist’s Way” is a week
+of “reading deprivation”), though an assistant runs a Twitter and Instagram
+account on her behalf. She writes for hours, mostly musicals, collaborating
+with her daughter, a film director, and others.
- Advertisement
- [13]Continue reading the main story
+Ms. Cameron may be a veteran of the modern self-care movement but her life has
+not been all moonbeams and rainbows, and it shows. She was candid in
+conversation, if not quite at ease. “So I haven’t proven myself to be
+hilarious,” she said with a flash of dry humor, adding that even after so many
+years, she still gets stage-fright before beginning a workshop.
+
+She has written about her own internal critic, imagining a gay British interior
+designer she calls Nigel. “And nothing is ever good enough for Nigel,” she
+said. But she soldiers on.
+
+She will tell you that she has good boundaries. But like many successful women,
+she brushes off her achievements, attributing her unlooked-for wins to luck.
+
+“If you have to learn how to do a movie, you might learn from Martin Scorsese.
+If you have to learn about entrepreneurship, you might learn from Mark” — her
+second husband. “So I’m very lucky,” she said. “If I have a hard time blowing
+my own horn, I’ve been attracted to people who blew it for me.”
+
+[21]Penelope Green is a reporter for Styles. She has been a reporter for the
+Home section, editor of Styles of The Times — an early iteration of Styles —
+and a story editor at the Times magazine. [22]More about Penelope Green
+
+A version of this article appears in print on , Section ST, Page 1 of the New
+York edition with the headline: She Guides Your Process. [23]Order Reprints |
+[24]Today’s Paper | [25]Subscribe
+
+ • Share full article
+ •
+ •
+
+Advertisement
+
+[29]SKIP ADVERTISEMENT
Site Index
Site Information Navigation
- * [14]© 2023 The New York Times Company
+ • [30]© 2024 The New York Times Company
- * [15]NYTCo
- * [16]Contact Us
- * [17]Accessibility
- * [18]Work with us
- * [19]Advertise
- * [20]T Brand Studio
- * [21]Your Ad Choices
- * [22]Privacy Policy
- * [23]Terms of Service
- * [24]Terms of Sale
- * [25]Site Map
- * [26]Canada
- * [27]International
- * [28]Help
- * [29]Subscriptions
+ • [31]NYTCo
+ • [32]Contact Us
+ • [33]Accessibility
+ • [34]Work with us
+ • [35]Advertise
+ • [36]T Brand Studio
+ • [37]Your Ad Choices
+ • [38]Privacy Policy
+ • [39]Terms of Service
+ • [40]Terms of Sale
+ • [41]Site Map
+ • [42]Canada
+ • [43]International
+ • [44]Help
+ • [45]Subscriptions
- IFRAME:
- [30]https://www.googletagmanager.com/ns.html?id=GTM-P528B3>m_auth=tfA
- zqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x
+ • [46]Manage Privacy Preferences
-References
- Visible links:
- 1. nyt://article/0b13a9e1-3729-51ef-aad3-030df3ab15bb
- 2. https://www.nytimes.com/svc/oembed/json/?url=https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html
- 3. https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#site-content
- 4. https://www.nytimes.com/section/style
- 5. https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#after-sponsor
- 6. https://www.nytimes.com/by/penelope-green
- 7. https://www.nytimes.com/by/penelope-green
- 8. https://www.opencenter.org/
- 9. https://tim.blog/tag/artists-way/
- 10. https://www.nytimes.com/2016/04/21/fashion/adult-coloring-books-relaxation.html
- 11. https://www.nytimes.com/2018/10/25/style/journaling-benefits.html
- 12. https://www.nytimes.com/2017/10/07/style/personality-type-the-four-tendencies-gretchen-rubin.html
- 13. https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#after-bottom
- 14. https://help.nytimes.com/hc/en-us/articles/115014792127-Copyright-notice
- 15. https://www.nytco.com/
- 16. https://help.nytimes.com/hc/en-us/articles/115015385887-Contact-Us
- 17. https://help.nytimes.com/hc/en-us/articles/115015727108-Accessibility
- 18. https://www.nytco.com/careers/
- 19. https://nytmediakit.com/
- 20. https://www.tbrandstudio.com/
- 21. https://www.nytimes.com/privacy/cookie-policy#how-do-i-manage-trackers
- 22. https://www.nytimes.com/privacy/privacy-policy
- 23. https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-service
- 24. https://help.nytimes.com/hc/en-us/articles/115014893968-Terms-of-sale
- 25. https://www.nytimes.com/sitemap/
- 26. https://www.nytimes.com/ca/?action=click®ion=Footer&pgtype=Homepage
- 27. https://www.nytimes.com/international/?action=click®ion=Footer&pgtype=Homepage
- 28. https://help.nytimes.com/hc/en-us
- 29. https://www.nytimes.com/subscription?campaignId=37WXW
- 30. https://www.googletagmanager.com/ns.html?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x
+References:
- Hidden links:
- 32. https://www.nytimes.com/
- 33. https://www.nytimes.com/
- 34. https://www.nytimes.com/
+[1] https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#site-content
+[2] https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#site-index
+[3] https://www.nytimes.com/
+[4] https://www.nytimes.com/section/style
+[5] https://www.nytimes.com/
+[6] https://www.nytimes.com/
+[10] https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#after-sponsor
+[14] https://www.nytimes.com/by/penelope-green
+[15] https://www.nytimes.com/by/penelope-green
+[16] https://www.opencenter.org/
+[17] https://tim.blog/tag/artists-way/
+[18] https://www.nytimes.com/2016/04/21/fashion/adult-coloring-books-relaxation.html
+[19] https://www.nytimes.com/2018/10/25/style/journaling-benefits.html
+[20] https://www.nytimes.com/2017/10/07/style/personality-type-the-four-tendencies-gretchen-rubin.html
+[21] https://www.nytimes.com/by/penelope-green
+[22] https://www.nytimes.com/by/penelope-green
+[23] https://www.parsintl.com/publication/the-new-york-times/
+[24] https://www.nytimes.com/section/todayspaper
+[25] https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY
+[29] https://www.nytimes.com/2019/02/02/style/julia-cameron-the-artists-way.html#after-bottom
+[30] https://help.nytimes.com/hc/en-us/articles/115014792127-Copyright-notice
+[31] https://www.nytco.com/
+[32] https://help.nytimes.com/hc/en-us/articles/115015385887-Contact-Us
+[33] https://help.nytimes.com/hc/en-us/articles/115015727108-Accessibility
+[34] https://www.nytco.com/careers/
+[35] https://nytmediakit.com/
+[36] https://www.tbrandstudio.com/
+[37] https://www.nytimes.com/privacy/cookie-policy#how-do-i-manage-trackers
+[38] https://www.nytimes.com/privacy/privacy-policy
+[39] https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-service
+[40] https://help.nytimes.com/hc/en-us/articles/115014893968-Terms-of-sale
+[41] https://www.nytimes.com/sitemap/
+[42] https://www.nytimes.com/ca/
+[43] https://www.nytimes.com/international/
+[44] https://help.nytimes.com/hc/en-us
+[45] https://www.nytimes.com/subscription?campaignId=37WXW
+[46] https://www.nytimes.com/privacy/manage-settings
diff --git a/static/archive/www-nytimes-com-s2rtib.txt b/static/archive/www-nytimes-com-s2rtib.txt
index 25c1b83..040883e 100644
--- a/static/archive/www-nytimes-com-s2rtib.txt
+++ b/static/archive/www-nytimes-com-s2rtib.txt
@@ -1,458 +1,437 @@
- [1]Skip to content[2]Skip to site index
- (BUTTON)
+[1]Skip to content[2]Skip to site index
+[3]
-[3]Comments
+[5]Comments
- [4]36 Hours in Durham, N.C.[5]Skip to Comments
- The comments section is closed. To submit a letter to the editor for
- publication, write to [6]letters@nytimes.com.
+[6]36 Hours in Durham, N.C.[7]Skip to Comments
+The comments section is closed. To submit a letter to the editor for
+publication, write to [8]letters@nytimes.com.
- 36 Hours
+36 Hours
36 Hours in Durham, N.C.
- By [7]Ingrid K. WilliamsUpdated Nov. 2, 2023
- * (BUTTON)
- * (BUTTON)
- * (BUTTON)
- 164
+By [9]Ingrid K. WilliamsUpdated Nov. 2, 2023
- A birds-eye view over a quiet city street during the daytime. The
- treetops vary from green to orange to red.
- [8]36 Hours
- Durham, N.C.
- Jump to:
- [9]Recommendations
- [10]Itinerary
- [11]Google Map
- By Ingrid K. Williams Photographs by Kate Medley for The New York Times
- Nov. 2, 2023
- Ingrid K. Williams is a regular contributor to the Travel section and a
- former Durham resident who has reported on North Carolina since 2010.
+ •
+ •
+ • 164
- The evolution of Durham from a faded tobacco town to a diverse cultural
- and culinary destination has been years in the making. But the ongoing
- development of this central North Carolina city seems to have reached a
- new stage. The resurgent downtown area — long a transitional
- neighborhood with pockets of progress — is now brimming with new
- restaurants, boutiques, bars and breweries. And while construction
- continues apace amid the historic [12]brick warehouses, [13]tobacco
- factories and [14]textile mills — for [15]good and [16]ill — visitors
- today have reason to venture farther afield, to emerging hotspots in
- East Durham and the Old Five Points neighborhood. This season, only the
- brilliant fall foliage can compete with all the terrific food, drink
- and local color there is to discover across Dur’m, as residents
- affectionately call the dynamic Bull City.
+A birds-eye view over a quiet city street during the daytime. The treetops vary
+from green to orange to red.
+[13]36 Hours
+Durham, N.C.
+Jump to:
+[14]Recommendations
+[15]Itinerary
+[16]Google Map
+By Ingrid K. Williams Photographs by Kate Medley for The New York Times
+Nov. 2, 2023
+Ingrid K. Williams is a regular contributor to the Travel section and a former
+Durham resident who has reported on North Carolina since 2010.
+
+The evolution of Durham from a faded tobacco town to a diverse cultural and
+culinary destination has been years in the making. But the ongoing development
+of this central North Carolina city seems to have reached a new stage. The
+resurgent downtown area — long a transitional neighborhood with pockets of
+progress — is now brimming with new restaurants, boutiques, bars and breweries.
+And while construction continues apace amid the historic [17]brick warehouses,
+[18]tobacco factories and [19]textile mills — for [20]good and [21]ill —
+visitors today have reason to venture farther afield, to emerging hotspots in
+East Durham and the Old Five Points neighborhood. This season, only the
+brilliant fall foliage can compete with all the terrific food, drink and local
+color there is to discover across Dur’m, as residents affectionately call the
+dynamic Bull City.
Recommendations
- Key stops
- * The [17]Nasher Museum of Art, on Duke University's Central Campus,
- presents rotating exhibitions, including a current exhibition
- curated by ChatGPT.
- * [18]Saltbox Seafood Joint serves fresh, seasonal seafood caught off
- the North Carolina coast, along with honey-drizzled hush puppies.
- * [19]Mystic Farm & Distillery is a 22-acre bourbon distillery that
- offers weekend tours and free tastings of the label’s full range of
- spirits.
- * [20]The Velvet Hippo is a lively new bar serving fruity slushies
- and creative cocktails on a rooftop downtown.
+Key stops
- Attractions and outdoor activities
- * At the [21]Sarah P. Duke Gardens, five miles of pathways wind past
- magnolias, blooming roses and a lake framed by vibrant foliage in
- the fall.
- * [22]Bennett Place is a Civil War site, with a small on-site museum,
- where Union and Confederate generals negotiated the war’s largest
- troop surrender in the home of a local family.
- * At [23]Eno River State Park and in [24]West Point on the Eno, a
- city park five miles north of downtown, there are dozens of trails
- to choose from.
+ • The [22]Nasher Museum of Art, on Duke University's Central Campus, presents
+ rotating exhibitions, including a current exhibition curated by ChatGPT.
+ • [23]Saltbox Seafood Joint serves fresh, seasonal seafood caught off the
+ North Carolina coast, along with honey-drizzled hush puppies.
+ • [24]Mystic Farm & Distillery is a 22-acre bourbon distillery that offers
+ weekend tours and free tastings of the label’s full range of spirits.
+ • [25]The Velvet Hippo is a lively new bar serving fruity slushies and
+ creative cocktails on a rooftop downtown.
- Restaurants and bars
- * [25]Ponysaurus Brewing Co. is a downtown craft brewery with
- crackling fire pits in a leafy garden strung with lights.
- * [26]Ideal’s is a sandwich shop in East Durham with lines out the
- door at lunchtime.
- * [27]Mike D’s BBQ, also in East Durham, is a new barbecue joint
- serving brisket and smoked beans.
- * [28]Little Bull is a new restaurant in the Old Five Points
- neighborhood that serves dumplings stuffed with goat birria in a
- bowl of rich consomé.
- * [29]Motorco Music Hall is a concert venue that also hosts dance
- parties.
- * [30]Corpse Reviver is a cocktail bar in a former coffin shop.
- * [31]Monuts is a bustling Ninth Street bakery and cafe that began as
- a tricycle vendor peddling doughnuts at the Durham Farmers’ Market.
- * [32]Rose’s Noodles, Dumplings and Sweets is a former meat market
- and sweets shop that evolved into a casual East Asian-inspired
- eatery.
+Attractions and outdoor activities
- Shopping
- * [33]Durham Vintage Collective is a new and inviting second-hand
- shop downtown.
- * [34]Chet Miller is a well-stocked gift shop with Durham-themed
- throw pillows, small-press travel guides, cookbooks from local
- chefs and jigsaw puzzles.
- * [35]EUtopia Design opened downtown last year and sells Polish
- glassware and handcrafted ceramics.
- * [36]Ella West Gallery is a sunny space that opened in August
- showcasing contemporary art.
- * [37]Carolina Soul Records and [38]Bull City Records are two spots
- to browse vinyl on Main Street.
+ • At the [26]Sarah P. Duke Gardens, five miles of pathways wind past
+ magnolias, blooming roses and a lake framed by vibrant foliage in the fall.
+ • [27]Bennett Place is a Civil War site, with a small on-site museum, where
+ Union and Confederate generals negotiated the war’s largest troop surrender
+ in the home of a local family.
+ • At [28]Eno River State Park and in [29]West Point on the Eno, a city park
+ five miles north of downtown, there are dozens of trails to choose from.
- Where to stay
- * For a small city, Durham has an impressive selection of cool
- hotels. Most notable is [39]the Durham, a 53-room boutique property
- in a landmark building with midcentury modern architecture, mod
- décor and a scenic rooftop bar. Double rooms from around $240.
- * [40]Unscripted Durham opened in the former Jack Tar Motel, another
- 1960s property that is now home to 74 modern guest rooms and a
- rooftop pool. Doubles from $189.
- * [41]21c Museum Hotel is a more contemporary option downtown with
- 125 rooms, an art-filled restaurant and an on-site art gallery.
- Doubles from $189.
- * Look for a short-term rental in Trinity Park, a leafy residential
- district between downtown and Duke University’s East Campus, a
- short walk from many restaurants, bars, breweries and music venues.
+Restaurants and bars
- Getting around
- * Downtown Durham is walkable but you’ll need a car to reach
- locations farther afield. If you don’t have your own, there are
- ride-share options, including Uber and Lyft. [42]Buses also run
- throughout the city (and are free through June 2024).
+ • [30]Ponysaurus Brewing Co. is a downtown craft brewery with crackling fire
+ pits in a leafy garden strung with lights.
+ • [31]Ideal’s is a sandwich shop in East Durham with lines out the door at
+ lunchtime.
+ • [32]Mike D’s BBQ, also in East Durham, is a new barbecue joint serving
+ brisket and smoked beans.
+ • [33]Little Bull is a new restaurant in the Old Five Points neighborhood
+ that serves dumplings stuffed with goat birria in a bowl of rich consomé.
+ • [34]Motorco Music Hall is a concert venue that also hosts dance parties.
+ • [35]Corpse Reviver is a cocktail bar in a former coffin shop.
+ • [36]Monuts is a bustling Ninth Street bakery and cafe that began as a
+ tricycle vendor peddling doughnuts at the Durham Farmers’ Market.
+ • [37]Rose’s Noodles, Dumplings and Sweets is a former meat market and sweets
+ shop that evolved into a casual East Asian-inspired eatery.
+
+Shopping
+
+ • [38]Durham Vintage Collective is a new and inviting second-hand shop
+ downtown.
+ • [39]Chet Miller is a well-stocked gift shop with Durham-themed throw
+ pillows, small-press travel guides, cookbooks from local chefs and jigsaw
+ puzzles.
+ • [40]EUtopia Design opened downtown last year and sells Polish glassware and
+ handcrafted ceramics.
+ • [41]Ella West Gallery is a sunny space that opened in August showcasing
+ contemporary art.
+ • [42]Carolina Soul Records and [43]Bull City Records are two spots to browse
+ vinyl on Main Street.
+
+Where to stay
+
+ • For a small city, Durham has an impressive selection of cool hotels. Most
+ notable is [44]the Durham, a 53-room boutique property in a landmark
+ building with midcentury modern architecture, mod décor and a scenic
+ rooftop bar. Double rooms from around $240.
+ • [45]Unscripted Durham opened in the former Jack Tar Motel, another 1960s
+ property that is now home to 74 modern guest rooms and a rooftop pool.
+ Doubles from $189.
+ • [46]21c Museum Hotel is a more contemporary option downtown with 125 rooms,
+ an art-filled restaurant and an on-site art gallery. Doubles from $189.
+ • Look for a short-term rental in Trinity Park, a leafy residential district
+ between downtown and Duke University’s East Campus, a short walk from many
+ restaurants, bars, breweries and music venues.
+
+Getting around
+
+ • Downtown Durham is walkable but you’ll need a car to reach locations
+ farther afield. If you don’t have your own, there are ride-share options,
+ including Uber and Lyft. [47]Buses also run throughout the city (and are
+ free through June 2024).
Itinerary
- Friday
- A square, beige-brick building with a colorful banner that reads:
- Nasher Museum of Art
- 3:30 p.m. Visit a campus museum
- Anyone concerned that artificial intelligence will eventually do their
- job may be put at ease by the new exhibition at Duke University’s
- [43]Nasher Museum of Art, “Act as if You Are a Curator,” which was
- organized not by museum staff but by ChatGPT, OpenAI’s popular chatbot
- (through Jan. 14; free admission). The eclectic A.I.-generated
- exhibition spans Mesoamerican stone figures and Salvador Dalí works
- selected from the museum’s nearly 14,000-piece collection, though many
- were mislabeled by the chatbot (as noted by a flesh-and-blood curator).
- More cohesive is the moving — and human-curated — exhibition of
- photographs and collage installations from the artist Lyle Ashton
- Harris (through Jan. 7). While on campus, stroll through the nearby
- [44]Sarah P. Duke Gardens, where five miles of serene pathways wind
- past magnolias, blooming roses and a lake reflecting autumnal colors.
- A square, beige-brick building with a colorful banner that reads:
- Nasher Museum of Art
- Two people sit at a wooden table with plastic orange seats. They are
- looking at two chalkboard menus advertising seafood options above an
- open kitchen. An orange life preserver hangs on the wall between the
- two chalkboard menus.
- Saltbox Seafood Joint
- 6 p.m. Feast on Carolina seafood
- Fresh, seasonal seafood caught off the North Carolina coast is the
- simple, winning formula at [45]Saltbox Seafood Joint, a restaurant
- owned by the chef Ricky Moore, who earned the 2022 James Beard Award
- for the best chef in the Southeast. What began as a tiny takeaway shack
- in the Old Five Points neighborhood is now a spacious, but still
- frill-free, sit-down locale on Durham-Chapel Hill Boulevard. Luckily,
- the menu hasn’t changed much: You can still get heaping plates of fried
- oysters, blue crab, mullet and clams with generous portions of fried
- potatoes and collard greens. My go-to is the fried catfish sandwich
- topped with citrusy red-cabbage slaw ($14) and a side of Hush-Honeys,
- the chef’s trademarked take on cornmeal fritters drizzled with honey
- ($4).
- Two people sit at a wooden table with plastic orange seats. They are
- looking at two chalkboard menus advertising seafood options above an
- open kitchen. An orange life preserver hangs on the wall between the
- two chalkboard menus.
- Saltbox Seafood Joint
- 8:30 p.m. Try a local beer by the firepit
- The competition is growing among the many craft breweries downtown,
- where out-of-town brewers — like Asheville’s [46]Dssolvr and
- [47]Hi-Wire Brewing — have opened Durham taprooms in an area that’s
- already home to longtime local favorites like [48]Fullsteam Brewery and
- the [49]Durty Bull Brewing Company. But on a crisp fall evening, the
- most atmospheric place for a locally brewed pint is easily
- [50]Ponysaurus Brewing Co., an independent craft brewery with crackling
- fire pits in a leafy garden strung with lights. Try the
- tangerine-tinged Golden Rule Saison ($6) and a scoop of the house snack
- mixes, like the pretzel-and-peanutty Bartender’s Blend ($1).
- A view of a white water tower rising against a blue sky. A logo on the
- tower reads:
- Durham’s downtown brims with new restaurants, boutiques and breweries
- amid historic brick warehouses, tobacco factories and textile mills.
+Friday
- Saturday
- The interior of an old-fashioned room with wooden floors, wooden walls
- and a wooden ceiling. It is sparsely furnished, with two wooden chairs
- and a wooden chest. Sunlight comes into the room from a window.
- Bennett Place
- 9:30 a.m. Take a history lesson
- Swing by [51]Monuts, a Ninth Street bakery and cafe, to pick up a
- cinnamon-and-molasses-glazed pumpkin-spice doughnut ($2.50) and Hot
- Apple Chai-der, a steaming blend of apple cider and chai tea ($5.50),
- before heading out west for a dive into North Carolina history. Beyond
- Civil War scholars, few are likely to recall what transpired at
- [52]Bennett Place, a historic farmstead about six miles northwest of
- downtown. One of the few Civil War sites not associated with battle,
- this out-of-the-way landmark is where the Union general William T.
- Sherman and the Confederate general Joseph E. Johnston negotiated the
- largest troop surrender of the war — nearly 90,000 soldiers from the
- Carolinas, Georgia and Florida — inside the home of a local family in
- 1865. Begin a visit in the small museum, where a short video explains
- the site’s significance, then head across the lawn to tour the
- reconstructed farmhouse and surrounding outbuildings where the generals
- hashed out the terms (free admission).
- The interior of an old-fashioned room with wooden floors, wooden walls
- and a wooden ceiling. It is sparsely furnished, with two wooden chairs
- and a wooden chest. Sunlight comes into the room from a window.
- Bennett Place
- 12 p.m. Seek sandwiches in the east
- A former food desert, East Durham has emerged as a lunchtime
- destination for hungry diners from across the city. You’ll know you’ve
- found [53]Ideal’s, a sandwich shop that opened in 2021, by the line
- snaking down the sidewalk (don’t worry, it moves quickly). Here,
- freshly baked rolls — sesame-crusted hoagies and rosemary focaccia —
- are the foundation for superb deli sandwiches. Best is the Philly-style
- roast pork with provolone and garlicky broccoli rabe ($8.50 for a
- half-hoagie) and the thick-cut garlic-and-onion potato chips ($1.75).
- Another notable newcomer is [54]Mike D’s BBQ, a barbecue joint that
- opened nearby in July. Go there for a brisket sandwich doused with the
- signature smoky-sweet sauce ($10), a side of smoked beans ($5) and
- sweet tea ($4).
- Rows of barrels that have the word
- Mystic Farm & Distillery
- 2 p.m. Sip North Carolina bourbon
- Whatever your preferred spirit, there’s likely someone in Durham
- distilling it. Small-production craft booze — from [55]mead and
- [56]cider to [57]gin and [58]rye — have exploded in popularity
- recently, and one producer worth seeking out is [59]Mystic Farm &
- Distillery, about six miles east of downtown. Drop in at this bucolic
- 22-acre bourbon distillery for a free tasting of the full range of
- spirits, including the award-winning Broken Oak bourbon and a smooth
- cacao-finished version made with cacao nibs from Raleigh’s [60]Videri
- Chocolate Factory. Small group tours are also offered on weekends ($20;
- reserve in advance).
- Rows of barrels that have the word
- Mystic Farm & Distillery
- 4 p.m. Flip through records and second-hand finds
- Supporting local businesses is a point of pride in this fiercely loyal
- city, as evidenced by the growing number of small independent shops
- downtown. Start on West Parrish Street at the [61]Durham Vintage
- Collective, an inviting second-hand boutique that opened in July, where
- you might find plaid miniskirts, leather jackets or a framed
- Jean-Michel Basquiat lithograph. Across the street, explore [62]Chet
- Miller, a well-stocked gift shop with Durham-themed throw pillows,
- small-press travel guides, cookbooks from local chefs and game-night
- jigsaw puzzles. Right next door, [63]EUtopia Design opened last year
- selling exquisite Polish glassware and handcrafted ceramics. Scope out
- the latest color-splashed exhibition at [64]Ella West Gallery, a sunny
- space that opened in August showcasing contemporary art from Black,
- female and other diverse and underrepresented artists. Then continue to
- East Main Street to browse vinyl albums of jazz, soul, rock and
- bluegrass at [65]Carolina Soul Records and at the new location of
- [66]Bull City Records across the street.
- A glass dish with sliced fish that is garnished with flowers.
- Little Bull
- 7 p.m. Dine on fresh Mexican-American flavors
- Downtown Durham is packed with great restaurants, but head a bit north
- to the Old Five Points neighborhood where the city’s latest hotspot,
- [67]Little Bull, opened on a quiet block in June. The chef Oscar Diaz,
- already well-known in Raleigh for his Mexican-American cuisine, again
- tapped his heritage when creating the playful menu. Highlights of a
- recent meal included crudo with North Carolina tuna, aguachile, wasabi
- and flying-fish roe ($18), plantain empanadas ($16) and soft dumplings
- stuffed with goat birria in a bowl of rich consomé ($16). Stick to the
- small plates as portions are generous, and save room for dessert: The
- churro balls with chocolate sauce ($9) are divine.
- A glass dish with sliced fish that is garnished with flowers.
- Little Bull
- A person with a tattooed arm holds a drink in a martini glass. A skewer
- with three stuffed green olives rests on top of the glass.
- Corpse Reviver
- 9 p.m. Sip martinis in a former coffin shop
- At the end of 2022, the city designated most of downtown a social
- district called [68]the Bullpen, where folks are permitted to walk
- around with alcoholic beverages purchased in the area. So if the bar is
- packed at [69]the Velvet Hippo, a lively rooftop lounge that opened in
- August serving fruity slushies and creative cocktails, you can take
- that frozen Hawaiian Rum Punch ($13) to go and stroll over to
- [70]Motorco Music Hall, a concert venue that also hosts dance parties,
- like a recent Taylor Fest for local Swifties. Or continue to [71]Corpse
- Reviver, a cocktail bar associated with the [72]Durham Distillery,
- which opened in 2020 in a former coffin shop and serves dirty martinis
- garnished with bacon-and-blue-cheese-stuffed olives ($15).
- A person with a tattooed arm holds a drink in a martini glass. A skewer
- with three stuffed green olives rests on top of the glass.
- Corpse Reviver
- The West Point Mill along the Eno River. Follow the yellow trail
- markers from the mill to reach Sennett’s Hole, a popular summertime
- swimming spot.
+A square, beige-brick building with a colorful banner that reads:
+Nasher Museum of Art
+3:30 p.m. Visit a campus museum
+Anyone concerned that artificial intelligence will eventually do their job may
+be put at ease by the new exhibition at Duke University’s [48]Nasher Museum of
+Art, “Act as if You Are a Curator,” which was organized not by museum staff but
+by ChatGPT, OpenAI’s popular chatbot (through Jan. 14; free admission). The
+eclectic A.I.-generated exhibition spans Mesoamerican stone figures and
+Salvador Dalí works selected from the museum’s nearly 14,000-piece collection,
+though many were mislabeled by the chatbot (as noted by a flesh-and-blood
+curator). More cohesive is the moving — and human-curated — exhibition of
+photographs and collage installations from the artist Lyle Ashton Harris
+(through Jan. 7). While on campus, stroll through the nearby [49]Sarah P. Duke
+Gardens, where five miles of serene pathways wind past magnolias, blooming
+roses and a lake reflecting autumnal colors.
+A square, beige-brick building with a colorful banner that reads:
+Nasher Museum of Art
+Two people sit at a wooden table with plastic orange seats. They are looking at
+two chalkboard menus advertising seafood options above an open kitchen. An
+orange life preserver hangs on the wall between the two chalkboard menus.
+Saltbox Seafood Joint
+6 p.m. Feast on Carolina seafood
+Fresh, seasonal seafood caught off the North Carolina coast is the simple,
+winning formula at [50]Saltbox Seafood Joint, a restaurant owned by the chef
+Ricky Moore, who earned the 2022 James Beard Award for the best chef in the
+Southeast. What began as a tiny takeaway shack in the Old Five Points
+neighborhood is now a spacious, but still frill-free, sit-down locale on
+Durham-Chapel Hill Boulevard. Luckily, the menu hasn’t changed much: You can
+still get heaping plates of fried oysters, blue crab, mullet and clams with
+generous portions of fried potatoes and collard greens. My go-to is the fried
+catfish sandwich topped with citrusy red-cabbage slaw ($14) and a side of
+Hush-Honeys, the chef’s trademarked take on cornmeal fritters drizzled with
+honey ($4).
+Two people sit at a wooden table with plastic orange seats. They are looking at
+two chalkboard menus advertising seafood options above an open kitchen. An
+orange life preserver hangs on the wall between the two chalkboard menus.
+Saltbox Seafood Joint
+8:30 p.m. Try a local beer by the firepit
+The competition is growing among the many craft breweries downtown, where
+out-of-town brewers — like Asheville’s [51]Dssolvr and [52]Hi-Wire Brewing —
+have opened Durham taprooms in an area that’s already home to longtime local
+favorites like [53]Fullsteam Brewery and the [54]Durty Bull Brewing Company.
+But on a crisp fall evening, the most atmospheric place for a locally brewed
+pint is easily [55]Ponysaurus Brewing Co., an independent craft brewery with
+crackling fire pits in a leafy garden strung with lights. Try the
+tangerine-tinged Golden Rule Saison ($6) and a scoop of the house snack mixes,
+like the pretzel-and-peanutty Bartender’s Blend ($1).
+A view of a white water tower rising against a blue sky. A logo on the tower
+reads:
+Durham’s downtown brims with new restaurants, boutiques and breweries amid
+historic brick warehouses, tobacco factories and textile mills.
- Sunday
- Eno River State Park
- 9 a.m. Hike along the river
- Catch the season at its most colorful along the Eno River, where there
- are dozens of trails to choose from in the [73]Eno River State Park and
- in [74]West Point on the Eno, a city park five miles north of downtown
- that is anchored by the historic West Point Mill. One scenic route
- begins at the mill, then climbs through the forest along the river
- (follow the yellow trail markers). After about 20 minutes, hop across
- the rocks crossing a shallow tributary to reach Sennett’s Hole, a
- natural pool — and popular summertime swimming spot — with small
- waterfalls and turtles warming themselves on the rocks on sunny days.
- Eno River State Park
- 11 a.m. Slurp some noodles
- Refuel after a hike with brunch at [75]Rose’s Noodles, Dumplings and
- Sweets, a former meat market and sweets shop near Brightleaf Square
- that evolved into a casual East Asian-inspired eatery serving fragrant
- bowls of beef pho ($17) and Thai rice soup ($14). The selection of
- cakes, cookies and pastries is impressive, but best are the ice-cream
- sandwiches that easily serve two — my favorite is the white miso flavor
- between chewy gingersnaps ($7).
- (BUTTON) Read Comments
+Saturday
- Correction:
- Nov. 2, 2023
+The interior of an old-fashioned room with wooden floors, wooden walls and a
+wooden ceiling. It is sparsely furnished, with two wooden chairs and a wooden
+chest. Sunlight comes into the room from a window.
+Bennett Place
+9:30 a.m. Take a history lesson
+Swing by [56]Monuts, a Ninth Street bakery and cafe, to pick up a
+cinnamon-and-molasses-glazed pumpkin-spice doughnut ($2.50) and Hot Apple
+Chai-der, a steaming blend of apple cider and chai tea ($5.50), before heading
+out west for a dive into North Carolina history. Beyond Civil War scholars, few
+are likely to recall what transpired at [57]Bennett Place, a historic farmstead
+about six miles northwest of downtown. One of the few Civil War sites not
+associated with battle, this out-of-the-way landmark is where the Union general
+William T. Sherman and the Confederate general Joseph E. Johnston negotiated
+the largest troop surrender of the war — nearly 90,000 soldiers from the
+Carolinas, Georgia and Florida — inside the home of a local family in 1865.
+Begin a visit in the small museum, where a short video explains the site’s
+significance, then head across the lawn to tour the reconstructed farmhouse and
+surrounding outbuildings where the generals hashed out the terms (free
+admission).
+The interior of an old-fashioned room with wooden floors, wooden walls and a
+wooden ceiling. It is sparsely furnished, with two wooden chairs and a wooden
+chest. Sunlight comes into the room from a window.
+Bennett Place
+12 p.m. Seek sandwiches in the east
+A former food desert, East Durham has emerged as a lunchtime destination for
+hungry diners from across the city. You’ll know you’ve found [58]Ideal’s, a
+sandwich shop that opened in 2021, by the line snaking down the sidewalk (don’t
+worry, it moves quickly). Here, freshly baked rolls — sesame-crusted hoagies
+and rosemary focaccia — are the foundation for superb deli sandwiches. Best is
+the Philly-style roast pork with provolone and garlicky broccoli rabe ($8.50
+for a half-hoagie) and the thick-cut garlic-and-onion potato chips ($1.75).
+Another notable newcomer is [59]Mike D’s BBQ, a barbecue joint that opened
+nearby in July. Go there for a brisket sandwich doused with the signature
+smoky-sweet sauce ($10), a side of smoked beans ($5) and sweet tea ($4).
+Rows of barrels that have the word
+Mystic Farm & Distillery
+2 p.m. Sip North Carolina bourbon
+Whatever your preferred spirit, there’s likely someone in Durham distilling it.
+Small-production craft booze — from [60]mead and [61]cider to [62]gin and [63]
+rye — have exploded in popularity recently, and one producer worth seeking out
+is [64]Mystic Farm & Distillery, about six miles east of downtown. Drop in at
+this bucolic 22-acre bourbon distillery for a free tasting of the full range of
+spirits, including the award-winning Broken Oak bourbon and a smooth
+cacao-finished version made with cacao nibs from Raleigh’s [65]Videri Chocolate
+Factory. Small group tours are also offered on weekends ($20; reserve in
+advance).
+Rows of barrels that have the word
+Mystic Farm & Distillery
+4 p.m. Flip through records and second-hand finds
+Supporting local businesses is a point of pride in this fiercely loyal city, as
+evidenced by the growing number of small independent shops downtown. Start on
+West Parrish Street at the [66]Durham Vintage Collective, an inviting
+second-hand boutique that opened in July, where you might find plaid
+miniskirts, leather jackets or a framed Jean-Michel Basquiat lithograph. Across
+the street, explore [67]Chet Miller, a well-stocked gift shop with
+Durham-themed throw pillows, small-press travel guides, cookbooks from local
+chefs and game-night jigsaw puzzles. Right next door, [68]EUtopia Design opened
+last year selling exquisite Polish glassware and handcrafted ceramics. Scope
+out the latest color-splashed exhibition at [69]Ella West Gallery, a sunny
+space that opened in August showcasing contemporary art from Black, female and
+other diverse and underrepresented artists. Then continue to East Main Street
+to browse vinyl albums of jazz, soul, rock and bluegrass at [70]Carolina Soul
+Records and at the new location of [71]Bull City Records across the street.
+A glass dish with sliced fish that is garnished with flowers.
+Little Bull
+7 p.m. Dine on fresh Mexican-American flavors
+Downtown Durham is packed with great restaurants, but head a bit north to the
+Old Five Points neighborhood where the city’s latest hotspot, [72]Little Bull,
+opened on a quiet block in June. The chef Oscar Diaz, already well-known in
+Raleigh for his Mexican-American cuisine, again tapped his heritage when
+creating the playful menu. Highlights of a recent meal included crudo with
+North Carolina tuna, aguachile, wasabi and flying-fish roe ($18), plantain
+empanadas ($16) and soft dumplings stuffed with goat birria in a bowl of rich
+consomé ($16). Stick to the small plates as portions are generous, and save
+room for dessert: The churro balls with chocolate sauce ($9) are divine.
+A glass dish with sliced fish that is garnished with flowers.
+Little Bull
+A person with a tattooed arm holds a drink in a martini glass. A skewer with
+three stuffed green olives rests on top of the glass.
+Corpse Reviver
+9 p.m. Sip martinis in a former coffin shop
+At the end of 2022, the city designated most of downtown a social district
+called [73]the Bullpen, where folks are permitted to walk around with alcoholic
+beverages purchased in the area. So if the bar is packed at [74]the Velvet
+Hippo, a lively rooftop lounge that opened in August serving fruity slushies
+and creative cocktails, you can take that frozen Hawaiian Rum Punch ($13) to go
+and stroll over to [75]Motorco Music Hall, a concert venue that also hosts
+dance parties, like a recent Taylor Fest for local Swifties. Or continue to
+[76]Corpse Reviver, a cocktail bar associated with the [77]Durham Distillery,
+which opened in 2020 in a former coffin shop and serves dirty martinis
+garnished with bacon-and-blue-cheese-stuffed olives ($15).
+A person with a tattooed arm holds a drink in a martini glass. A skewer with
+three stuffed green olives rests on top of the glass.
+Corpse Reviver
+[02-36HOURS-DURHAM-west-point-cvkl-mobileMasterAt3x-v2]
+The West Point Mill along the Eno River. Follow the yellow trail markers from
+the mill to reach Sennett’s Hole, a popular summertime swimming spot.
- An earlier version of this article misstated the days that Monuts, a
- bakery and cafe, is open on the weekend. It is open on Saturdays, not
- Sundays.
+Sunday
- (BUTTON) Read 164 Comments
- * (BUTTON)
- * (BUTTON)
- * (BUTTON)
- 164
+[02-36HOURS-DURHAM-eno-ghvw-mobileMasterAt3x]
+Eno River State Park
+9 a.m. Hike along the river
+Catch the season at its most colorful along the Eno River, where there are
+dozens of trails to choose from in the [78]Eno River State Park and in [79]West
+Point on the Eno, a city park five miles north of downtown that is anchored by
+the historic West Point Mill. One scenic route begins at the mill, then climbs
+through the forest along the river (follow the yellow trail markers). After
+about 20 minutes, hop across the rocks crossing a shallow tributary to reach
+Sennett’s Hole, a natural pool — and popular summertime swimming spot — with
+small waterfalls and turtles warming themselves on the rocks on sunny days.
+[02-36HOURS-DURHAM-eno-ghvw-mobileMasterAt3x]
+Eno River State Park
+11 a.m. Slurp some noodles
+Refuel after a hike with brunch at [80]Rose’s Noodles, Dumplings and Sweets, a
+former meat market and sweets shop near Brightleaf Square that evolved into a
+casual East Asian-inspired eatery serving fragrant bowls of beef pho ($17) and
+Thai rice soup ($14). The selection of cakes, cookies and pastries is
+impressive, but best are the ice-cream sandwiches that easily serve two — my
+favorite is the white miso flavor between chewy gingersnaps ($7).
+Read Comments
+Correction:
+Nov. 2, 2023
- Advertisement
- [76]SKIP ADVERTISEMENT
+An earlier version of this article misstated the days that Monuts, a bakery and
+cafe, is open on the weekend. It is open on Saturdays, not Sundays.
+
+Read 164 Comments
+
+ •
+ •
+ • 164
+
+Advertisement
+
+[86]SKIP ADVERTISEMENT
Site Index
Site Information Navigation
- * [77]© 2024 The New York Times Company
+ • [87]© 2024 The New York Times Company
- * [78]NYTCo
- * [79]Contact Us
- * [80]Accessibility
- * [81]Work with us
- * [82]Advertise
- * [83]T Brand Studio
- * [84]Your Ad Choices
- * [85]Privacy Policy
- * [86]Terms of Service
- * [87]Terms of Sale
- * [88]Site Map
- * [89]Canada
- * [90]International
- * [91]Help
- * [92]Subscriptions
+ • [88]NYTCo
+ • [89]Contact Us
+ • [90]Accessibility
+ • [91]Work with us
+ • [92]Advertise
+ • [93]T Brand Studio
+ • [94]Your Ad Choices
+ • [95]Privacy Policy
+ • [96]Terms of Service
+ • [97]Terms of Sale
+ • [98]Site Map
+ • [99]Canada
+ • [100]International
+ • [101]Help
+ • [102]Subscriptions
- * [93]Manage Privacy Preferences
+ • [103]Manage Privacy Preferences
- IFRAME:
- [94]https://www.googletagmanager.com/ns.html?id=GTM-P528B3>m_auth=tfA
- zqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x
-References
+References:
- Visible links:
- 1. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#site-content
- 2. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#site-index
- 3. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#commentsContainer
- 4. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html
- 5. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html
- 6. mailto:letters@nytimes.com
- 7. https://www.nytimes.com/by/ingrid-k-williams
- 8. https://www.nytimes.com/column/36-hours
- 9. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#recommendations
- 10. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#itinerary
- 11. https://maps.app.goo.gl/EimCs7T5YjC3DZi27
- 12. https://www.brightleafdurham.com/
- 13. https://americantobacco.co/
- 14. https://goldenbeltarts.com/
- 15. https://indyweek.com/music/missy-lanes-assembly-room-cicely-mitchell/
- 16. https://www.nytimes.com/2018/05/01/business/durham-real-estate-growth.html
- 17. https://nasher.duke.edu/
- 18. https://www.saltboxseafoodjoint.com/
- 19. https://www.whatismystic.com/
- 20. https://www.velvethippodurham.com/
- 21. https://gardens.duke.edu/
- 22. https://historicsites.nc.gov/all-sites/bennett-place
- 23. https://www.ncparks.gov/state-parks/eno-river-state-park
- 24. https://www.dprplaymore.org/facilities/facility/details/West-Point-on-the-Eno-76
- 25. https://www.ponysaurusbrewing.com/
- 26. https://idealsdeli.com/
- 27. https://www.mikedsbbq.com/
- 28. https://www.littlebullnc.com/
- 29. https://motorcomusic.com/
- 30. https://durhamdistillery.com/pages/corpse-reviver-cocktail-bar-and-lounge
- 31. https://www.monutsdonuts.com/
- 32. https://rosesdurham.com/
- 33. https://www.instagram.com/durhamvintagecollective/?hl=en
- 34. https://www.chetmillershop.com/
- 35. https://www.instagram.com/eutopia.design/?hl=en
- 36. https://www.ellawestgallery.com/
- 37. https://www.carolinasoul.com/
- 38. https://www.bullcityrecords.com/
- 39. https://www.thedurham.com/
- 40. https://www.unscriptedhotels.com/
- 41. https://www.21cmuseumhotels.com/durham/
- 42. https://godurhamtransit.org/
- 43. https://nasher.duke.edu/
- 44. https://gardens.duke.edu/
- 45. https://www.saltboxseafoodjoint.com/
- 46. https://dssolvr.com/
- 47. https://hiwirebrewing.com/durham/
- 48. https://www.fullsteam.ag/
- 49. https://www.durtybull.com/
- 50. https://www.ponysaurusbrewing.com/
- 51. https://www.monutsdonuts.com/
- 52. https://historicsites.nc.gov/all-sites/bennett-place
- 53. https://idealsdeli.com/
- 54. https://www.mikedsbbq.com/
- 55. https://www.honeygirlmeadery.com/
- 56. https://www.bullcityciderworks.com/
- 57. https://durhamdistillery.com/
- 58. https://www.libertyandplenty.com/
- 59. https://www.whatismystic.com/
- 60. https://viderichocolatefactory.com/
- 61. https://www.instagram.com/durhamvintagecollective/?hl=en
- 62. https://www.chetmillershop.com/
- 63. https://www.instagram.com/eutopia.design/?hl=en
- 64. https://www.ellawestgallery.com/
- 65. https://www.carolinasoul.com/
- 66. https://www.bullcityrecords.com/
- 67. https://www.littlebullnc.com/
- 68. https://downtowndurham.com/bullpen/
- 69. https://www.velvethippodurham.com/
- 70. https://motorcomusic.com/
- 71. https://durhamdistillery.com/pages/corpse-reviver-cocktail-bar-and-lounge
- 72. https://durhamdistillery.com/
- 73. https://www.ncparks.gov/state-parks/eno-river-state-park
- 74. https://www.dprplaymore.org/facilities/facility/details/West-Point-on-the-Eno-76
- 75. https://rosesdurham.com/
- 76. https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#after-bottom
- 77. https://help.nytimes.com/hc/en-us/articles/115014792127-Copyright-notice
- 78. https://www.nytco.com/
- 79. https://help.nytimes.com/hc/en-us/articles/115015385887-Contact-Us
- 80. https://help.nytimes.com/hc/en-us/articles/115015727108-Accessibility
- 81. https://www.nytco.com/careers/
- 82. https://nytmediakit.com/
- 83. https://www.tbrandstudio.com/
- 84. https://www.nytimes.com/privacy/cookie-policy#how-do-i-manage-trackers
- 85. https://www.nytimes.com/privacy/privacy-policy
- 86. https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-service
- 87. https://help.nytimes.com/hc/en-us/articles/115014893968-Terms-of-sale
- 88. https://www.nytimes.com/sitemap/
- 89. https://www.nytimes.com/ca/
- 90. https://www.nytimes.com/international/
- 91. https://help.nytimes.com/hc/en-us
- 92. https://www.nytimes.com/subscription?campaignId=37WXW
- 93. https://www.nytimes.com/privacy/manage-settings
- 94. https://www.googletagmanager.com/ns.html?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x
-
- Hidden links:
- 96. https://www.nytimes.com/
+[1] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#site-content
+[2] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#site-index
+[3] https://www.nytimes.com/
+[5] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#commentsContainer
+[6] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html
+[7] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html
+[8] mailto:letters@nytimes.com
+[9] https://www.nytimes.com/by/ingrid-k-williams
+[13] https://www.nytimes.com/column/36-hours
+[14] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#recommendations
+[15] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#itinerary
+[16] https://maps.app.goo.gl/EimCs7T5YjC3DZi27
+[17] https://www.brightleafdurham.com/
+[18] https://americantobacco.co/
+[19] https://goldenbeltarts.com/
+[20] https://indyweek.com/music/missy-lanes-assembly-room-cicely-mitchell/
+[21] https://www.nytimes.com/2018/05/01/business/durham-real-estate-growth.html
+[22] https://nasher.duke.edu/
+[23] https://www.saltboxseafoodjoint.com/
+[24] https://www.whatismystic.com/
+[25] https://www.velvethippodurham.com/
+[26] https://gardens.duke.edu/
+[27] https://historicsites.nc.gov/all-sites/bennett-place
+[28] https://www.ncparks.gov/state-parks/eno-river-state-park
+[29] https://www.dprplaymore.org/facilities/facility/details/West-Point-on-the-Eno-76
+[30] https://www.ponysaurusbrewing.com/
+[31] https://idealsdeli.com/
+[32] https://www.mikedsbbq.com/
+[33] https://www.littlebullnc.com/
+[34] https://motorcomusic.com/
+[35] https://durhamdistillery.com/pages/corpse-reviver-cocktail-bar-and-lounge
+[36] https://www.monutsdonuts.com/
+[37] https://rosesdurham.com/
+[38] https://www.instagram.com/durhamvintagecollective/?hl=en
+[39] https://www.chetmillershop.com/
+[40] https://www.instagram.com/eutopia.design/?hl=en
+[41] https://www.ellawestgallery.com/
+[42] https://www.carolinasoul.com/
+[43] https://www.bullcityrecords.com/
+[44] https://www.thedurham.com/
+[45] https://www.unscriptedhotels.com/
+[46] https://www.21cmuseumhotels.com/durham/
+[47] https://godurhamtransit.org/
+[48] https://nasher.duke.edu/
+[49] https://gardens.duke.edu/
+[50] https://www.saltboxseafoodjoint.com/
+[51] https://dssolvr.com/
+[52] https://hiwirebrewing.com/durham/
+[53] https://www.fullsteam.ag/
+[54] https://www.durtybull.com/
+[55] https://www.ponysaurusbrewing.com/
+[56] https://www.monutsdonuts.com/
+[57] https://historicsites.nc.gov/all-sites/bennett-place
+[58] https://idealsdeli.com/
+[59] https://www.mikedsbbq.com/
+[60] https://www.honeygirlmeadery.com/
+[61] https://www.bullcityciderworks.com/
+[62] https://durhamdistillery.com/
+[63] https://www.libertyandplenty.com/
+[64] https://www.whatismystic.com/
+[65] https://viderichocolatefactory.com/
+[66] https://www.instagram.com/durhamvintagecollective/?hl=en
+[67] https://www.chetmillershop.com/
+[68] https://www.instagram.com/eutopia.design/?hl=en
+[69] https://www.ellawestgallery.com/
+[70] https://www.carolinasoul.com/
+[71] https://www.bullcityrecords.com/
+[72] https://www.littlebullnc.com/
+[73] https://downtowndurham.com/bullpen/
+[74] https://www.velvethippodurham.com/
+[75] https://motorcomusic.com/
+[76] https://durhamdistillery.com/pages/corpse-reviver-cocktail-bar-and-lounge
+[77] https://durhamdistillery.com/
+[78] https://www.ncparks.gov/state-parks/eno-river-state-park
+[79] https://www.dprplaymore.org/facilities/facility/details/West-Point-on-the-Eno-76
+[80] https://rosesdurham.com/
+[86] https://www.nytimes.com/interactive/2023/11/02/travel/things-to-do-durham-nc.html#after-bottom
+[87] https://help.nytimes.com/hc/en-us/articles/115014792127-Copyright-notice
+[88] https://www.nytco.com/
+[89] https://help.nytimes.com/hc/en-us/articles/115015385887-Contact-Us
+[90] https://help.nytimes.com/hc/en-us/articles/115015727108-Accessibility
+[91] https://www.nytco.com/careers/
+[92] https://nytmediakit.com/
+[93] https://www.tbrandstudio.com/
+[94] https://www.nytimes.com/privacy/cookie-policy#how-do-i-manage-trackers
+[95] https://www.nytimes.com/privacy/privacy-policy
+[96] https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-service
+[97] https://help.nytimes.com/hc/en-us/articles/115014893968-Terms-of-sale
+[98] https://www.nytimes.com/sitemap/
+[99] https://www.nytimes.com/ca/
+[100] https://www.nytimes.com/international/
+[101] https://help.nytimes.com/hc/en-us
+[102] https://www.nytimes.com/subscription?campaignId=37WXW
+[103] https://www.nytimes.com/privacy/manage-settings
diff --git a/static/archive/www-nytimes-com-yrjrte.txt b/static/archive/www-nytimes-com-yrjrte.txt
index b0cdd6a..f3357de 100644
--- a/static/archive/www-nytimes-com-yrjrte.txt
+++ b/static/archive/www-nytimes-com-yrjrte.txt
@@ -1,667 +1,634 @@
- #[1]alternate [2]Why Culture Has Come to a Standstill
+The Magazine’s Culture Issue
+
+ • Jesmyn Ward’s Literary South
+ • The Heart of Swiftiedom
+ • Culture at a Standstill
+ • Can Usher Save R&B?
+ • Sparring With Errol Morris
+
+ • U.S.
+ • World
+ • Business
+ • Arts
+ • Lifestyle
+ • Opinion
+ • Audio
+ • Games
+ • Cooking
+ • Wirecutter
+ • The Athletic
+
+[13]
The Magazine’s Culture Issue
- * [3]Jesmyn Ward’s Literary South
- * [4]The Heart of Swiftiedom
- * [5]Culture at a Standstill
- * [6]Can Usher Save R&B?
- * [7]Sparring With Errol Morris
+ • [14]Jesmyn Ward’s Literary South
+ • [15]The Heart of Swiftiedom
+ • [16]Culture at a Standstill
+ • [17]Can Usher Save R&B?
+ • [18]Sparring With Errol Morris
- An illustration of various people all bunched together.
- Credit...Illustration by Tim Enthoven
-
- [8]Skip to content[9]Skip to site index
- (BUTTON) Search & Section Navigation
- (BUTTON) Section Navigation
+An illustration of various people all bunched together.
+Credit...Illustration by Tim Enthoven
+[19]Skip to content[20]Skip to site index
+[21]
Why Culture Has Come to a Standstill
- A Times critic argues that ours is the least innovative century for the
- arts in 500 years. That doesn’t have to be a bad thing.
+A Times critic argues that ours is the least innovative century for the arts in
+500 years. That doesn’t have to be a bad thing.
- Credit...Illustration by Tim Enthoven
+Credit...Illustration by Tim Enthoven
- Supported by
- [10]SKIP ADVERTISEMENT
- * (BUTTON) Share full article
- * (BUTTON)
- * (BUTTON)
- * [11]1240
+Supported by
- [12]Jason Farago
+[22]SKIP ADVERTISEMENT
- By [13]Jason Farago
- * Oct. 10, 2023
+ • Share full article
+ •
+ •
+ • [26]1240
- At the Metropolitan Museum of Art, in its fall blockbuster show,
- [14]“Manet/Degas,” is a painting from 1866 of a woman in the latest
- fashion. Victorine Meurent, Manet’s favorite model, stands in an empty
- room, accompanied only by a parrot on a bird stand. Her trademark red
- hair is tied back with a blue ribbon. Her head is slightly bowed as she
- smells a nosegay in her right hand: probably a gift from an absent
- admirer, just like the gentleman’s monocle in her left. She’s wearing a
- silk peignoir, which Manet has rendered in buttery strokes of pink and
- white. This is a full-length image, more than six feet tall, but
- Victorine hasn’t even put on her best clothes. She’s in a dressing
- gown, and the gown is amorphous. The gown is only paint.
+[27]Jason Farago
+
+By [28]Jason Farago
+
+ • Oct. 10, 2023
+
+At the Metropolitan Museum of Art, in its fall blockbuster show, [29]“Manet/
+Degas,” is a painting from 1866 of a woman in the latest fashion. Victorine
+Meurent, Manet’s favorite model, stands in an empty room, accompanied only by a
+parrot on a bird stand. Her trademark red hair is tied back with a blue ribbon.
+Her head is slightly bowed as she smells a nosegay in her right hand: probably
+a gift from an absent admirer, just like the gentleman’s monocle in her left.
+She’s wearing a silk peignoir, which Manet has rendered in buttery strokes of
+pink and white. This is a full-length image, more than six feet tall, but
+Victorine hasn’t even put on her best clothes. She’s in a dressing gown, and
+the gown is amorphous. The gown is only paint.
Listen to This Article
- Open this article in the New York Times Audio app on iOS.
+[30]
- Manet called this painting “Young Lady in 1866,” and the title is the
- briefest manifesto I know. After ages in which artists aimed for
- timelessness, Manet pictured a woman living in 1866, in the Paris of
- 1866, wearing clothes from 1866. The painting was a radical eruption of
- temporal specificity. An art for this year, in this place, in a form
- possible only now.
+Open this article in the New York Times Audio app on iOS.
- Image “Young Lady in 1866”
- “Young Lady in 1866,” by Edouard Manet.Credit...Metropolitan Museum of
- Art
+Manet called this painting “Young Lady in 1866,” and the title is the briefest
+manifesto I know. After ages in which artists aimed for timelessness, Manet
+pictured a woman living in 1866, in the Paris of 1866, wearing clothes from
+1866. The painting was a radical eruption of temporal specificity. An art for
+this year, in this place, in a form possible only now.
- Most artists and audiences at the time did not think this was such a
- virtue. “Young Lady in 1866” got bad press at the Salon, the annual
- exhibition of France’s official art academy, where artists aspired to
- eternal beauty and eternal values, expressed through classicized motifs
- and highly finished surfaces. Thomas Couture, Manet’s own teacher,
- specialized in bloated but very technically proficient tableaux of
- nymphs and heroes. Only a few Parisians could see, in the thick pallor
- of Victorine’s face and the impetuous brushiness of her peignoir, the
- mark of a new cultural dispensation. Baudelaire, Manet’s great friend,
- articulated it in “The Flowers of Evil”:
+Image“Young Lady in 1866”
+“Young Lady in 1866,” by Edouard Manet.Credit...Metropolitan Museum of Art
- O Death, old captain, it’s time! Lift anchor!
- We’re sick of this country, Death! Let us sail ...
- To the depths of the Unknown to find something new!
+Most artists and audiences at the time did not think this was such a virtue.
+“Young Lady in 1866” got bad press at the Salon, the annual exhibition of
+France’s official art academy, where artists aspired to eternal beauty and
+eternal values, expressed through classicized motifs and highly finished
+surfaces. Thomas Couture, Manet’s own teacher, specialized in bloated but very
+technically proficient tableaux of nymphs and heroes. Only a few Parisians
+could see, in the thick pallor of Victorine’s face and the impetuous brushiness
+of her peignoir, the mark of a new cultural dispensation. Baudelaire, Manet’s
+great friend, articulated it in “The Flowers of Evil”:
- To find something new! That was the imperative of modernism, not only
- in painting but also in poetry, in theater, in music, in architecture
- and eventually in the cinema. Your job as an artist was no longer to
- glorify the king or the church, nor to imitate as faithfully as
- possible the appearance of the outside world. It was to solder the next
- link in a cultural chain — fashioning a novel utterance that took novel
- shape even as it manifested its place in a larger history. “You have to
- be absolutely modern,” Rimbaud declared; “Make it new,” Ezra Pound
- instructed. To speak to your time, we once believed, required much more
- than new “content.” It required a commitment to new modes of narration,
- new styles of expression, that could bear witness to sea changes in
- society.
+ O Death, old captain, it’s time! Lift anchor!
+ We’re sick of this country, Death! Let us sail ...
+ To the depths of the Unknown to find something new!
- Manet, classically trained, figured out quickly that if he painted
- scenes of Parisian prostitutes in the same manner as his teacher
- painted Roman orgiasts, that wouldn’t cut it; he would have to invent a
- new kind of painting — flatter, franker — if he wanted to capture
- modern life. From then on, the creators who most decisively marked the
- history of art, again and again, described their work as a search for a
- new language, a new style, a new way of being. “I have transformed
- myself in the zero of form,” Kazimir Malevich wrote in 1915, and in his
- black square he found “the face of the new art.” Le Corbusier insisted
- that his open floor plans, enabled by reinforced floating columns, were
- not just an architectural aesthetic but an age: “Nothing is left to us
- of the architecture of past epochs, just as we can no longer derive any
- benefit from the literary and historical teaching given in schools.”
- Aimé Césaire, who would revolutionize French poetry in the 20th century
- as Baudelaire did in the 19th, understood that a modern Black
- expression required “a new language, capable of expressing an African
- heritage.” “In other words,” he said, “French was for me an instrument
- that I wanted to twist into a new way of speaking.”
+To find something new! That was the imperative of modernism, not only in
+painting but also in poetry, in theater, in music, in architecture and
+eventually in the cinema. Your job as an artist was no longer to glorify the
+king or the church, nor to imitate as faithfully as possible the appearance of
+the outside world. It was to solder the next link in a cultural chain —
+fashioning a novel utterance that took novel shape even as it manifested its
+place in a larger history. “You have to be absolutely modern,” Rimbaud
+declared; “Make it new,” Ezra Pound instructed. To speak to your time, we once
+believed, required much more than new “content.” It required a commitment to
+new modes of narration, new styles of expression, that could bear witness to
+sea changes in society.
- For 160 years, we spoke about culture as something active, something
- with velocity, something in continuous forward motion. What happens to
- a culture when it loses that velocity, or even slows to a halt? Walking
- through the other galleries of the Met after my third visit to
- “Manet/Degas,” I started doing that thing all the Salon visitors used
- to do in Paris in 1866: ignoring the paintings and scoping out the
- other spectators’ clothes. I saw visitors in the skinny jeans that
- defined the 2000s and in the roomy, high-waisted jeans that were
- popular in the 1990s; neither style looked particularly au courant or
- dated. Manet was a fashion maven, and I’d been marveling anew at the
- gauzy white-striped gown with flared sleeves that Berthe Morisot wears
- in [15]“The Balcony” to signal that she is a contemporary woman — that
- she is alive right now. What piece of clothing or accessory could you
- give a model to mark her as “Young Lady in 2023”? A titanium-cased
- iPhone is all that comes to mind, and even that hasn’t changed its
- appearance much in a decade.
+Manet, classically trained, figured out quickly that if he painted scenes of
+Parisian prostitutes in the same manner as his teacher painted Roman orgiasts,
+that wouldn’t cut it; he would have to invent a new kind of painting — flatter,
+franker — if he wanted to capture modern life. From then on, the creators who
+most decisively marked the history of art, again and again, described their
+work as a search for a new language, a new style, a new way of being. “I have
+transformed myself in the zero of form,” Kazimir Malevich wrote in 1915, and in
+his black square he found “the face of the new art.” Le Corbusier insisted that
+his open floor plans, enabled by reinforced floating columns, were not just an
+architectural aesthetic but an age: “Nothing is left to us of the architecture
+of past epochs, just as we can no longer derive any benefit from the literary
+and historical teaching given in schools.” Aimé Césaire, who would
+revolutionize French poetry in the 20th century as Baudelaire did in the 19th,
+understood that a modern Black expression required “a new language, capable of
+expressing an African heritage.” “In other words,” he said, “French was for me
+an instrument that I wanted to twist into a new way of speaking.”
- To audiences in the 20th century, novelty seemed to be a cultural
- birthright. Susan Sontag could write in 1965, with breezy confidence,
- that new styles of art, cinema, music and dance “succeed one another so
- rapidly as to seem to give their audiences no breathing space to
- prepare.” Today culture remains capable of endless production, but it’s
- far less capable of change. Intellectual property has swallowed the
- cinema; the Hollywood studios that once proposed a slate of big, medium
- and small pictures have hedged their bets, and even independent
- directors have stuck with narrative and visual techniques born in the
- 1960s. Have you tried to furnish an apartment lately? Whether you are
- at Restoration Hardware or on Alibaba, what you are probably buying are
- replicas of European antiques: “contemporary” designs first seen in
- Milan in the 1970s or Weimar in the 1920s. Harry Styles is rocking in
- the ’80s; Silk Sonic is jamming in the ’70s; somehow “Frasier” has been
- revived and they barely had to update the wardrobes.
+For 160 years, we spoke about culture as something active, something with
+velocity, something in continuous forward motion. What happens to a culture
+when it loses that velocity, or even slows to a halt? Walking through the other
+galleries of the Met after my third visit to “Manet/Degas,” I started doing
+that thing all the Salon visitors used to do in Paris in 1866: ignoring the
+paintings and scoping out the other spectators’ clothes. I saw visitors in the
+skinny jeans that defined the 2000s and in the roomy, high-waisted jeans that
+were popular in the 1990s; neither style looked particularly au courant or
+dated. Manet was a fashion maven, and I’d been marveling anew at the gauzy
+white-striped gown with flared sleeves that Berthe Morisot wears in [31]“The
+Balcony” to signal that she is a contemporary woman — that she is alive right
+now. What piece of clothing or accessory could you give a model to mark her as
+“Young Lady in 2023”? A titanium-cased iPhone is all that comes to mind, and
+even that hasn’t changed its appearance much in a decade.
- If the present state of culture feels directionless — it does to me,
- and sussing out its direction is literally my job — that is principally
- because we are still inculcated, so unconsciously we never even bother
- to spell it out, in what the modernists believed: that good art is good
- because it is innovative, and that an ambitious writer, composer,
- director or choreographer should not make things too much like what
- others have made before. But our culture has not been able to deliver
- step changes for quite some time. When you walk through your local
- museum’s modern wing, starting with Impressionism and following a
- succession of avant-gardes through the development of Cubism, Dada,
- Pop, minimalism, in the 1990s you arrive in a forest called “the
- contemporary,” and after more than 30 years no path forward has been
- revealed. On your drive home, you can turn on the decade-by-decade
- stations of Sirius XM: the ’50s, ’60s, ’70s, ’80s and ’90s will each
- sound distinct, but all the millennial nostalgia of the 2000s station
- cannot disguise that “We Belong Together” and “Irreplaceable” do not
- yet sound retro. When I was younger, I looked at cultural works as if
- they were posts on a timeline, moving forward from Manet year by year.
- Now I find myself adrift in an eddy of cultural signs, where everything
- just floats, and I can only tell time on my phone.
+To audiences in the 20th century, novelty seemed to be a cultural birthright.
+Susan Sontag could write in 1965, with breezy confidence, that new styles of
+art, cinema, music and dance “succeed one another so rapidly as to seem to give
+their audiences no breathing space to prepare.” Today culture remains capable
+of endless production, but it’s far less capable of change. Intellectual
+property has swallowed the cinema; the Hollywood studios that once proposed a
+slate of big, medium and small pictures have hedged their bets, and even
+independent directors have stuck with narrative and visual techniques born in
+the 1960s. Have you tried to furnish an apartment lately? Whether you are at
+Restoration Hardware or on Alibaba, what you are probably buying are replicas
+of European antiques: “contemporary” designs first seen in Milan in the 1970s
+or Weimar in the 1920s. Harry Styles is rocking in the ’80s; Silk Sonic is
+jamming in the ’70s; somehow “Frasier” has been revived and they barely had to
+update the wardrobes.
- Image
- Credit...Illustration by Tim Enthoven
+If the present state of culture feels directionless — it does to me, and
+sussing out its direction is literally my job — that is principally because we
+are still inculcated, so unconsciously we never even bother to spell it out, in
+what the modernists believed: that good art is good because it is innovative,
+and that an ambitious writer, composer, director or choreographer should not
+make things too much like what others have made before. But our culture has not
+been able to deliver step changes for quite some time. When you walk through
+your local museum’s modern wing, starting with Impressionism and following a
+succession of avant-gardes through the development of Cubism, Dada, Pop,
+minimalism, in the 1990s you arrive in a forest called “the contemporary,” and
+after more than 30 years no path forward has been revealed. On your drive home,
+you can turn on the decade-by-decade stations of Sirius XM: the ’50s, ’60s,
+’70s, ’80s and ’90s will each sound distinct, but all the millennial nostalgia
+of the 2000s station cannot disguise that “We Belong Together” and
+“Irreplaceable” do not yet sound retro. When I was younger, I looked at
+cultural works as if they were posts on a timeline, moving forward from Manet
+year by year. Now I find myself adrift in an eddy of cultural signs, where
+everything just floats, and I can only tell time on my phone.
- We are now almost a quarter of the way through what looks likely to go
- down in history as the least innovative, least transformative, least
- pioneering century for culture since the invention of the printing
- press. There is new content, of course, so much content, and there are
- new themes; there are new methods of production and distribution, more
- diverse creators and more global audiences; there is more singing in
- hip-hop and more sampling on pop tracks; there are TV detectives with
- smartphones and lovers facing rising seas. Twenty-three years in,
- though, shockingly few works of art in any medium — some albums, a
- handful of novels and artworks and barely any plays or poems — have
- been created that are unassimilable to the cultural and critical
- standards that audiences accepted in 1999. To pay attention to culture
- in 2023 is to be belted into some glacially slow Ferris wheel, cycling
- through remakes and pastiches with nowhere to go but around. The
- suspicion gnaws at me (does it gnaw at you?) that we live in a time and
- place whose culture seems likely to be forgotten.
+Image
+Credit...Illustration by Tim Enthoven
- To any claim that cultural progress is “over,” there is an easy and not
- inaccurate retort: Well, what about X? And sure enough, our time has
- indeed brought forth wonderful, meaningful cultural endeavors. I find
- the sculptures of [16]Nairy Baghramian, the [17]videos of Stan Douglas
- and the [18]environments of Pierre Huyghe to be artistic achievements
- of the highest caliber; I think [19]Ali Smith is writing novels of
- tremendous immediacy; I believe [20]“Transit” and [21]“Drive My Car”
- reaffirm the vitality of cinema; I love [22]South African amapiano and
- [23]Korean soap operas and [24]Ukrainian electronic music. My own
- cultural life is very rich, and this is not some rant that once
- everyone was so creative and now they’re all poseurs. I am asking a
- different and peskier question: why cultural production no longer
- progresses in time as it once did.
+We are now almost a quarter of the way through what looks likely to go down in
+history as the least innovative, least transformative, least pioneering century
+for culture since the invention of the printing press. There is new content, of
+course, so much content, and there are new themes; there are new methods of
+production and distribution, more diverse creators and more global audiences;
+there is more singing in hip-hop and more sampling on pop tracks; there are TV
+detectives with smartphones and lovers facing rising seas. Twenty-three years
+in, though, shockingly few works of art in any medium — some albums, a handful
+of novels and artworks and barely any plays or poems — have been created that
+are unassimilable to the cultural and critical standards that audiences
+accepted in 1999. To pay attention to culture in 2023 is to be belted into some
+glacially slow Ferris wheel, cycling through remakes and pastiches with nowhere
+to go but around. The suspicion gnaws at me (does it gnaw at you?) that we live
+in a time and place whose culture seems likely to be forgotten.
- I have a few theories, but one to start with is that the modernist
- cultural explosion might very well have been like the growth of the
- economy more generally: not the perpetual forward march we were
- promised in the 20th century, but a one-time-only rocket blast followed
- by a long, slow, disappointing glide. As the economist Robert Gordon
- has shown, the transformative growth of the period between 1870 and
- 1970 — the “special century,” he calls it — was an anomalous superevent
- fueled by unique and unrepeatable innovations (electricity, sanitation,
- the combustion engine) whose successors (above all information
- technology) have not had the same economic impact. In the United
- States, the 2010s had the slowest productivity growth of any decade in
- recorded history; if you believe you are living in the future, I am
- guessing you have not recently been on United Airlines. In this
- macroeconomic reading, a culture that no longer delivers expected
- stylistic innovations might just be part and parcel of a more generally
- underachieving century, and not to be tutted at in isolation.
+To any claim that cultural progress is “over,” there is an easy and not
+inaccurate retort: Well, what about X? And sure enough, our time has indeed
+brought forth wonderful, meaningful cultural endeavors. I find the sculptures
+of [32]Nairy Baghramian, the [33]videos of Stan Douglas and the [34]
+environments of Pierre Huyghe to be artistic achievements of the highest
+caliber; I think [35]Ali Smith is writing novels of tremendous immediacy; I
+believe [36]“Transit” and [37]“Drive My Car” reaffirm the vitality of cinema; I
+love [38]South African amapiano and [39]Korean soap operas and [40]Ukrainian
+electronic music. My own cultural life is very rich, and this is not some rant
+that once everyone was so creative and now they’re all poseurs. I am asking a
+different and peskier question: why cultural production no longer progresses in
+time as it once did.
- But more than the economics, the key factor can only be what happened
- to us at the start of this century: first, the plunge through our
- screens into an infinity of information; soon after, our submission to
- algorithmic recommendation engines and the surveillance that powers
- them. The digital tools we embraced were heralded as catalysts of
- cultural progress, but they produced such chronological confusion that
- progress itself made no sense. “It’s still one Earth,” the novelist
- Stacey D’Erasmo wrote in 2014, “but it is now subtended by a layer of
- highly elastic non-time, wild time, that is akin to a global collective
- unconscious wherein past, present and future occupy one unmediated
- plane.” In this dark wood, today and yesterday become hard to
- distinguish. The years are only time stamps. Objects lose their
- dimensions. Everything is recorded, nothing is remembered; culture is a
- thing to nibble at, to graze on.
+I have a few theories, but one to start with is that the modernist cultural
+explosion might very well have been like the growth of the economy more
+generally: not the perpetual forward march we were promised in the 20th
+century, but a one-time-only rocket blast followed by a long, slow,
+disappointing glide. As the economist Robert Gordon has shown, the
+transformative growth of the period between 1870 and 1970 — the “special
+century,” he calls it — was an anomalous superevent fueled by unique and
+unrepeatable innovations (electricity, sanitation, the combustion engine) whose
+successors (above all information technology) have not had the same economic
+impact. In the United States, the 2010s had the slowest productivity growth of
+any decade in recorded history; if you believe you are living in the future, I
+am guessing you have not recently been on United Airlines. In this
+macroeconomic reading, a culture that no longer delivers expected stylistic
+innovations might just be part and parcel of a more generally underachieving
+century, and not to be tutted at in isolation.
- If there is one cultural work that epitomizes this shift, where you can
- see our new epoch coming into view, I want to say it’s [25]“Back to
- Black,” by Amy Winehouse. The album dates to October 2006 — seven
- months after Twitter was founded, three months before the iPhone
- debuted — and it seems, listening again now, to be closing the door on
- the cultural system that Manet and Baudelaire established a century and
- a half previously. As the millennium dawned, there had been various
- efforts to write the symphony of the future (the last of which was
- probably Missy Elliott’s “Da Real World,” a “Matrix”-inspired album
- from 1999 that promised to sound like “not the year 2G but the year
- 3G”). There had also been various retroprojections, trying to
- inaugurate a new century with pre-Woodstock throwbacks (waxed
- mustaches, speakeasies; perhaps you recall an embarrassing circa-2000
- vogue for swing dancing).
+But more than the economics, the key factor can only be what happened to us at
+the start of this century: first, the plunge through our screens into an
+infinity of information; soon after, our submission to algorithmic
+recommendation engines and the surveillance that powers them. The digital tools
+we embraced were heralded as catalysts of cultural progress, but they produced
+such chronological confusion that progress itself made no sense. “It’s still
+one Earth,” the novelist Stacey D’Erasmo wrote in 2014, “but it is now
+subtended by a layer of highly elastic non-time, wild time, that is akin to a
+global collective unconscious wherein past, present and future occupy one
+unmediated plane.” In this dark wood, today and yesterday become hard to
+distinguish. The years are only time stamps. Objects lose their dimensions.
+Everything is recorded, nothing is remembered; culture is a thing to nibble at,
+to graze on.
- Image
- Amy Winehouse at the Highline Ballroom in New York in
- 2007.Credit...Michael Nagle for The New York Times
+If there is one cultural work that epitomizes this shift, where you can see our
+new epoch coming into view, I want to say it’s [41]“Back to Black,” by Amy
+Winehouse. The album dates to October 2006 — seven months after Twitter was
+founded, three months before the iPhone debuted — and it seems, listening again
+now, to be closing the door on the cultural system that Manet and Baudelaire
+established a century and a half previously. As the millennium dawned, there
+had been various efforts to write the symphony of the future (the last of which
+was probably Missy Elliott’s “Da Real World,” a “Matrix”-inspired album from
+1999 that promised to sound like “not the year 2G but the year 3G”). There had
+also been various retroprojections, trying to inaugurate a new century with
+pre-Woodstock throwbacks (waxed mustaches, speakeasies; perhaps you recall an
+embarrassing circa-2000 vogue for swing dancing).
- “Back to Black” was the first major cultural work of the 21st century
- that was neither new nor retro — but rather contented itself to float
- in time, to sound as if it came from no particular era. Winehouse wore
- her hair in a beehive, her band wore fedoras, but she was not
- performing a tribute act of any kind. Her production drew from the
- Great American Songbook, ’60s girl groups, also reggae and ska, but it
- never felt anachronistic or like a “postmodern” pastiche. Listen again
- to the title track and its percussive piano line: a stationary,
- metronomic cycle of D minor, G minor, B-flat major, and A7. The bass
- line of the piano overlays the chords with a syncopated swing, while a
- tambourine slaps and jangles with joyless regularity. We are back to
- Phil Spector’s Wall of Sound, we are waiting for the Shangri-Las or the
- Ronettes to come in, but instead Winehouse delivers a much more ragged
- and minor-keyed performance, with a vulgarity in the song’s second line
- that Martha Reeves would never pronounce. There is a discrepancy
- between vocals and instrumentation that is never resolved, and the
- artistry is all in that irresolution.
+Image
+Amy Winehouse at the Highline Ballroom in New York in 2007.Credit...Michael
+Nagle for The New York Times
-Who cares if it’s novel as long as it’s beautiful, or meaningful?
+“Back to Black” was the first major cultural work of the 21st century that was
+neither new nor retro — but rather contented itself to float in time, to sound
+as if it came from no particular era. Winehouse wore her hair in a beehive, her
+band wore fedoras, but she was not performing a tribute act of any kind. Her
+production drew from the Great American Songbook, ’60s girl groups, also reggae
+and ska, but it never felt anachronistic or like a “postmodern” pastiche.
+Listen again to the title track and its percussive piano line: a stationary,
+metronomic cycle of D minor, G minor, B-flat major, and A7. The bass line of
+the piano overlays the chords with a syncopated swing, while a tambourine slaps
+and jangles with joyless regularity. We are back to Phil Spector’s Wall of
+Sound, we are waiting for the Shangri-Las or the Ronettes to come in, but
+instead Winehouse delivers a much more ragged and minor-keyed performance, with
+a vulgarity in the song’s second line that Martha Reeves would never pronounce.
+There is a discrepancy between vocals and instrumentation that is never
+resolved, and the artistry is all in that irresolution.
- What Winehouse prefigured was a culture of an eternal present: a
- digitally informed sense of placelessness and atemporality that has
- left so many of us disoriented from our earlier cultural signposts.
- Each song on “Back to Black” seemed to be “borrowing from all the last
- century’s music history at once,” as the media scholar Moira Weigel
- once observed, though there was something contemporary about that
- timelessness too. Extracted from the past into lightweight MP3s, all
- the girl-group and jazz prefigurations began to seem just as immediate
- as Winehouse’s North London present.
+ Who cares if it’s novel as long as it’s beautiful, or meaningful?
- As early as 2006, well before the reverse chronology of blogs and the
- early Facebook gave way to the algorithmic soup of Instagram, Spotify
- and TikTok, Winehouse sensed that the real digital revolution in
- culture would not be in production, in the machines that artists used
- to make music or movies or books. It would be in reception: on the
- screens where they (where we) encountered culture, on which past and
- present are equidistant from each other. One upshot of this digital
- equation of past and present has been a greater disposability of
- culture: an infinite scroll and nothing to read, an infinite Netflix
- library with nothing to watch. Though pop music still throws up new
- stars now and then (I do really like [26]Ice Spice), the market for new
- music fell behind older music in the middle of the last decade, and
- even the records that sell, or stream, cannot be said to have wide
- cultural impact. (The most popular single of 2022 in the United States
- was [27]“Heat Waves,” a TikTok tune by a British alternative-pop group
- with little public profile called Glass Animals; and what’s weirdest is
- that it was recorded in 2020.)
+What Winehouse prefigured was a culture of an eternal present: a digitally
+informed sense of placelessness and atemporality that has left so many of us
+disoriented from our earlier cultural signposts. Each song on “Back to Black”
+seemed to be “borrowing from all the last century’s music history at once,” as
+the media scholar Moira Weigel once observed, though there was something
+contemporary about that timelessness too. Extracted from the past into
+lightweight MP3s, all the girl-group and jazz prefigurations began to seem just
+as immediate as Winehouse’s North London present.
- Outside of time there can be no progress, only the perpetual trying-on
- of styles and forms. Here years become vibes — or “eras,” as Taylor
- Swift likes to call them. And if culture is just a series of trends,
- then it is pointless to worry about their contemporaneity. There was a
- charming freakout last year when Kate Bush’s 1985 single “Running Up
- That Hill” went to the top of the charts after its deployment on yet
- another nostalgic television show, and veterans of the big-hair decade
- were horrified to see it appear on some 2022 playlists alongside Dua
- Lipa and the like. If you think the song belongs to 1985 in the way
- “Young Lady in 1866” belonged to 1866, the joke is now officially on
- you.
+As early as 2006, well before the reverse chronology of blogs and the early
+Facebook gave way to the algorithmic soup of Instagram, Spotify and TikTok,
+Winehouse sensed that the real digital revolution in culture would not be in
+production, in the machines that artists used to make music or movies or books.
+It would be in reception: on the screens where they (where we) encountered
+culture, on which past and present are equidistant from each other. One upshot
+of this digital equation of past and present has been a greater disposability
+of culture: an infinite scroll and nothing to read, an infinite Netflix library
+with nothing to watch. Though pop music still throws up new stars now and then
+(I do really like [42]Ice Spice), the market for new music fell behind older
+music in the middle of the last decade, and even the records that sell, or
+stream, cannot be said to have wide cultural impact. (The most popular single
+of 2022 in the United States was [43]“Heat Waves,” a TikTok tune by a British
+alternative-pop group with little public profile called Glass Animals; and
+what’s weirdest is that it was recorded in 2020.)
- Down at the baseline where cultural innovation used to happen, in the
- forms that artists once put together to show us something new — in the
- sounds of the recording studio, the shapes on the canvas, the movements
- of the dancers, the arrangements of the verse — something has stopped,
- or at least slowed to such a lethargic pace as to feel stopped. Such a
- claim may sound familiar if you were around for the postmodernism
- debates of the 1980s. The philosopher Arthur Danto averred that art
- ended with Andy Warhol’s Brillo Boxes, while the literary critic
- Fredric Jameson declared in 1984 that the whole of modernity was “spent
- and exhausted,” that there was no more style, indeed no more self, and
- that “the producers of culture have nowhere to turn but to the past:
- the imitation of dead styles.” As for the influence of digital media,
- as early as 1989 the cultural theorist Paul Virilio identified a “polar
- inertia” — a static pileup of images and words with no particular place
- to go — as the inevitable endpoint for culture on a “weightless planet”
- constituted of ones and zeros.
+Outside of time there can be no progress, only the perpetual trying-on of
+styles and forms. Here years become vibes — or “eras,” as Taylor Swift likes to
+call them. And if culture is just a series of trends, then it is pointless to
+worry about their contemporaneity. There was a charming freakout last year when
+Kate Bush’s 1985 single “Running Up That Hill” went to the top of the charts
+after its deployment on yet another nostalgic television show, and veterans of
+the big-hair decade were horrified to see it appear on some 2022 playlists
+alongside Dua Lipa and the like. If you think the song belongs to 1985 in the
+way “Young Lady in 1866” belonged to 1866, the joke is now officially on you.
- And yet looking back now, the “postmodern” turn of the later 20th
- century looks much more like a continuation of the modernist commitment
- to novelty than a repudiation of it. John Cage’s noteless composition
- “4'33"” was no last music, but flowered into the impostures of Fluxus
- and the ambient experiments of Brian Eno. The buildings of Frank Gehry
- and Zaha Hadid did look like nothing that came before, thanks in part
- to new rendering and fabrication technologies (CAD software, laser
- cutting machines). The digitally produced music of Massive Attack and
- even, I hate to say it, Moby did sound different from what was on the
- radio 10 years before. No one style could be called the true vanguard
- anymore, sure — but that did not preclude the perpetual discovery of
- new ones. The forecast at the end of the 20th century was a plurality
- of new images and sounds and words, powered perhaps by new, heavy
- desktop production machines.
+Down at the baseline where cultural innovation used to happen, in the forms
+that artists once put together to show us something new — in the sounds of the
+recording studio, the shapes on the canvas, the movements of the dancers, the
+arrangements of the verse — something has stopped, or at least slowed to such a
+lethargic pace as to feel stopped. Such a claim may sound familiar if you were
+around for the postmodernism debates of the 1980s. The philosopher Arthur Danto
+averred that art ended with Andy Warhol’s Brillo Boxes, while the literary
+critic Fredric Jameson declared in 1984 that the whole of modernity was “spent
+and exhausted,” that there was no more style, indeed no more self, and that
+“the producers of culture have nowhere to turn but to the past: the imitation
+of dead styles.” As for the influence of digital media, as early as 1989 the
+cultural theorist Paul Virilio identified a “polar inertia” — a static pileup
+of images and words with no particular place to go — as the inevitable endpoint
+for culture on a “weightless planet” constituted of ones and zeros.
- Since the start of the 21st century, despite all recent digital
- accelerations of discovery and transmission, no stylistic innovations
- of equivalent scale have taken place. The closest thing we can point to
- has been in rap, where the staccato nihilism of drill, deeply
- conversant with YouTube and SoundCloud, would sound legitimately
- foreign to a listener from 2000. (When the teenage Chief Keef was
- rapping in his grandmother’s Chicago apartment, he was following in the
- tradition of Joyce and Woolf and Pound.) In fact, the sampling
- techniques pioneered in hip-hop and, later, electronic dance music —
- once done with piles of records, now with folders of WAV files — have
- trickled down into photography, painting, literature and lower forms
- like memes, all of which now present a hyperreferentialism that sets
- them slightly apart from the last century’s efforts. In the 2010s,
- hip-hop alone seemed to be taking the challenge of digital progress
- seriously, though it, too, has calcified since; having switched from
- linear writing and recording of verses to improvising hundreds of
- one-verse digital takes, rappers now seem to be converging on a single,
- ProTools-produced flow.
+And yet looking back now, the “postmodern” turn of the later 20th century looks
+much more like a continuation of the modernist commitment to novelty than a
+repudiation of it. John Cage’s noteless composition “4'33"” was no last music,
+but flowered into the impostures of Fluxus and the ambient experiments of Brian
+Eno. The buildings of Frank Gehry and Zaha Hadid did look like nothing that
+came before, thanks in part to new rendering and fabrication technologies (CAD
+software, laser cutting machines). The digitally produced music of Massive
+Attack and even, I hate to say it, Moby did sound different from what was on
+the radio 10 years before. No one style could be called the true vanguard
+anymore, sure — but that did not preclude the perpetual discovery of new ones.
+The forecast at the end of the 20th century was a plurality of new images and
+sounds and words, powered perhaps by new, heavy desktop production machines.
- There have also been a few movies of limited influence (and very
- limited box-office success) that have introduced new cinematographic
- techniques: Ang Lee’s “Billy Lynn’s Long Halftime Walk” (2016) was the
- first film shot at an eerily lifelike 120 frames per second, while at
- the other extreme, Steven Soderbergh shot all of “Unsane” (2018) with
- an iPhone 7 Plus. Michael Bay’s “Ambulance” (2022) included
- first-person-view drone shots, flying the viewer through the windows of
- exploding cars the way your dad shot your last beach-vacation memory
- reel. But by and large the technologies that have changed filmmaking
- since 2000 have stayed in the postproduction studio: computer-graphics
- engines, digital tools for color grading and sound editing. They have
- had vanishingly little influence on the grammar of the moving image, in
- the way that lightweight cameras did for the Nouvelle Vague or digital
- kits did for American indie cinema. Really, the kind of image that
- distinguishes this century is less the spectacular Hollywood image than
- what the German artist Hito Steyerl has called the “poor image” —
- low-res compressed pictures like memes, thumbnails, screenshots — whose
- meaning arises from being circulated and modified.
+Since the start of the 21st century, despite all recent digital accelerations
+of discovery and transmission, no stylistic innovations of equivalent scale
+have taken place. The closest thing we can point to has been in rap, where the
+staccato nihilism of drill, deeply conversant with YouTube and SoundCloud,
+would sound legitimately foreign to a listener from 2000. (When the teenage
+Chief Keef was rapping in his grandmother’s Chicago apartment, he was following
+in the tradition of Joyce and Woolf and Pound.) In fact, the sampling
+techniques pioneered in hip-hop and, later, electronic dance music — once done
+with piles of records, now with folders of WAV files — have trickled down into
+photography, painting, literature and lower forms like memes, all of which now
+present a hyperreferentialism that sets them slightly apart from the last
+century’s efforts. In the 2010s, hip-hop alone seemed to be taking the
+challenge of digital progress seriously, though it, too, has calcified since;
+having switched from linear writing and recording of verses to improvising
+hundreds of one-verse digital takes, rappers now seem to be converging on a
+single, ProTools-produced flow.
- It may just be that the lexical possibilities of many traditional media
- are exhausted, and there’s no shame in that. Maybe Griffith and
- Eisenstein and Godard and Akerman did it all already, and it’s foolish
- to expect a new kind of cinema. Certainly that exhaustion came long ago
- to abstract painting, where every possible move can only be understood
- as a quotation or reboot. (Kerstin Brätsch, one of the smartest
- abstract painters working today, has acknowledged that any mark she
- makes is “not empty anymore but loaded with historical reference.”)
- Consider last year’s hit “Creepin’,” by The Weeknd: a 2022 rejigger of
- the 2004 Mario Winans song “I Don’t Wanna Know” with no meaningful
- change in instrumentation in the nearly two intervening decades. It was
- hardly the only recent chart-topper to employ a clangingly obvious
- sample, but it’s not like the endeavors of the 1990s, when Puffy and
- family were rapping over “Every Breath You Take.” Back then the critic
- Greg Tate could still celebrate such sampling as a motor of cultural
- progress; by “collapsing all eras of Black music onto a chip,” a new
- generation had new tools to write a new chapter of sound. Twenty-five
- years later, the citation and rearrangement have become so automatic as
- to seem automated — as our recent fears about artificial intelligence
- and large language models suggest we already know.
+There have also been a few movies of limited influence (and very limited
+box-office success) that have introduced new cinematographic techniques: Ang
+Lee’s “Billy Lynn’s Long Halftime Walk” (2016) was the first film shot at an
+eerily lifelike 120 frames per second, while at the other extreme, Steven
+Soderbergh shot all of “Unsane” (2018) with an iPhone 7 Plus. Michael Bay’s
+“Ambulance” (2022) included first-person-view drone shots, flying the viewer
+through the windows of exploding cars the way your dad shot your last
+beach-vacation memory reel. But by and large the technologies that have changed
+filmmaking since 2000 have stayed in the postproduction studio:
+computer-graphics engines, digital tools for color grading and sound editing.
+They have had vanishingly little influence on the grammar of the moving image,
+in the way that lightweight cameras did for the Nouvelle Vague or digital kits
+did for American indie cinema. Really, the kind of image that distinguishes
+this century is less the spectacular Hollywood image than what the German
+artist Hito Steyerl has called the “poor image” — low-res compressed pictures
+like memes, thumbnails, screenshots — whose meaning arises from being
+circulated and modified.
- Trapped on a modernist game board where there are no more moves to
- make, a growing number of young artists essentially pivoted to
- political activism — plant a tree and call it a sculpture — while
- others leaned hard into absurdity to try to express the sense of
- digital disorientation. You saw this Dadaist strategy in the hyperpop
- of 100 gecs, in the crashed-and-burned “post-internet” art of the
- collective Dis, and above all in the satirical fashion of Virgil Abloh.
- (Abloh, who died in 2021, was outspoken about how comedy functioned as
- a coping mechanism for a generation lost in a digital fog: “It’s not a
- coincidence that things have gravitated toward this invented language
- of humor,” he said in 2018. “But then I often wonder: Is streetwear
- hollow?”)
+It may just be that the lexical possibilities of many traditional media are
+exhausted, and there’s no shame in that. Maybe Griffith and Eisenstein and
+Godard and Akerman did it all already, and it’s foolish to expect a new kind of
+cinema. Certainly that exhaustion came long ago to abstract painting, where
+every possible move can only be understood as a quotation or reboot. (Kerstin
+Brätsch, one of the smartest abstract painters working today, has acknowledged
+that any mark she makes is “not empty anymore but loaded with historical
+reference.”) Consider last year’s hit “Creepin’,” by The Weeknd: a 2022
+rejigger of the 2004 Mario Winans song “I Don’t Wanna Know” with no meaningful
+change in instrumentation in the nearly two intervening decades. It was hardly
+the only recent chart-topper to employ a clangingly obvious sample, but it’s
+not like the endeavors of the 1990s, when Puffy and family were rapping over
+“Every Breath You Take.” Back then the critic Greg Tate could still celebrate
+such sampling as a motor of cultural progress; by “collapsing all eras of Black
+music onto a chip,” a new generation had new tools to write a new chapter of
+sound. Twenty-five years later, the citation and rearrangement have become so
+automatic as to seem automated — as our recent fears about artificial
+intelligence and large language models suggest we already know.
- It wouldn’t be so bad if we could just own our static position; who
- cares if it’s novel as long as it’s beautiful, or meaningful? But that
- pesky modernist conviction remains in us: A work of art demonstrates
- its value through its freshness. So we have shifted our expectations
- from new forms to new subject matter — new stories, told in the same
- old languages as before. In the 20th century we were taught that
- cleaving “style” from “content” was a fallacy, but in the 21st century
- content (that word!) has had its ultimate vengeance, as the sole
- component of culture that our machines can fully understand, transmit
- and monetize. What cannot be categorized cannot be streamed; to pass
- through the pipes art must become information. So, sure, there are new
- songs about texting and ghosting; sure, there are superhero movies
- about trauma and comedies about climate change. But in privileging the
- parts of culture that can be summarized and shared — the narratives,
- the characters, the lyrics, the lessons — digital media have bulldozed
- an autonomous sphere of culture into a moral terrain that Aristotle
- would find familiar: We again want our “content” to authentically
- reflect the world (mimesis) and produce healthy feelings in its
- consumers (catharsis).
+Trapped on a modernist game board where there are no more moves to make, a
+growing number of young artists essentially pivoted to political activism —
+plant a tree and call it a sculpture — while others leaned hard into absurdity
+to try to express the sense of digital disorientation. You saw this Dadaist
+strategy in the hyperpop of 100 gecs, in the crashed-and-burned “post-internet”
+art of the collective Dis, and above all in the satirical fashion of Virgil
+Abloh. (Abloh, who died in 2021, was outspoken about how comedy functioned as a
+coping mechanism for a generation lost in a digital fog: “It’s not a
+coincidence that things have gravitated toward this invented language of
+humor,” he said in 2018. “But then I often wonder: Is streetwear hollow?”)
- Very unfortunately, this evangelical turn in the arts in the 21st
- century has been conflated with the long-overdue admission of women,
- people of color and out sexual minorities into the culture industry —
- conflated, not least, by its P.R. departments. A gay rom-com is trotted
- out as “the first”; a Black Little Mermaid is a “breakthrough”; our
- museums, studios and publishing houses can bring nothing new to market
- except the very people they once systematically excluded. If resisting
- such market essentialism was once a primordial task of the artist — “I
- am not burying myself in a narrow particularism,” Césaire made clear in
- 1956 as he forged a French poetry that could span the Black Atlantic —
- today identities keep being diminished, brutally, into a series of
- searchable tags.
+It wouldn’t be so bad if we could just own our static position; who cares if
+it’s novel as long as it’s beautiful, or meaningful? But that pesky modernist
+conviction remains in us: A work of art demonstrates its value through its
+freshness. So we have shifted our expectations from new forms to new subject
+matter — new stories, told in the same old languages as before. In the 20th
+century we were taught that cleaving “style” from “content” was a fallacy, but
+in the 21st century content (that word!) has had its ultimate vengeance, as the
+sole component of culture that our machines can fully understand, transmit and
+monetize. What cannot be categorized cannot be streamed; to pass through the
+pipes art must become information. So, sure, there are new songs about texting
+and ghosting; sure, there are superhero movies about trauma and comedies about
+climate change. But in privileging the parts of culture that can be summarized
+and shared — the narratives, the characters, the lyrics, the lessons — digital
+media have bulldozed an autonomous sphere of culture into a moral terrain that
+Aristotle would find familiar: We again want our “content” to authentically
+reflect the world (mimesis) and produce healthy feelings in its consumers
+(catharsis).
- This institutional hunger for novelty combined with digital
- requirements for communicability may help explain why so much recently
- celebrated American culture has taken such conservative, traditionalist
- forms: oil portraiture, Iowa-vintage coming-of-age novels, biopics,
- operettas barely distinguishable from musical theater. “It scandalizes
- progressive sensibility to think that things were so much more complex
- in this domain a generation ago than they are now, but there you have
- it,” said Darby English, the art historian and author of “How To See a
- Work of Art in Total Darkness,” when asked in 2021 about the recent
- efflorescence of Black American art in museums and the market. “Because
- the core project is communication,” English said, “anything that
- resists the art-communications apparatus fails to leave a mark. Form
- has become increasingly irrelevant during these 20 years.”
+Very unfortunately, this evangelical turn in the arts in the 21st century has
+been conflated with the long-overdue admission of women, people of color and
+out sexual minorities into the culture industry — conflated, not least, by its
+P.R. departments. A gay rom-com is trotted out as “the first”; a Black Little
+Mermaid is a “breakthrough”; our museums, studios and publishing houses can
+bring nothing new to market except the very people they once systematically
+excluded. If resisting such market essentialism was once a primordial task of
+the artist — “I am not burying myself in a narrow particularism,” Césaire made
+clear in 1956 as he forged a French poetry that could span the Black Atlantic —
+today identities keep being diminished, brutally, into a series of searchable
+tags.
- Image
- Credit...Illustration by Tim Enthoven
+This institutional hunger for novelty combined with digital requirements for
+communicability may help explain why so much recently celebrated American
+culture has taken such conservative, traditionalist forms: oil portraiture,
+Iowa-vintage coming-of-age novels, biopics, operettas barely distinguishable
+from musical theater. “It scandalizes progressive sensibility to think that
+things were so much more complex in this domain a generation ago than they are
+now, but there you have it,” said Darby English, the art historian and author
+of “How To See a Work of Art in Total Darkness,” when asked in 2021 about the
+recent efflorescence of Black American art in museums and the market. “Because
+the core project is communication,” English said, “anything that resists the
+art-communications apparatus fails to leave a mark. Form has become
+increasingly irrelevant during these 20 years.”
- There is no inherent reason — no reason; this point needs to be clear —
- that a recession of novelty has to mean a recession of cultural worth.
- On the contrary, non-novel excellence has been the state of things for
- a vast majority of art history. Roman art and literature provides a
- centuries-long tradition of emulation, appropriating and adapting
- Greek, Etruscan and on occasion Asian examples into a culture in which
- the idea of copying was alien. Medieval icons were never understood to
- be “of their time,” but looked back to the time of the Incarnation,
- forward to eternity or out of time entirely into a realm beyond human
- life. Even beyond the halfway point of the last millennium, European
- artists regularly emended, updated or substituted pre-existing artworks
- at will, integrating present and past into a more spiritually
- efficacious whole.
+Image
+Credit...Illustration by Tim Enthoven
- Consider also the long and bountiful history of Chinese painting, in
- which, from the 13th century to the early 20th, scholar-artists
- frequently demonstrated their erudition by painting in explicit homage
- to masters from the past. For these literati painters, what mattered
- more than technical skill or aesthetic progression was an artist’s
- spontaneous creativity as channeled through previous masterpieces.
- There’s a painting I love in the Palace Museum in Beijing by Zhao
- Mengfu, a prince and scholar working during the Yuan dynasty, that
- dates to around 1310 but incorporates styles from several other
- periods. Spartan trees, whose branches hook like crab claws, derive
- from Song examples a few centuries earlier. A clump of bamboo in the
- corner coheres through strict, tight brushwork pioneered by the Han
- dynasty a thousand years before. Alongside the trees and rocks the
- artist added an inscription:
+There is no inherent reason — no reason; this point needs to be clear — that a
+recession of novelty has to mean a recession of cultural worth. On the
+contrary, non-novel excellence has been the state of things for a vast majority
+of art history. Roman art and literature provides a centuries-long tradition of
+emulation, appropriating and adapting Greek, Etruscan and on occasion Asian
+examples into a culture in which the idea of copying was alien. Medieval icons
+were never understood to be “of their time,” but looked back to the time of the
+Incarnation, forward to eternity or out of time entirely into a realm beyond
+human life. Even beyond the halfway point of the last millennium, European
+artists regularly emended, updated or substituted pre-existing artworks at
+will, integrating present and past into a more spiritually efficacious whole.
- The rocks are like flying-white, the trees are like seal script,
- The writing of bamboo draws upon the bafen method.
- Only when one masters this secret
- Will he understand that calligraphy and painting have always been
- one.
+Consider also the long and bountiful history of Chinese painting, in which,
+from the 13th century to the early 20th, scholar-artists frequently
+demonstrated their erudition by painting in explicit homage to masters from the
+past. For these literati painters, what mattered more than technical skill or
+aesthetic progression was an artist’s spontaneous creativity as channeled
+through previous masterpieces. There’s a painting I love in the Palace Museum
+in Beijing by Zhao Mengfu, a prince and scholar working during the Yuan
+dynasty, that dates to around 1310 but incorporates styles from several other
+periods. Spartan trees, whose branches hook like crab claws, derive from Song
+examples a few centuries earlier. A clump of bamboo in the corner coheres
+through strict, tight brushwork pioneered by the Han dynasty a thousand years
+before. Alongside the trees and rocks the artist added an inscription:
- In other words: Use one style of brushwork for one element, another for
- another, just as a calligrapher uses different styles for different
- purposes. But beyond the simple equation of writing and painting, Zhao
- was doing something much more important: He was sublimating styles,
- some from the recent past and some of great antiquity, into a series of
- recombinatory elements that an artist of his time could deploy in
- concert. The literati painters learned from the old masters (important
- during the Yuan dynasty, to safeguard the place of Han culture under
- Mongol rule), but theirs was no simple classicism. It was a practice of
- aesthetic self-fulfillment that channeled itself through pre-existing
- gestures. Without ever worrying about novelty, you could still speak
- directly to your time. You could express your tenderest feelings, or
- face up to the upheavals of your age, in the overlapping styles of
- artists long dead.
+ The rocks are like flying-white, the trees are like seal script,
+ The writing of bamboo draws upon the bafen method.
+ Only when one masters this secret
+ Will he understand that calligraphy and painting have always been one.
- Image
- “Elegant Rocks and Sparse Trees,” by Zhao Mengfu, circa
- 1310.Credit...Palace Museum, Beijing
+In other words: Use one style of brushwork for one element, another for
+another, just as a calligrapher uses different styles for different purposes.
+But beyond the simple equation of writing and painting, Zhao was doing
+something much more important: He was sublimating styles, some from the recent
+past and some of great antiquity, into a series of recombinatory elements that
+an artist of his time could deploy in concert. The literati painters learned
+from the old masters (important during the Yuan dynasty, to safeguard the place
+of Han culture under Mongol rule), but theirs was no simple classicism. It was
+a practice of aesthetic self-fulfillment that channeled itself through
+pre-existing gestures. Without ever worrying about novelty, you could still
+speak directly to your time. You could express your tenderest feelings, or face
+up to the upheavals of your age, in the overlapping styles of artists long
+dead.
- Someone foresaw, profoundly, that this century was going to require
- something similar: that when forward motion became impossible,
- ambitious culture was going to have to take another shape. Winehouse,
- as producers and collaborators have reminded us since her death, was an
- inveterate collector and compiler of musical clips. (The drummer and
- music historian Ahmir Thompson, better known as Questlove, remembered:
- “She would always be on her computer sending me MP3s: ‘Listen to this,
- listen to this. ... ’”) She was living through, and channeling into
- “Back to Black,” the initial dissolution of history into streams of
- digital information, disembodied, disintermediated, each no further
- from the present than a Google prompt. She freely recombined those
- fragments but never indulged in nostalgia; she was disappointed by the
- present but knew there was no going back. And at enormous personal
- cost, she created something enduring out of it, showing how much harder
- it would be to leave a real mark amid fathomless data — to transcend
- mere recombination, sampling, pastiche.
+Image
+“Elegant Rocks and Sparse Trees,” by Zhao Mengfu, circa 1310.Credit...Palace
+Museum, Beijing
- If the arts are to matter in the 21st century, we must still believe
- that they can collectively manifest our lives and feelings: that they
- can constitute a Geistgeschichte, or “history of spirit,” as the German
- idealists used to say. This was entirely possible before modernism, and
- it is possible after. The most ambitious abstract painters working
- today, like Albert Oehlen and Charline von Heyl, are doing something
- akin to Winehouse’s free articulation: drawing from diverse and even
- contradictory styles in the hunt for forms that can still have effects.
- Olga Tokarczuk structured her 2007 book, “Flights,” as a constellation
- of barely connected characters and styles, more fugitive than the last
- century’s novels in fragments; to read her is less like looking at a
- mosaic than toggling among tabs. Bad Bunny, working at the crossroads
- of trap, reggaeton, bachata and rock, is crafting pick-and-mix
- aggregations of small pieces, like “Back to Black,” that are digital in
- every way that matters. All of them are speaking out of parts of the
- past in a language that is their own.
+Someone foresaw, profoundly, that this century was going to require something
+similar: that when forward motion became impossible, ambitious culture was
+going to have to take another shape. Winehouse, as producers and collaborators
+have reminded us since her death, was an inveterate collector and compiler of
+musical clips. (The drummer and music historian Ahmir Thompson, better known as
+Questlove, remembered: “She would always be on her computer sending me MP3s:
+‘Listen to this, listen to this. ... ’”) She was living through, and channeling
+into “Back to Black,” the initial dissolution of history into streams of
+digital information, disembodied, disintermediated, each no further from the
+present than a Google prompt. She freely recombined those fragments but never
+indulged in nostalgia; she was disappointed by the present but knew there was
+no going back. And at enormous personal cost, she created something enduring
+out of it, showing how much harder it would be to leave a real mark amid
+fathomless data — to transcend mere recombination, sampling, pastiche.
- We have every ability to live in a culture of beauty, insight,
- surprise, if we could just accept that we are no longer modern, and
- have not been for a while; that somewhere in the push and pull of
- digital homogeneity and political stasis we entered a new phase of
- history. We have been evading our predicament with coping mechanisms
- and marketing scams, which have left all of us disappointedly asking,
- What’s new? Surely it would be healthier — and who knows what might
- flower — if we accepted and even embraced the end of stylistic
- progress, and at last took seriously the digital present we are
- disavowing. And the perpetuity of “Back to Black,” still playing in the
- background of avocado-toast dispensaries in East London and West
- Hollywood after 17 years, suggests to me that we have not lost our
- ability to identify voices of our time, even if they are fated to speak
- a language yoked to the past. Culture is stuck? Progress is dead? I
- died a hundred times, a poet once said, and kept singing.
+If the arts are to matter in the 21st century, we must still believe that they
+can collectively manifest our lives and feelings: that they can constitute a
+Geistgeschichte, or “history of spirit,” as the German idealists used to say.
+This was entirely possible before modernism, and it is possible after. The most
+ambitious abstract painters working today, like Albert Oehlen and Charline von
+Heyl, are doing something akin to Winehouse’s free articulation: drawing from
+diverse and even contradictory styles in the hunt for forms that can still have
+effects. Olga Tokarczuk structured her 2007 book, “Flights,” as a constellation
+of barely connected characters and styles, more fugitive than the last
+century’s novels in fragments; to read her is less like looking at a mosaic
+than toggling among tabs. Bad Bunny, working at the crossroads of trap,
+reggaeton, bachata and rock, is crafting pick-and-mix aggregations of small
+pieces, like “Back to Black,” that are digital in every way that matters. All
+of them are speaking out of parts of the past in a language that is their own.
- [28]Jason Farago, a critic at large for The Times, writes about art and
- culture in the U.S. and abroad. [29]More about Jason Farago
- A version of this article appears in print on , Page 38 of the Sunday
- Magazine with the headline: Out of Time. [30]Order Reprints |
- [31]Today’s Paper | [32]Subscribe
- [33]1240
- * (BUTTON) Share full article
- * (BUTTON)
- * (BUTTON)
- * [34]1240
+We have every ability to live in a culture of beauty, insight, surprise, if we
+could just accept that we are no longer modern, and have not been for a while;
+that somewhere in the push and pull of digital homogeneity and political stasis
+we entered a new phase of history. We have been evading our predicament with
+coping mechanisms and marketing scams, which have left all of us disappointedly
+asking, What’s new? Surely it would be healthier — and who knows what might
+flower — if we accepted and even embraced the end of stylistic progress, and at
+last took seriously the digital present we are disavowing. And the perpetuity
+of “Back to Black,” still playing in the background of avocado-toast
+dispensaries in East London and West Hollywood after 17 years, suggests to me
+that we have not lost our ability to identify voices of our time, even if they
+are fated to speak a language yoked to the past. Culture is stuck? Progress is
+dead? I died a hundred times, a poet once said, and kept singing.
- Advertisement
- [35]SKIP ADVERTISEMENT
+[44]Jason Farago, a critic at large for The Times, writes about art and culture
+in the U.S. and abroad. [45]More about Jason Farago
+
+A version of this article appears in print on , Page 38 of the Sunday Magazine
+with the headline: Out of Time. [46]Order Reprints | [47]Today’s Paper | [48]
+Subscribe
+[49]1240
+
+ • Share full article
+ •
+ •
+ • [53]1240
+
+Advertisement
+
+[54]SKIP ADVERTISEMENT
Site Index
Site Information Navigation
- * [36]© 2023 The New York Times Company
+ • [55]© 2024 The New York Times Company
- * [37]NYTCo
- * [38]Contact Us
- * [39]Accessibility
- * [40]Work with us
- * [41]Advertise
- * [42]T Brand Studio
- * [43]Your Ad Choices
- * [44]Privacy Policy
- * [45]Terms of Service
- * [46]Terms of Sale
- * [47]Site Map
- * [48]Canada
- * [49]International
- * [50]Help
- * [51]Subscriptions
+ • [56]NYTCo
+ • [57]Contact Us
+ • [58]Accessibility
+ • [59]Work with us
+ • [60]Advertise
+ • [61]T Brand Studio
+ • [62]Your Ad Choices
+ • [63]Privacy Policy
+ • [64]Terms of Service
+ • [65]Terms of Sale
+ • [66]Site Map
+ • [67]Canada
+ • [68]International
+ • [69]Help
+ • [70]Subscriptions
- IFRAME:
- [52]https://www.googletagmanager.com/ns.html?id=GTM-P528B3>m_auth=tfA
- zqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x
+ • [71]Manage Privacy Preferences
-References
- Visible links:
- 1. nyt://article/86c70725-9ddb-5c32-9032-bf25f25572ba
- 2. https://www.nytimes.com/svc/oembed/json/?url=https://www.nytimes.com/2023/10/10/magazine/stale-culture.html
- 3. https://www.nytimes.com/2023/10/13/magazine/jesmyn-ward-let-us-descend.html
- 4. https://www.nytimes.com/2023/10/12/magazine/taylor-swift-eras-tour.html
- 5. https://www.nytimes.com/2023/10/10/magazine/stale-culture.html
- 6. https://www.nytimes.com/2023/10/11/magazine/usher-rnb.html
- 7. https://www.nytimes.com/interactive/2023/10/08/magazine/errol-morris-interview.html
- 8. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L76170-8570TMP.html#site-content
- 9. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L76170-8570TMP.html#site-index
- 10. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L76170-8570TMP.html#after-sponsor
- 11. file:///2023/10/10/magazine/stale-culture.html
- 12. https://www.nytimes.com/by/jason-farago
- 13. https://www.nytimes.com/by/jason-farago
- 14. https://www.nytimes.com/2023/09/21/arts/design/manet-degas-met-museum.html
- 15. https://www.musee-orsay.fr/en/artworks/le-balcon-707
- 16. https://www.nytimes.com/2023/09/06/arts/design/nairy-baghramian-met-facade-nyc-sculpture.html
- 17. https://www.nytimes.com/2016/04/12/arts/design/stan-douglass-the-secret-agent-offers-a-refracted-vision-of-history-and-terrorism.html
- 18. https://www.nytimes.com/2018/10/11/arts/design/pierre-huyghe-serpentine-gallery-london-artist.html
- 19. https://www.nytimes.com/2022/05/02/books/review/companion-piece-ali-smith.html
- 20. https://www.nytimes.com/2019/02/28/movies/transit-review.html
- 21. https://www.nytimes.com/2021/11/24/movies/drive-my-car-review.html
- 22. https://www.youtube.com/watch?v=ou0luMrf1mU
- 23. https://www.nytimes.com/2018/02/07/watching/k-drama-streaming-guide.html
- 24. https://www.nytimes.com/2022/06/23/arts/music/cxema-ukraine.html
- 25. https://www.nytimes.com/2021/12/01/arts/design/amy-winehouse-design-museum.html
- 26. https://www.nytimes.com/2023/01/20/arts/music/ice-spice-like.html
- 27. https://www.youtube.com/watch?v=mRD0-GxqHVo
- 28. https://www.nytimes.com/by/jason-farago
- 29. https://www.nytimes.com/by/jason-farago
- 30. https://www.parsintl.com/publication/the-new-york-times/
- 31. https://www.nytimes.com/section/todayspaper
- 32. https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY
- 33. file:///2023/10/10/magazine/stale-culture.html
- 34. file:///2023/10/10/magazine/stale-culture.html
- 35. file:///var/folders/q9/qlz2w5251kzdfgn0np7z2s4c0000gn/T/L76170-8570TMP.html#after-bottom
- 36. https://help.nytimes.com/hc/en-us/articles/115014792127-Copyright-notice
- 37. https://www.nytco.com/
- 38. https://help.nytimes.com/hc/en-us/articles/115015385887-Contact-Us
- 39. https://help.nytimes.com/hc/en-us/articles/115015727108-Accessibility
- 40. https://www.nytco.com/careers/
- 41. https://nytmediakit.com/
- 42. https://www.tbrandstudio.com/
- 43. https://www.nytimes.com/privacy/cookie-policy#how-do-i-manage-trackers
- 44. https://www.nytimes.com/privacy/privacy-policy
- 45. https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-service
- 46. https://help.nytimes.com/hc/en-us/articles/115014893968-Terms-of-sale
- 47. file:///sitemap/
- 48. https://www.nytimes.com/ca/
- 49. https://www.nytimes.com/international/
- 50. https://help.nytimes.com/hc/en-us
- 51. https://www.nytimes.com/subscription?campaignId=37WXW
- 52. https://www.googletagmanager.com/ns.html?id=GTM-P528B3>m_auth=tfAzqo1rYDLgYhmTnSjPqw>m_preview=env-130>m_cookies_win=x
+References:
- Hidden links:
- 54. file://localhost/
- 55. file://localhost/section/magazine
- 56. https://www.nytimes.com/audio/app/2023/10/10/magazine/stale-culture.html?referringSource=audioAppPromo
+[13] https://www.nytimes.com/
+[14] https://www.nytimes.com/2023/10/13/magazine/jesmyn-ward-let-us-descend.html
+[15] https://www.nytimes.com/2023/10/12/magazine/taylor-swift-eras-tour.html
+[16] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html
+[17] https://www.nytimes.com/2023/10/11/magazine/usher-rnb.html
+[18] https://www.nytimes.com/interactive/2023/10/08/magazine/errol-morris-interview.html
+[19] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html#site-content
+[20] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html#site-index
+[21] https://www.nytimes.com/section/magazine
+[22] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html#after-sponsor
+[26] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html
+[27] https://www.nytimes.com/by/jason-farago
+[28] https://www.nytimes.com/by/jason-farago
+[29] https://www.nytimes.com/2023/09/21/arts/design/manet-degas-met-museum.html
+[30] https://www.nytimes.com/audio/app/2023/10/10/magazine/stale-culture.html?referringSource=audioAppPromo
+[31] https://www.musee-orsay.fr/en/artworks/le-balcon-707
+[32] https://www.nytimes.com/2023/09/06/arts/design/nairy-baghramian-met-facade-nyc-sculpture.html
+[33] https://www.nytimes.com/2016/04/12/arts/design/stan-douglass-the-secret-agent-offers-a-refracted-vision-of-history-and-terrorism.html
+[34] https://www.nytimes.com/2018/10/11/arts/design/pierre-huyghe-serpentine-gallery-london-artist.html
+[35] https://www.nytimes.com/2022/05/02/books/review/companion-piece-ali-smith.html
+[36] https://www.nytimes.com/2019/02/28/movies/transit-review.html
+[37] https://www.nytimes.com/2021/11/24/movies/drive-my-car-review.html
+[38] https://www.youtube.com/watch?v=ou0luMrf1mU
+[39] https://www.nytimes.com/2018/02/07/watching/k-drama-streaming-guide.html
+[40] https://www.nytimes.com/2022/06/23/arts/music/cxema-ukraine.html
+[41] https://www.nytimes.com/2021/12/01/arts/design/amy-winehouse-design-museum.html
+[42] https://www.nytimes.com/2023/01/20/arts/music/ice-spice-like.html
+[43] https://www.youtube.com/watch?v=mRD0-GxqHVo
+[44] https://www.nytimes.com/by/jason-farago
+[45] https://www.nytimes.com/by/jason-farago
+[46] https://www.parsintl.com/publication/the-new-york-times/
+[47] https://www.nytimes.com/section/todayspaper
+[48] https://www.nytimes.com/subscriptions/Multiproduct/lp8HYKU.html?campaignId=48JQY
+[49] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html
+[53] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html
+[54] https://www.nytimes.com/2023/10/10/magazine/stale-culture.html#after-bottom
+[55] https://help.nytimes.com/hc/en-us/articles/115014792127-Copyright-notice
+[56] https://www.nytco.com/
+[57] https://help.nytimes.com/hc/en-us/articles/115015385887-Contact-Us
+[58] https://help.nytimes.com/hc/en-us/articles/115015727108-Accessibility
+[59] https://www.nytco.com/careers/
+[60] https://nytmediakit.com/
+[61] https://www.tbrandstudio.com/
+[62] https://www.nytimes.com/privacy/cookie-policy#how-do-i-manage-trackers
+[63] https://www.nytimes.com/privacy/privacy-policy
+[64] https://help.nytimes.com/hc/en-us/articles/115014893428-Terms-of-service
+[65] https://help.nytimes.com/hc/en-us/articles/115014893968-Terms-of-sale
+[66] https://www.nytimes.com/sitemap/
+[67] https://www.nytimes.com/ca/
+[68] https://www.nytimes.com/international/
+[69] https://help.nytimes.com/hc/en-us
+[70] https://www.nytimes.com/subscription?campaignId=37WXW
+[71] https://www.nytimes.com/privacy/manage-settings
diff --git a/static/archive/www-programmablemutter-com-8wp6z1.txt b/static/archive/www-programmablemutter-com-8wp6z1.txt
index fae65b3..89034cd 100644
--- a/static/archive/www-programmablemutter-com-8wp6z1.txt
+++ b/static/archive/www-programmablemutter-com-8wp6z1.txt
@@ -1,496 +1,455 @@
- #[1]Programmable Mutter
+[1][https]
- [2][https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimage
- s%2F6676303a-e6a9-4e7d-b10e-8662cfcfb435_1024x1024.png]
+[2]Programmable Mutter
-[3]Programmable Mutter
-
- (BUTTON)
- Subscribe
- (BUTTON) Sign in
-
- (BUTTON)
- Share this post
+Subscribe
+Sign in
+Share this post
+[https]
What OpenAI shares with Scientology
- www.programmablemutter.com
- (BUTTON)
- Copy link
- (BUTTON)
- Facebook
- (BUTTON)
- Email
- (BUTTON)
- Note
- (BUTTON)
- Other
+www.programmablemutter.com
+Copy link
+Facebook
+Email
+Note
+Other
What OpenAI shares with Scientology
Strange beliefs, fights over money and bad science fiction
- [4]Henry Farrell
- Nov 20, 2023
- 73
- (BUTTON)
- Share this post
+[12][https]
+[13]Henry Farrell
+Nov 20, 2023
+73
+Share this post
+[https]
What OpenAI shares with Scientology
- www.programmablemutter.com
- (BUTTON)
- Copy link
- (BUTTON)
- Facebook
- (BUTTON)
- Email
- (BUTTON)
- Note
- (BUTTON)
- Other
- 17
+www.programmablemutter.com
+Copy link
+Facebook
+Email
+Note
+Other
+[20]
+17
+[21]
+Share
+[22]
+[https]
- When Sam Altman was ousted as CEO of OpenAI, some hinted that lurid
- depravities lay behind his downfall. Surely, OpenAI’s board wouldn’t
- have toppled him if there weren’t some sordid story about to hit the
- headlines? But the [5]reporting all seems to be saying that it was God,
- not Sex, that lay behind Altman’s downfall. And Money, that third great
- driver of human behavior, seems to have driven his attempted return and
- his [6]new job at Microsoft, which is OpenAI’s biggest investor by far.
+When Sam Altman was ousted as CEO of OpenAI, some hinted that lurid depravities
+lay behind his downfall. Surely, OpenAI’s board wouldn’t have toppled him if
+there weren’t some sordid story about to hit the headlines? But the [23]
+reporting all seems to be saying that it was God, not Sex, that lay behind
+Altman’s downfall. And Money, that third great driver of human behavior, seems
+to have driven his attempted return and his [24]new job at Microsoft, which is
+OpenAI’s biggest investor by far.
- As the NYT describes the people who pushed Altman out:
+As the NYT describes the people who pushed Altman out:
- Thanks for reading Programmable Mutter! Subscribe for free to receive
- new posts. And if you want to support my work, [7]buy my and Abe
- Newman’s new book, [8]Underground Empire, and sing its praises (so long
- as you actually liked it), on Amazon, Goodreads, social media and
- everywhere else that people find out about good books.
- ____________________
- (BUTTON) Subscribe
+Thanks for reading Programmable Mutter! Subscribe for free to receive new
+posts. And if you want to support my work, [25]buy my and Abe Newman’s new
+book, [26]Underground Empire, and sing its praises (so long as you actually
+liked it), on Amazon, Goodreads, social media and everywhere else that people
+find out about good books.
- Ms. McCauley and Ms. Toner [HF - two board members] have ties to the
- Rationalist and Effective Altruist movements, a community that is
- deeply concerned that A.I. could one day destroy humanity. Today’s
- A.I. technology cannot destroy humanity. But this community believes
- that as the technology grows increasingly powerful, these dangers
- will arise.
+[35][ ]
+Subscribe
+ Ms. McCauley and Ms. Toner [HF - two board members] have ties to the
+ Rationalist and Effective Altruist movements, a community that is deeply
+ concerned that A.I. could one day destroy humanity. Today’s A.I. technology
+ cannot destroy humanity. But this community believes that as the technology
+ grows increasingly powerful, these dangers will arise.
- McCauley and Toner reportedly worried that Altman was pushing too hard,
- too quickly for new and potentially dangerous forms of AI (similar
- fears led some OpenAI people to bail out and found a competitor,
- Anthropic, a couple of years ago). The FT’s reporting [9]confirms that
- the fight was over how quickly to commercialize AI
+McCauley and Toner reportedly worried that Altman was pushing too hard, too
+quickly for new and potentially dangerous forms of AI (similar fears led some
+OpenAI people to bail out and found a competitor, Anthropic, a couple of years
+ago). The FT’s reporting [37]confirms that the fight was over how quickly to
+commercialize AI
- The back-story to all of this is actually much weirder than the average
- sex scandal. The field of AI (in particular, its debates around Large
- Language Models (LLMs) like OpenAI’s GPT-4) is profoundly shaped by
- cultish debates among people with some very strange beliefs.
+The back-story to all of this is actually much weirder than the average sex
+scandal. The field of AI (in particular, its debates around Large Language
+Models (LLMs) like OpenAI’s GPT-4) is profoundly shaped by cultish debates
+among people with some very strange beliefs.
- As LLMs have become increasingly powerful, theological arguments have
- begun to mix it up with the profit motive. That explains why OpenAI has
- such an unusual corporate form - it is a non-profit, with a for-profit
- structure retrofitted on top, sweatily entangled with a
- profit-maximizing corporation (Microsoft). It also plausibly explains
- why these tensions have exploded into the open.
+As LLMs have become increasingly powerful, theological arguments have begun to
+mix it up with the profit motive. That explains why OpenAI has such an unusual
+corporate form - it is a non-profit, with a for-profit structure retrofitted on
+top, sweatily entangled with a profit-maximizing corporation (Microsoft). It
+also plausibly explains why these tensions have exploded into the open.
- ********
+********
- I joked on Bluesky that the OpenAI saga was as if “the 1990s browser
- wars were being waged by rival factions of Dianetics striving to
- control the future.” Dianetics - for those who don’t obsess on the
- underbelly of American intellectual history - was the 1.0 version of L.
- Ron Hubbard’s Scientology. Hubbard [10]hatched it in collaboration with
- the science fiction editor John W. Campbell (who had a major science
- fiction award named after him until 2019, when his racism finally
- caught up with his reputation).
+I joked on Bluesky that the OpenAI saga was as if “the 1990s browser wars were
+being waged by rival factions of Dianetics striving to control the future.”
+Dianetics - for those who don’t obsess on the underbelly of American
+intellectual history - was the 1.0 version of L. Ron Hubbard’s Scientology.
+Hubbard [38]hatched it in collaboration with the science fiction editor John W.
+Campbell (who had a major science fiction award named after him until 2019,
+when his racism finally caught up with his reputation).
- The AI safety debate too is an unintended consequence of genre fiction.
- In 1987, multiple-Hugo award winning science-fiction critic Dave
- Langford [11]began a discussion of the “newish” genre of cyberpunk with
- a complaint about an older genre of story on information technology, in
- which “the ultimate computer is turned on and asked the ultimate
- question, and replies `Yes, now there is a God!'
+The AI safety debate too is an unintended consequence of genre fiction. In
+1987, multiple-Hugo award winning science-fiction critic Dave Langford [39]
+began a discussion of the “newish” genre of cyberpunk with a complaint about an
+older genre of story on information technology, in which “the ultimate computer
+is turned on and asked the ultimate question, and replies `Yes, now there is a
+God!'
- However, the cliche didn’t go away. Instead, it cross-bred with
- cyberpunk to produce some quite surprising progeny. The midwife was the
- writer Vernor Vinge, who proposed a revised meaning for “singularity.”
- This was a term already familiar to science fiction readers as the
- place inside a black hole where the ordinary predictions of physics
- broke down. Vinge suggested that we would soon likely create true AI,
- which would be far better at thinking than baseline humans, and would
- change the world in an accelerating process, creating a historical
- [12]singularity, after which the future of the human species would be
- radically unpredictable.
+However, the cliche didn’t go away. Instead, it cross-bred with cyberpunk to
+produce some quite surprising progeny. The midwife was the writer Vernor Vinge,
+who proposed a revised meaning for “singularity.” This was a term already
+familiar to science fiction readers as the place inside a black hole where the
+ordinary predictions of physics broke down. Vinge suggested that we would soon
+likely create true AI, which would be far better at thinking than baseline
+humans, and would change the world in an accelerating process, creating a
+historical [40]singularity, after which the future of the human species would
+be radically unpredictable.
- These ideas were turned into novels by Vinge himself, including A Fire
- Upon the Deep (fun!) and Rainbow’s End (weak!). Other SF writers like
- Charles Stross wrote novels about humans doing their best to co-exist
- with “weakly godlike” machine intelligence (also fun!). Others who had
- no notable talent for writing, like the futurist Ray Kurzweil, tried to
- turn the Singularity into the foundation stone of a new account of
- human progress. I still possess a mostly-unread copy of Kurzweil’s
- mostly-unreadable magnum opus, The Singularity is Near, which was
- distributed en masse to bloggers like meself in an early 2000s
- marketing campaign. If I dug hard enough in my archives, I might even
- be able to find the message from a publicity flack expressing
- disappointment that I hadn’t written about the book after they sent it.
- All this speculation had a strong flavor of end-of-days. As the Scots
- science fiction writer, Ken MacLeod memorably put it, the Singularity
- was the “Rapture of the Nerds.” Ken, being the [13]offspring of a Free
- Presbyterian preacher, knows a millenarian religion when he sees it:
- Kurzweil’s doorstopper should really have been titled The Singularity
- is Nigh.
+These ideas were turned into novels by Vinge himself, including A Fire Upon the
+Deep (fun!) and Rainbow’s End (weak!). Other SF writers like Charles Stross
+wrote novels about humans doing their best to co-exist with “weakly godlike”
+machine intelligence (also fun!). Others who had no notable talent for writing,
+like the futurist Ray Kurzweil, tried to turn the Singularity into the
+foundation stone of a new account of human progress. I still possess a
+mostly-unread copy of Kurzweil’s mostly-unreadable magnum opus, The Singularity
+is Near, which was distributed en masse to bloggers like meself in an early
+2000s marketing campaign. If I dug hard enough in my archives, I might even be
+able to find the message from a publicity flack expressing disappointment that
+I hadn’t written about the book after they sent it. All this speculation had a
+strong flavor of end-of-days. As the Scots science fiction writer, Ken MacLeod
+memorably put it, the Singularity was the “Rapture of the Nerds.” Ken, being
+the [41]offspring of a Free Presbyterian preacher, knows a millenarian religion
+when he sees it: Kurzweil’s doorstopper should really have been titled The
+Singularity is Nigh.
- Science fiction was the gateway drug, but it can’t really be blamed for
- everything that happened later. Faith in the Singularity has roughly
- the same relationship to SF as UFO-cultism. A small minority of SF
- writers are true believers; most are hearty skeptics, but recognize
- that superhuman machine intelligences are (a) possible) and (b) an
- extremely handy engine of plot. But the combination of cultish
- Singularity beliefs and science fiction has influenced a lot of
- external readers, who don’t distinguish sharply between the religious
- and fictive elements, but mix and meld them to come up with strange new
- hybrids.
+Science fiction was the gateway drug, but it can’t really be blamed for
+everything that happened later. Faith in the Singularity has roughly the same
+relationship to SF as UFO-cultism. A small minority of SF writers are true
+believers; most are hearty skeptics, but recognize that superhuman machine
+intelligences are (a) possible) and (b) an extremely handy engine of plot. But
+the combination of cultish Singularity beliefs and science fiction has
+influenced a lot of external readers, who don’t distinguish sharply between the
+religious and fictive elements, but mix and meld them to come up with strange
+new hybrids.
- Just such a syncretic religion provides the final part of the
- back-story to the OpenAI crisis. In the 2010s, ideas about the
- Singularity cross-fertilized with notions about Bayesian reasoning and
- some really terrible fanfic to create the online “rationalist” movement
- mentioned in the NYT.
+Just such a syncretic religion provides the final part of the back-story to the
+OpenAI crisis. In the 2010s, ideas about the Singularity cross-fertilized with
+notions about Bayesian reasoning and some really terrible fanfic to create the
+online “rationalist” movement mentioned in the NYT.
- I’ve never read a text on rationalism, whether by true believers, by
- hangers-on, or by bitter enemies (often erstwhile true believers), that
- really gets the totality of what you see if you dive into its core
- texts and apocrypha. And I won’t even try to provide one here. It is
- some Very Weird Shit and there is really great religious sociology to
- be written about it. The fights around [14]Roko’s Basilisk are perhaps
- the best known example of rationalism in action outside the community,
- and give you some flavor of the style of debate. But the very short
- version is that [15]Eliezer Yudkowsky, and his multitudes of online
- fans embarked on a massive collective intellectual project, which can
- reasonably be described as resurrecting David Langford’s hoary 1980s SF
- cliche, and treating it as the most urgent dilemma facing human beings
- today. We are about to create God. What comes next? Add Bayes’ Theorem
- to Vinge’s core ideas, sez rationalism, and you’ll likely find the
- answer.
+I’ve never read a text on rationalism, whether by true believers, by
+hangers-on, or by bitter enemies (often erstwhile true believers), that really
+gets the totality of what you see if you dive into its core texts and
+apocrypha. And I won’t even try to provide one here. It is some Very Weird Shit
+and there is really great religious sociology to be written about it. The
+fights around [42]Roko’s Basilisk are perhaps the best known example of
+rationalism in action outside the community, and give you some flavor of the
+style of debate. But the very short version is that [43]Eliezer Yudkowsky, and
+his multitudes of online fans embarked on a massive collective intellectual
+project, which can reasonably be described as resurrecting David Langford’s
+hoary 1980s SF cliche, and treating it as the most urgent dilemma facing human
+beings today. We are about to create God. What comes next? Add Bayes’ Theorem
+to Vinge’s core ideas, sez rationalism, and you’ll likely find the answer.
- The consequences are what you might expect when a crowd of bright but
- rather naive (and occasionally creepy) computer science and adjacent
- people try to re-invent theology from first principles, to model what
- human-created gods might do, and how they ought be constrained. They
- include the following, non-comprehensive list: all sorts of strange
- mental exercises, postulated superhuman entities benign and malign and
- how to think about them; the jumbling of parts from fan-fiction,
- computer science, home-brewed philosophy and ARGs to create grotesque
- and interesting intellectual chimeras; Nick Bostrom, and a crew of very
- well funded philosophers; Effective Altruism, whose fancier adherents
- often prefer not to acknowledge the approach’s somewhat disreputable
- origins.
+The consequences are what you might expect when a crowd of bright but rather
+naive (and occasionally creepy) computer science and adjacent people try to
+re-invent theology from first principles, to model what human-created gods
+might do, and how they ought be constrained. They include the following,
+non-comprehensive list: all sorts of strange mental exercises, postulated
+superhuman entities benign and malign and how to think about them; the jumbling
+of parts from fan-fiction, computer science, home-brewed philosophy and ARGs to
+create grotesque and interesting intellectual chimeras; Nick Bostrom, and a
+crew of very well funded philosophers; Effective Altruism, whose fancier
+adherents often prefer not to acknowledge the approach’s somewhat disreputable
+origins.
- All this would be sociologically fascinating, but of little real world
- consequence, if it hadn’t profoundly influenced the founders of the
- organizations pushing AI forward. These luminaries think about the
- technologies that they were creating in terms that they have borrowed
- wholesale from the Yudkowsky extended universe. The risks and rewards
- of AI are seen as largely commensurate with the risks and rewards of
- creating superhuman intelligences, modeling how they might behave, and
- ensuring that we end up in a Good Singularity, where AIs do not destroy
- or enslave humanity as a species, rather than a bad one.
+All this would be sociologically fascinating, but of little real world
+consequence, if it hadn’t profoundly influenced the founders of the
+organizations pushing AI forward. These luminaries think about the technologies
+that they were creating in terms that they have borrowed wholesale from the
+Yudkowsky extended universe. The risks and rewards of AI are seen as largely
+commensurate with the risks and rewards of creating superhuman intelligences,
+modeling how they might behave, and ensuring that we end up in a Good
+Singularity, where AIs do not destroy or enslave humanity as a species, rather
+than a bad one.
- Even if rationalism’s answers are uncompelling, it asks interesting
- questions that might have real human importance. However, it is at best
- unclear that theoretical debates about immantenizing the eschaton tell
- us very much about actually-existing “AI,” a family of important and
- sometimes very powerful statistical techniques, which are being applied
- today, with emphatically non-theoretical risks and benefits.
+Even if rationalism’s answers are uncompelling, it asks interesting questions
+that might have real human importance. However, it is at best unclear that
+theoretical debates about immantenizing the eschaton tell us very much about
+actually-existing “AI,” a family of important and sometimes very powerful
+statistical techniques, which are being applied today, with emphatically
+non-theoretical risks and benefits.
- Ah, well, nevertheless. The rationalist agenda has demonstrably shaped
- the questions around which the big AI ‘debates’ regularly revolve, as
- [16]demonstrated by the Rishi Sunak/Sam Altman/Elon Musk love-fest “AI
- Summit” in London a few weeks ago.
+Ah, well, nevertheless. The rationalist agenda has demonstrably shaped the
+questions around which the big AI ‘debates’ regularly revolve, as [44]
+demonstrated by the Rishi Sunak/Sam Altman/Elon Musk love-fest “AI Summit” in
+London a few weeks ago.
- We are on a very strange timeline. My laboured Dianetics/Scientology
- joke can be turned into an interesting hypothetical. It actually turns
- out (I only stumbled across this recently) that Claude Shannon, the
- creator of information theory (and, by extension, the computer
- revolution) was an [17]L. Ron Hubbard fan in later life. In our
- continuum, this didn’t affect his theories: he had already done his
- major work. Imagine, however, a parallel universe, where Shannon’s
- science and standom had become intertwined and wildly influential, so
- that debates in information science obsessed over whether we could
- eliminate the noise of our [18]engrams, and isolate the signal of our
- True Selves, allowing us all to become [19]Operating Thetans. Then
- reflect on how your imagination doesn’t have to work nearly as hard as
- it ought to. A similarly noxious blend of garbage ideas and actual
- science is the foundation stone of the Grand AI Risk Debates that are
- happening today.
+We are on a very strange timeline. My laboured Dianetics/Scientology joke can
+be turned into an interesting hypothetical. It actually turns out (I only
+stumbled across this recently) that Claude Shannon, the creator of information
+theory (and, by extension, the computer revolution) was an [45]L. Ron Hubbard
+fan in later life. In our continuum, this didn’t affect his theories: he had
+already done his major work. Imagine, however, a parallel universe, where
+Shannon’s science and standom had become intertwined and wildly influential, so
+that debates in information science obsessed over whether we could eliminate
+the noise of our [46]engrams, and isolate the signal of our True Selves,
+allowing us all to become [47]Operating Thetans. Then reflect on how your
+imagination doesn’t have to work nearly as hard as it ought to. A similarly
+noxious blend of garbage ideas and actual science is the foundation stone of
+the Grand AI Risk Debates that are happening today.
- To be clear - not everyone working on existential AI risk (or ‘x risk’
- as it is usually summarized) is a true believer in Strong Eliezer
- Rationalism. Most, very probably, are not. But you don’t need all that
- many true believers to keep the machine running. At least, that is how
- I interpret this [20]Shazeda Ahmed essay, which describes how some core
- precepts of a very strange set of beliefs have become normalized as the
- background assumptions for thinking about the promise and problems of
- AI. Even if you, as an AI risk person, don’t buy the full intellectual
- package, you find yourself looking for work in a field where the
- funding, the incentives, and the organizational structures mostly point
- in a single direction (NB - this is my jaundiced interpretation, not
- hers).
+To be clear - not everyone working on existential AI risk (or ‘x risk’ as it is
+usually summarized) is a true believer in Strong Eliezer Rationalism. Most,
+very probably, are not. But you don’t need all that many true believers to keep
+the machine running. At least, that is how I interpret this [48]Shazeda Ahmed
+essay, which describes how some core precepts of a very strange set of beliefs
+have become normalized as the background assumptions for thinking about the
+promise and problems of AI. Even if you, as an AI risk person, don’t buy the
+full intellectual package, you find yourself looking for work in a field where
+the funding, the incentives, and the organizational structures mostly point in
+a single direction (NB - this is my jaundiced interpretation, not hers).
- ********
+********
- There are two crucial differences between today’s AI cult and golden
- age Scientology. The first was already mentioned in passing. Machine
- learning works, and has some very important real life uses.
- [21]E-meters don’t work and are useless for any purpose other than
- fleecing punters.
+There are two crucial differences between today’s AI cult and golden age
+Scientology. The first was already mentioned in passing. Machine learning
+works, and has some very important real life uses. [49]E-meters don’t work and
+are useless for any purpose other than fleecing punters.
- The second (which is closely related) is that Scientology’s ideology
- and money-hustle reinforce each other. The more that you buy into
- stories about the evils of mainstream psychology, the baggage of
- engrams that is preventing you from reaching your true potential and so
- on and so on, the more you want to spend on Scientology counselling. In
- AI, in contrast, God and Money have a rather more tentative
- relationship. If you are profoundly worried about the risks of AI,
- should you be unleashing it on the world for profit? That tension helps
- explain the fight that has just broken out into the open.
+The second (which is closely related) is that Scientology’s ideology and
+money-hustle reinforce each other. The more that you buy into stories about the
+evils of mainstream psychology, the baggage of engrams that is preventing you
+from reaching your true potential and so on and so on, the more you want to
+spend on Scientology counselling. In AI, in contrast, God and Money have a
+rather more tentative relationship. If you are profoundly worried about the
+risks of AI, should you be unleashing it on the world for profit? That tension
+helps explain the fight that has just broken out into the open.
- It’s easy to forget that OpenAI was founded as an explicitly
- non-commercial entity, the better to balance the rewards and the risks
- of these new technologies. To quote from its [22]initial manifesto:
- It’s hard to fathom how much human-level AI could benefit society,
- and it’s equally hard to imagine how much it could damage society if
- built or used incorrectly. Because of AI’s surprising history, it’s
- hard to predict when human-level AI might come within reach. When it
- does, it’ll be important to have a leading research institution
- which can prioritize a good outcome for all over its
- own self-interest.
+It’s easy to forget that OpenAI was founded as an explicitly non-commercial
+entity, the better to balance the rewards and the risks of these new
+technologies. To quote from its [50]initial manifesto:
- We’re hoping to grow OpenAI into such an institution. As a
- non-profit, our aim is to build value for everyone rather than
- shareholders. Researchers will be strongly encouraged to publish
- their work, whether as papers, blog posts, or code, and our patents
- (if any) will be shared with the world. We’ll freely collaborate
- with others across many institutions and expect to work with
- companies to research and deploy new technologies.
+ It’s hard to fathom how much human-level AI could benefit society, and it’s
+ equally hard to imagine how much it could damage society if built or
+ used incorrectly. Because of AI’s surprising history, it’s hard to predict
+ when human-level AI might come within reach. When it does, it’ll be
+ important to have a leading research institution which can prioritize a
+ good outcome for all over its own self-interest.
- That … isn’t quite how it worked out. The Sam Altman justification for
- deviation from this vision, laid out in various interviews, is that it
- turned out to just be too damned expensive to train the models as they
- grew bigger, and bigger and bigger. This necessitated the creation of
- an add-on structure, which would sidle into profitable activity. It
- also required massive cash infusions from Microsoft (reportedly in
- [23]the range of $13 billion), which also has an exclusive license to
- OpenAI’s most recent LLM, GPT-4. Microsoft, it should be noted, is not
- in the business of prioritizing “a good outcome for all over its own
- self-interest.” It looks instead, to invest its resources along the
- very best Friedmanite principles, so as to create whopping returns for
- shareholders. And $13 billion is a lot of invested resources.
+ We’re hoping to grow OpenAI into such an institution. As a non-profit, our
+ aim is to build value for everyone rather than shareholders. Researchers
+ will be strongly encouraged to publish their work, whether as papers, blog
+ posts, or code, and our patents (if any) will be shared with the world.
+ We’ll freely collaborate with others across many institutions and expect to
+ work with companies to research and deploy new technologies.
- This, very plausibly explains the current crisis. OpenAI’s governance
- arrangements are shaped by the fact that it was a non-profit until
- relatively recently. The board is a non-profit board. The two members
- already mentioned, McCauley and Toner, are not the kind of people you
- would expect to see making the big decisions for a major commercial
- entity. They plausibly represent the older rationalist vision of what
- OpenAI was supposed to do, and the risks that it was supposed to avert.
+That … isn’t quite how it worked out. The Sam Altman justification for
+deviation from this vision, laid out in various interviews, is that it turned
+out to just be too damned expensive to train the models as they grew bigger,
+and bigger and bigger. This necessitated the creation of an add-on structure,
+which would sidle into profitable activity. It also required massive cash
+infusions from Microsoft (reportedly in [51]the range of $13 billion), which
+also has an exclusive license to OpenAI’s most recent LLM, GPT-4. Microsoft, it
+should be noted, is not in the business of prioritizing “a good outcome for all
+over its own self-interest.” It looks instead, to invest its resources along
+the very best Friedmanite principles, so as to create whopping returns for
+shareholders. And $13 billion is a lot of invested resources.
- But as OpenAI’s ambitions have grown, that vision has been watered down
- in favor of making money. I’ve heard that there were a lot of people in
- the AI community who were really unhappy with OpenAI’s initial decision
- to let GPT rip. That spurred the race for commercial domination of AI
- which has shaped pretty well everything that has happened since,
- leading to model after model being launched, and to hell with the
- consequences. People like Altman still talk about the dangers of AGI.
- But their organizations and businesses keep releasing more, and more
- powerful systems, which can be, and are being, used in all sorts of
- unanticipated ways, for good and for ill.
+This, very plausibly explains the current crisis. OpenAI’s governance
+arrangements are shaped by the fact that it was a non-profit until relatively
+recently. The board is a non-profit board. The two members already mentioned,
+McCauley and Toner, are not the kind of people you would expect to see making
+the big decisions for a major commercial entity. They plausibly represent the
+older rationalist vision of what OpenAI was supposed to do, and the risks that
+it was supposed to avert.
- It would perhaps be too cynical to say that AGI existential risk
- rhetoric has become a cynical hustle, intended to redirect the
- attentions of regulators toward possibly imaginary future risks in the
- future, and away from problematic but profitable activities that are
- happening right now. Human beings have an enormous capacity to
- fervently believe in things that it is in their self-interest to
- believe, and to update those beliefs as the interests change or become
- clearer. I wouldn’t be surprised at all if Altman sincerely thinks that
- he is still acting for the good of humankind (there are certainly
- enough people assuring him that he is). But it isn’t surprising either
- that the true believers are revolting, as Altman stretches their
- ideology ever further and thinner to facilitate raking in the
- benjamins.
+But as OpenAI’s ambitions have grown, that vision has been watered down in
+favor of making money. I’ve heard that there were a lot of people in the AI
+community who were really unhappy with OpenAI’s initial decision to let GPT
+rip. That spurred the race for commercial domination of AI which has shaped
+pretty well everything that has happened since, leading to model after model
+being launched, and to hell with the consequences. People like Altman still
+talk about the dangers of AGI. But their organizations and businesses keep
+releasing more, and more powerful systems, which can be, and are being, used in
+all sorts of unanticipated ways, for good and for ill.
- The OpenAI saga is a fight between God and Money; between a quite
- peculiar quasi-religious movement, and a quite ordinary desire to make
- cold hard cash. You should probably be putting your bets on Money
- prevailing in whatever strange arrangement of forces is happening as
- Altman is beamed up into the Microsoft mothership. But we might not be
- all that better off in this particular case if the forces of God were
- to prevail, and the rationalists who toppled Altman were to win a
- surprising victory. They want to slow down AI, which is good, but for
- all sorts of weird reasons, which are unlikely to provide good
- solutions for the actual problems that AI generates. The important
- questions about AI are the ones that neither God or [24]Mammon has
- particularly good answers for - but that’s a topic for future posts.
+It would perhaps be too cynical to say that AGI existential risk rhetoric has
+become a cynical hustle, intended to redirect the attentions of regulators
+toward possibly imaginary future risks in the future, and away from problematic
+but profitable activities that are happening right now. Human beings have an
+enormous capacity to fervently believe in things that it is in their
+self-interest to believe, and to update those beliefs as the interests change
+or become clearer. I wouldn’t be surprised at all if Altman sincerely thinks
+that he is still acting for the good of humankind (there are certainly enough
+people assuring him that he is). But it isn’t surprising either that the true
+believers are revolting, as Altman stretches their ideology ever further and
+thinner to facilitate raking in the benjamins.
- Thanks for reading Programmable Mutter! Subscribe for free to receive
- new posts. And if you want to support my work, [25]buy my and Abe
- Newman’s new book, [26]Underground Empire, and sing its praises (as
- long as you actually liked it) on Amazon, Goodreads, social media and
- everywhere else that people find out about good books.
- ____________________
- (BUTTON) Subscribe
- 73
- (BUTTON)
- Share this post
+The OpenAI saga is a fight between God and Money; between a quite peculiar
+quasi-religious movement, and a quite ordinary desire to make cold hard cash.
+You should probably be putting your bets on Money prevailing in whatever
+strange arrangement of forces is happening as Altman is beamed up into the
+Microsoft mothership. But we might not be all that better off in this
+particular case if the forces of God were to prevail, and the rationalists who
+toppled Altman were to win a surprising victory. They want to slow down AI,
+which is good, but for all sorts of weird reasons, which are unlikely to
+provide good solutions for the actual problems that AI generates. The important
+questions about AI are the ones that neither God or [52]Mammon has particularly
+good answers for - but that’s a topic for future posts.
+
+Thanks for reading Programmable Mutter! Subscribe for free to receive new
+posts. And if you want to support my work, [53]buy my and Abe Newman’s new
+book, [54]Underground Empire, and sing its praises (as long as you actually
+liked it) on Amazon, Goodreads, social media and everywhere else that people
+find out about good books.
+
+[63][ ]
+Subscribe
+73
+Share this post
+[https]
What OpenAI shares with Scientology
- www.programmablemutter.com
- (BUTTON)
- Copy link
- (BUTTON)
- Facebook
- (BUTTON)
- Email
- (BUTTON)
- Note
- (BUTTON)
- Other
- 17
- Share
- 17 Comments
-
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- ____________________________________________________________
- (BUTTON)
- Share this discussion
+www.programmablemutter.com
+Copy link
+Facebook
+Email
+Note
+Other
+[71]
+17
+[72]
+Share
+17 Comments
+[https]
+[ ]
+Share this discussion
+[https]
What OpenAI shares with Scientology
- www.programmablemutter.com
- (BUTTON)
- Copy link
- (BUTTON)
- Facebook
- (BUTTON)
- Email
- (BUTTON)
- Note
- (BUTTON)
- Other
- Tarik Najeddine
- [27]Writes Factual Dispatch
- [28]Nov 20, 2023
+www.programmablemutter.com
+Copy link
+Facebook
+Email
+Note
+Other
- ChatGPT is just Zapp Brannigan or a McKinsey consultant. A veneer of
- confidence and a person to blame when the executive "needs" to make a
- hard decision. You previously blamed the Bain consultants when you
- offshored a factory, now you blame AI.
- Expand full comment
- Reply
- Share
- (BUTTON)
- Gerben Wierda
- [29]Nov 21, 2023·edited Nov 21, 2023
+ [81]
+ Tarik Najeddine
+ [82]Writes Factual Dispatch
+ [83]Nov 20, 2023
- Came here via Dave Karpf's link. Beautiful stuff, and "The Singularity
- is Nigh" made me laugh out loud.
+[80] ChatGPT is just Zapp Brannigan or a McKinsey consultant. A veneer of
+[https] confidence and a person to blame when the executive "needs" to make a
+ hard decision. You previously blamed the Bain consultants when you
+ offshored a factory, now you blame AI.
- The psychological and sociological/cultural side of the current
- GPT-fever is indeed far more important and telling than the technical
- reality. Short summary: quantity has its own certain quality, but the
- systems may be impressive, we humans are impressionable.
+ Expand full comment
+ Reply
+ Share
- Recently, Sam Altman received a Hawking Fellowship for the OpenAI Team
- and he spoke for a few minutes followed by a Q&A (available on
- YouTube). In that session he was asked what are important qualities for
- 'founders' of these innovative tech firms. He answered that founders
- should have ‘deeply held convictions’ that are stable without a lot of
- ‘positive external reinforcement’, ‘obsession’ with a problem, and a
- ‘super powerful internal drive’. They needed to be an 'evangelist'. The
- link with religion shows here too.
- ([30]https://erikjlarson.substack.com/p/gerben-wierda-on-chatgpt-altman
- -and). TED just released Ilya Sutskever’s talk and you see it there
- too. We have strong believers turned evangelists and we have a world of
- disciples and followers. It is indeed a very good analogy.
- Expand full comment
- Reply
- Share
- (BUTTON)
- [31]15 more comments...
- Top
- New
- Community
+ [86]
+ Gerben Wierda
+ [87]Nov 21, 2023·edited Nov 21, 2023
- No posts
+ Came here via Dave Karpf's link. Beautiful stuff, and "The Singularity
+ is Nigh" made me laugh out loud.
- Ready for more?
- ____________________
- (BUTTON) Subscribe
- © 2024 Henry Farrell
- [32]Privacy ∙ [33]Terms ∙ [34]Collection notice
- Start Writing[35]Get the app
- [36]Substack is the home for great writing
+ The psychological and sociological/cultural side of the current
+ GPT-fever is indeed far more important and telling than the technical
+ reality. Short summary: quantity has its own certain quality, but the
+ systems may be impressive, we humans are impressionable.
- This site requires JavaScript to run correctly. Please [37]turn on
- JavaScript or unblock scripts
+ Recently, Sam Altman received a Hawking Fellowship for the OpenAI Team
+[85] and he spoke for a few minutes followed by a Q&A (available on
+[https] YouTube). In that session he was asked what are important qualities for
+ 'founders' of these innovative tech firms. He answered that founders
+ should have ‘deeply held convictions’ that are stable without a lot of
+ ‘positive external reinforcement’, ‘obsession’ with a problem, and a
+ ‘super powerful internal drive’. They needed to be an 'evangelist'. The
+ link with religion shows here too. ([88]https://
+ erikjlarson.substack.com/p/gerben-wierda-on-chatgpt-altman-and). TED
+ just released Ilya Sutskever’s talk and you see it there too. We have
+ strong believers turned evangelists and we have a world of disciples
+ and followers. It is indeed a very good analogy.
-References
+ Expand full comment
+ Reply
+ Share
- Visible links:
- 1. https://www.programmablemutter.com/feed
- 2. https://www.programmablemutter.com/
- 3. https://www.programmablemutter.com/
- 4. https://substack.com/@henryfarrell
- 5. https://www.nytimes.com/2023/11/18/technology/open-ai-sam-altman-what-happened.html
- 6. https://www.ft.com/content/54e36c93-08e5-4a9e-bda6-af673c3e9bb5
- 7. https://amzn.to/3PbIyqX
- 8. https://amzn.to/3PbIyqX
- 9. https://www.ft.com/content/54e36c93-08e5-4a9e-bda6-af673c3e9bb5
- 10. https://longreads.com/2017/02/01/xenus-paradox-the-fiction-of-l-ron-hubbard/
- 11. https://ansible.uk/ai/pcwplus/pcwp1987.html
- 12. https://edoras.sdsu.edu/~vinge/misc/singularity.html
- 13. https://www.heraldscotland.com/life_style/arts_ents/14479010.science-fiction-writer-ken-macleod-free-presbyterian-childhood-time-communist-party-member-future-humanity/
- 14. https://www.lesswrong.com/tag/rokos-basilisk
- 15. https://en.wikipedia.org/wiki/Eliezer_Yudkowsky
- 16. https://www.politico.eu/article/rishi-sunak-artificial-intelligence-pivot-safety-summit-united-kingdom-silicon-valley-effective-altruism/
- 17. https://longreads.com/2018/10/23/the-dawn-of-dianetics-l-ron-hubbard-john-w-campbell-and-the-origins-of-scientology/
- 18. https://en.wikipedia.org/wiki/Engram_(Dianetics)
- 19. https://en.wikipedia.org/wiki/Operating_Thetan
- 20. https://crookedtimber.org/2023/11/16/from-algorithmic-monoculture-to-epistemic-monoculture-understanding-the-rise-of-ai-safety/
- 21. https://en.wikipedia.org/wiki/E-meter
- 22. https://openai.com/blog/introducing-openai
- 23. https://www.bloomberg.com/news/newsletters/2023-06-15/how-chatgpt-openai-made-microsoft-an-ai-tech-giant-big-take
- 24. https://www.newadvent.org/cathen/09580b.htm
- 25. https://amzn.to/3PbIyqX
- 26. https://amzn.to/3PbIyqX
- 27. https://factualdispatch.substack.com/?utm_source=substack&utm_medium=web&utm_content=comment_metadata
- 28. https://www.programmablemutter.com/p/look-at-scientology-to-understand/comment/43988738
- 29. https://www.programmablemutter.com/p/look-at-scientology-to-understand/comment/44033603
- 30. https://erikjlarson.substack.com/p/gerben-wierda-on-chatgpt-altman-and
- 31. https://www.programmablemutter.com/p/look-at-scientology-to-understand/comments
- 32. https://substack.com/privacy
- 33. https://substack.com/tos
- 34. https://substack.com/ccpa#personal-data-collected
- 35. https://substack.com/app/app-store-redirect?utm_campaign=app-marketing&utm_content=web-footer-button
- 36. https://substack.com/
- 37. https://enable-javascript.com/
+[90]15 more comments...
+Top
+New
+Community
- Hidden links:
- 39. https://substack.com/profile/557668-henry-farrell
- 40. https://www.programmablemutter.com/p/look-at-scientology-to-understand/comments
- 41. javascript:void(0)
- 42. https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F555fe47f-ac07-4614-b78b-5d269fde7539_1024x1024.webp
- 43. https://www.programmablemutter.com/p/look-at-scientology-to-understand/comments
- 44. javascript:void(0)
- 45. https://substack.com/profile/1263175-tarik-najeddine
- 46. https://substack.com/profile/1263175-tarik-najeddine
- 47. https://substack.com/profile/23165546-gerben-wierda
- 48. https://substack.com/profile/23165546-gerben-wierda
- 49. https://substack.com/signup?utm_source=substack&utm_medium=web&utm_content=footer
+No posts
+
+Ready for more?
+
+[99][ ]
+Subscribe
+© 2024 Henry Farrell
+[101]Privacy ∙ [102]Terms ∙ [103]Collection notice
+[104] Start Writing[105]Get the app
+[106]Substack is the home for great writing
+This site requires JavaScript to run correctly. Please [107]turn on JavaScript
+or unblock scripts
+
+References:
+
+[1] https://www.programmablemutter.com/
+[2] https://www.programmablemutter.com/
+[12] https://substack.com/profile/557668-henry-farrell
+[13] https://substack.com/@henryfarrell
+[20] https://www.programmablemutter.com/p/look-at-scientology-to-understand/comments
+[21] javascript:void(0)
+[22] https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F555fe47f-ac07-4614-b78b-5d269fde7539_1024x1024.webp
+[23] https://www.nytimes.com/2023/11/18/technology/open-ai-sam-altman-what-happened.html
+[24] https://www.ft.com/content/54e36c93-08e5-4a9e-bda6-af673c3e9bb5
+[25] https://amzn.to/3PbIyqX
+[26] https://amzn.to/3PbIyqX
+[37] https://www.ft.com/content/54e36c93-08e5-4a9e-bda6-af673c3e9bb5
+[38] https://longreads.com/2017/02/01/xenus-paradox-the-fiction-of-l-ron-hubbard/
+[39] https://ansible.uk/ai/pcwplus/pcwp1987.html
+[40] https://edoras.sdsu.edu/~vinge/misc/singularity.html
+[41] https://www.heraldscotland.com/life_style/arts_ents/14479010.science-fiction-writer-ken-macleod-free-presbyterian-childhood-time-communist-party-member-future-humanity/
+[42] https://www.lesswrong.com/tag/rokos-basilisk
+[43] https://en.wikipedia.org/wiki/Eliezer_Yudkowsky
+[44] https://www.politico.eu/article/rishi-sunak-artificial-intelligence-pivot-safety-summit-united-kingdom-silicon-valley-effective-altruism/
+[45] https://longreads.com/2018/10/23/the-dawn-of-dianetics-l-ron-hubbard-john-w-campbell-and-the-origins-of-scientology/
+[46] https://en.wikipedia.org/wiki/Engram_(Dianetics)
+[47] https://en.wikipedia.org/wiki/Operating_Thetan
+[48] https://crookedtimber.org/2023/11/16/from-algorithmic-monoculture-to-epistemic-monoculture-understanding-the-rise-of-ai-safety/
+[49] https://en.wikipedia.org/wiki/E-meter
+[50] https://openai.com/blog/introducing-openai
+[51] https://www.bloomberg.com/news/newsletters/2023-06-15/how-chatgpt-openai-made-microsoft-an-ai-tech-giant-big-take
+[52] https://www.newadvent.org/cathen/09580b.htm
+[53] https://amzn.to/3PbIyqX
+[54] https://amzn.to/3PbIyqX
+[71] https://www.programmablemutter.com/p/look-at-scientology-to-understand/comments
+[72] javascript:void(0)
+[80] https://substack.com/profile/1263175-tarik-najeddine
+[81] https://substack.com/profile/1263175-tarik-najeddine
+[82] https://factualdispatch.substack.com/?utm_source=substack&utm_medium=web&utm_content=comment_metadata
+[83] https://www.programmablemutter.com/p/look-at-scientology-to-understand/comment/43988738
+[85] https://substack.com/profile/23165546-gerben-wierda
+[86] https://substack.com/profile/23165546-gerben-wierda
+[87] https://www.programmablemutter.com/p/look-at-scientology-to-understand/comment/44033603
+[88] https://erikjlarson.substack.com/p/gerben-wierda-on-chatgpt-altman-and
+[90] https://www.programmablemutter.com/p/look-at-scientology-to-understand/comments
+[101] https://substack.com/privacy
+[102] https://substack.com/tos
+[103] https://substack.com/ccpa#personal-data-collected
+[104] https://substack.com/signup?utm_source=substack&utm_medium=web&utm_content=footer
+[105] https://substack.com/app/app-store-redirect?utm_campaign=app-marketing&utm_content=web-footer-button
+[106] https://substack.com/
+[107] https://enable-javascript.com/
diff --git a/static/archive/www-robinsloan-com-sbm0vr.txt b/static/archive/www-robinsloan-com-sbm0vr.txt
index 745bb84..0d337a0 100644
--- a/static/archive/www-robinsloan-com-sbm0vr.txt
+++ b/static/archive/www-robinsloan-com-sbm0vr.txt
@@ -1,39 +1,34 @@
- #[1]next [2]alternate
+[1]Home [2]About [3]Moonbound From: Robin Sloan
+To: the lab
+Sent: March 2023
- [3]Home [4]About [5]Moonbound
+Phase change
- From: Robin Sloan
- To: the lab
- Sent: March 2023
+An extremely close-up photograph of a snowflake, looking almost architectural.
+[4]Snowflake, Wilson Bentley, ca. 1910
- Phase change
+Earlier this week, in [5]my main newsletter, I praised a new project from Matt
+Webb. Here, I want to come at it from a different angle.
- An extremely close-up photograph of a snowflake, looking almost
- architectural. [6]Snowflake, Wilson Bentley, ca. 1910
+Briefly: Matt has built the [6]Braggoscope, a fun and useful application for
+exploring the archives of the beloved BBC radio show In Our Time, hosted by the
+inimitable Melvyn Bragg.
- Earlier this week, in [7]my main newsletter, I praised a new project
- from Matt Webb. Here, I want to come at it from a different angle.
+In Our Time only provides HTML pages for each episode — there’s no structured
+data, no sense of “episode X is connected to episode Y because of shared
+feature Z”.
- Briefly: Matt has built the [8]Braggoscope, a fun and useful
- application for exploring the archives of the beloved BBC radio show In
- Our Time, hosted by the inimitable Melvyn Bragg.
+As Matt explains [7]in his write-up, he fed the plain-language content of each
+episode page into the GPT-3 API, cleverly prompting it to extract basic
+metadata, along with a few subtler properties — including a Dewey
+Decimal number!?
- In Our Time only provides HTML pages for each episode — there’s no
- structured data, no sense of “episode X is connected to episode Y
- because of shared feature Z”.
+(Explaining how and why a person might prompt a language model is beyond the
+scope of this newsletter; you can [8]read up about it here.)
- As Matt explains [9]in his write-up, he fed the plain-language content
- of each episode page into the GPT-3 API, cleverly prompting it to
- extract basic metadata, along with a few subtler properties — including
- a Dewey Decimal number!?
+Here’s [9]a bit of Matt’s prompt:
- (Explaining how and why a person might prompt a language model is
- beyond the scope of this newsletter; you can [10]read up about it
- here.)
-
- Here’s [11]a bit of Matt’s prompt:
-Extract the description and a list of guests from the supplied episode notes fro
-m a podcast.
+Extract the description and a list of guests from the supplied episode notes from a podcast.
Also provide a Dewey Decimal Classification code and label for the description
@@ -51,259 +46,244 @@ Episode synopsis (Markdown):
Valid JSON:
- Important to say: it doesn’t work perfectly. Matt reports that GPT-3
- doesn’t always return valid JSON, and if you browse the Braggoscope,
- you’ll find plenty of questionable filing choices.
+Important to say: it doesn’t work perfectly. Matt reports that GPT-3 doesn’t
+always return valid JSON, and if you browse the Braggoscope, you’ll find plenty
+of questionable filing choices.
- And yet! What a technique. (Matt credits Noah Brier for [12]the
- insight.)
+And yet! What a technique. (Matt credits Noah Brier for [10]the insight.)
- It fits into a pattern I’ve noticed: while the buzzy application of the
- GPT-alikes is chat, the real workhorse might be text transformation.
+It fits into a pattern I’ve noticed: while the buzzy application of the
+GPT-alikes is chat, the real workhorse might be text transformation.
- As Matt writes:
+As Matt writes:
- Sure Google is all-in on AI in products, announcing chatbots to
- compete with ChatGPT, and synthesised text in the search engine.
- BUT.
+ Sure Google is all-in on AI in products, announcing chatbots to compete
+ with ChatGPT, and synthesised text in the search engine. BUT.
- Using GPT-3 as a function call.
+ Using GPT-3 as a function call.
- Using GPT-3 as a universal coupling.
+ Using GPT-3 as a universal coupling.
- It brings a lot within reach.
+ It brings a lot within reach.
- I think the magnitude of this shift … I would say it’s on the order
- of the web from the mid 90s? There was a radical simplification and
- democratisation of software (architecture, development, deployment,
- use) that took decades to really unfold.
+ I think the magnitude of this shift … I would say it’s on the order of the
+ web from the mid 90s? There was a radical simplification and democratisa
+ tion of software (architecture, development, deployment, use) that took
+ decades to really unfold.
- For me, 2022 and 2023 have presented two thick strands of inquiry: the
- web and AI, AI and the web. This is evidenced by the structure of these
- lab newsletters, which have tended towards birfucation.
+For me, 2022 and 2023 have presented two thick strands of inquiry: the web and
+AI, AI and the web. This is evidenced by the structure of these lab
+newsletters, which have tended towards birfucation.
- Matt’s thinking is interesting to me because it brings the
- strands together.
+Matt’s thinking is interesting to me because it brings the strands together.
- One of the pleasures of HTTP (the original version) is that it’s almost
- plain language, though a very simple kind. You can execute an HTTP
- request “by hand”: telnet www.google.com 80 followed by GET /.
+One of the pleasures of HTTP (the original version) is that it’s almost plain
+language, though a very simple kind. You can execute an HTTP request “by hand”:
+telnet www.google.com 80 followed by GET /.
- Language models as universal couplers begin to suggest protocols that
- really are plain language. What if the protocol of the GPT-alikes is
- just a bare TCP socket carrying free-form requests and instructions?
- What if the RSS feed of the future is simply my language model replying
- to yours when it asks, “What’s up with Robin lately?”
+Language models as universal couplers begin to suggest protocols that really
+are plain language. What if the protocol of the GPT-alikes is just a bare TCP
+socket carrying free-form requests and instructions? What if the RSS feed of
+the future is simply my language model replying to yours when it asks, “What’s
+up with Robin lately?”
- I like this because I hate it; because it’s weird, and makes me
- feel uncomfortable.
- __________________________________________________________________
+I like this because I hate it; because it’s weird, and makes me
+feel uncomfortable.
- I think it’s really challenging to find the appropriate stance towards
- this stuff.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- On one hand, I find critical deflation, of the kind you’ll hear from
- Ted Chiang, Simon Willison, and Claire Leibowicz in [13]this recent
- episode of KQED Forum, appropriate and useful. The hype is so powerful
- that any corrective is welcome.
+I think it’s really challenging to find the appropriate stance towards
+this stuff.
- However! On the critical side, the evaluation of what’s before us isn’t
- sufficient; not even close. If we demand humility from AI engineers,
- then we ought to match it with imagination.
+On one hand, I find critical deflation, of the kind you’ll hear from Ted
+Chiang, Simon Willison, and Claire Leibowicz in [11]this recent episode of KQED
+Forum, appropriate and useful. The hype is so powerful that any corrective
+is welcome.
- An important fact about these language models — one that sets them
- apart from, say, the personal computer, or the iPhone — is that their
- capabilities have been surprising, often confounding, even to
- their creators.
+However! On the critical side, the evaluation of what’s before us isn’t
+sufficient; not even close. If we demand humility from AI engineers, then we
+ought to match it with imagination.
- AI at this moment feels like a mash-up of programming and biology. The
- programming part is obvious; the biology part becomes apparent when you
- see [14]AI engineers probing their own creations the way you might
- probe a mouse in a lab.
+An important fact about these language models — one that sets them apart from,
+say, the personal computer, or the iPhone — is that their capabilities have
+been surprising, often confounding, even to their creators.
- The simple fact is: even at the highest levels of theory and practice,
- no one knows how these language models are doing what they’re doing.
+AI at this moment feels like a mash-up of programming and biology. The program
+ming part is obvious; the biology part becomes apparent when you see [12]AI
+engineers probing their own creations the way you might probe a mouse in a lab.
- Over the past few years, in the evolution from GPT-2-alikes to
- GPT-3-alikes and beyond, it’s become clear that the “returns to
- scale”—both in terms of (1) a model’s size and (2) the scope of its
- training data — are exponential and nonlinear. Simply adding more works
- better, and works weirder, than it should.
+The simple fact is: even at the highest levels of theory and practice, no one
+knows how these language models are doing what they’re doing.
- The nonlinearity is, to me, the most interesting part. As these models
- have grown, they have undergone widely observed “phase changes” in
- capability, just as sudden and surprising as water frozen or
- cream whipped.
+Over the past few years, in the evolution from GPT-2-alikes to GPT-3-alikes and
+beyond, it’s become clear that the “returns to scale”—both in terms of (1) a
+model’s size and (2) the scope of its training data — are exponential and
+nonlinear. Simply adding more works better, and works weirder, than it should.
- At the moment, my deepest engagement with a language model is in a
- channel on a Discord server, where our gallant host has set up a
- ChatGPT-powered bot and laced a simple personality into its prompt. The
- sociability has been a revelation — multiplayer ChatGPT is much, MUCH
- more fun than single player — and, of course, the conversation tends
- towards goading the bot, testing its boundaries, luring it
- into absurdities.
+The nonlinearity is, to me, the most interesting part. As these models have
+grown, they have undergone widely observed “phase changes” in capability, just
+as sudden and surprising as water frozen or cream whipped.
- The bot writes poems, sure, and song lyrics, and movie scenes.
+At the moment, my deepest engagement with a language model is in a channel on a
+Discord server, where our gallant host has set up a ChatGPT-powered bot and
+laced a simple personality into its prompt. The sociability has been a
+revelation — multiplayer ChatGPT is much, MUCH more fun than single player —
+and, of course, the conversation tends towards goading the bot, testing its
+boundaries, luring it into absurdities.
- The bot also produces ASCII art, and SVG code, and [15]PICO-8 programs,
- though they don’t always run.
+The bot writes poems, sure, and song lyrics, and movie scenes.
- I find myself deeply ambivalent, in the original sense of: thinking
- many things at once. I’m very aware of the bot’s limitations, but/and
- I find myself stunned by its fluency, its range.
+The bot also produces ASCII art, and SVG code, and [13]PICO-8 programs, though
+they don’t always run.
- Listen: you can be a skeptic. In some ways, I am! But these phase
- changes have happened, and that probably means they will keep
- happening, and no one knows (the AI engineers least of all) what might
- suddenly become possible.
+I find myself deeply ambivalent, in the original sense of: thinking many things
+at once. I’m very aware of the bot’s limitations, but/and I find myself stunned
+by its fluency, its range.
- As ever, [16]Jack Clark is my guide. He’s a journalist turned AI
- practioner, involved in policy and planning at the highest levels,
- first at OpenAI, now at Anthropic. And if he’s no longer a
- disinterested observer, he remains deeply grounded and moral, which
- makes me trust him when he says, with confidence: this is the biggest
- thing going, and we had all better brace for weird times ahead.
- __________________________________________________________________
+Listen: you can be a skeptic. In some ways, I am! But these phase changes have
+happened, and that probably means they will keep happening, and no one knows
+(the AI engineers least of all) what might suddenly become possible.
- What does that mean, to brace for it?
+As ever, [14]Jack Clark is my guide. He’s a journalist turned AI practioner,
+involved in policy and planning at the highest levels, first at OpenAI, now at
+Anthropic. And if he’s no longer a disinterested observer, he remains deeply
+grounded and moral, which makes me trust him when he says, with confidence:
+this is the biggest thing going, and we had all better brace for weird
+times ahead.
- I’ve found it helpful, these past few years, to frame my anxieties and
- dissatisfactions as questions. For example, fed up with the state of
- social media, [17]I asked: what do I want from the internet, anyway?
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- It turns out I had an answer to that question.
+What does that mean, to brace for it?
- Where the GPT-alikes are concerned, a question that’s emerging for
- me is:
+I’ve found it helpful, these past few years, to frame my anxieties and dissatis
+factions as questions. For example, fed up with the state of social media, [15]
+I asked: what do I want from the internet, anyway?
- What could I do with a universal function — a tool for turning just
- about any X into just about any Y with plain language instructions?
+It turns out I had an answer to that question.
- I don’t pose that question with any sense of wide-eyed expectation; a
- reasonable answer might be, nothing much. Not everything in the world
- depends on the transformation of symbols. But I think that IS the
- question, and I think it takes some legitimate work, some strenuous
- imagination, to push yourself to believe it really will be “just about
- any X” into “just about any Y”.
+Where the GPT-alikes are concerned, a question that’s emerging for me is:
- I help operate [18]a small olive oil company, and I have spent a bit of
- time lately considering this question in the context of our business.
- What might a GPT-alike do for us? What might an even more capable
- system do?
+What could I do with a universal function — a tool for turning just about any X
+into just about any Y with plain language instructions?
- My answer, so far, is indeed: nothing much! It’s a physical business,
- after all, mainly concerned with moving and transforming matter. The
- “obvious” application is customer support, which I handle myself, and
- which I am unwilling to cede to a computer or, indeed, anyone who isn’t
- me. The specific quality and character of our support is important.
+I don’t pose that question with any sense of wide-eyed expectation; a reason
+able answer might be, nothing much. Not everything in the world depends on the
+transformation of symbols. But I think that IS the question, and I think it
+takes some legitimate work, some strenuous imagination, to push yourself to
+believe it really will be “just about any X” into “just about any Y”.
- (As an aside: every customer support request I receive is a miniature
- puzzle, usually requiring deduction across several different systems.
- Many of these puzzles are challenging even to the general intelligence
- that is me; if it comes to pass that a GPT-alike can handle them
- without breaking a sweat, I will be very, very impressed.)
+I help operate [16]a small olive oil company, and I have spent a bit of time
+lately considering this question in the context of our business. What might a
+GPT-alike do for us? What might an even more capable system do?
- (Of course, it’s not going to happen like that, is it? Long before
- GPT-alikes can solve the same problems Robin can, using the tools Robin
- has, the problems themselves will change to meet the GPT-alikes
- halfway. The systems will all learn to “speak GPT”, in some sense.)
+My answer, so far, is indeed: nothing much! It’s a physical business, after
+all, mainly concerned with moving and transforming matter. The “obvious” appli
+cation is customer support, which I handle myself, and which I am unwilling to
+cede to a computer or, indeed, anyone who isn’t me. The specific quality and
+character of our support is important.
- The simple act of asking and answering the question was clarifying and
- calming. It plucked AI out of the realm of abstract dread and plunked
- it down on the workbench.
- __________________________________________________________________
+(As an aside: every customer support request I receive is a miniature puzzle,
+usually requiring deduction across several different systems. Many of these
+puzzles are challenging even to the general intelligence that is me; if it
+comes to pass that a GPT-alike can handle them without breaking a sweat, I will
+be very, very impressed.)
- Jack Clark includes, in all of his AI newsletters, a piece of original
- micro-fiction. One of them, [19]sent in December, has stayed with me.
- I’ll reproduce it here in full:
+(Of course, it’s not going to happen like that, is it? Long before GPT-alikes
+can solve the same problems Robin can, using the tools Robin has, the problems
+themselves will change to meet the GPT-alikes halfway. The systems will all
+learn to “speak GPT”, in some sense.)
- Reality Authentication
+The simple act of asking and answering the question was clarifying and calming.
+It plucked AI out of the realm of abstract dread and plunked it down on
+the workbench.
- [The internet, 2034]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- “To login, spit into the bio-API”
+Jack Clark includes, in all of his AI newsletters, a piece of original
+micro-fiction. One of them, [17]sent in December, has stayed with me. I’ll
+reproduce it here in full:
- I took a sip of water and swirled it around my mouth a bit, then
- hawked some spit into the little cup on my desk, put its lid on,
- then flipped over the receptacle and plugged it into the
- bio-API system.
+ Reality Authentication
- “Authenticating … authentication successful, human-user identified.
- Enjoy your time on the application!”
+ [The internet, 2034]
- I spent a couple of hours logged-on, doing a mixture of work and
- pleasure. I was part of an all-human gaming league called the
- No-Centaurs; we came second in a mini tournament. I also talked to
- my therapist sans his augment, and I sent a few emails over the
- BioNet protocol.
+ “To login, spit into the bio-API”
- When I logged out, I went back to the regular internet. Since the AI
- models had got minituarized and proliferated a decade ago, the
- internet had radically changed. For one thing, it was so much faster
- now. It was also dangerous in ways it hadn’t been before - Attention
- Harvesters were everywhere and the only reason I was confident in my
- browsing was I’d paid for a few protection programs.
+ I took a sip of water and swirled it around my mouth a bit, then hawked
+ some spit into the little cup on my desk, put its lid on, then flipped over
+ the receptacle and plugged it into the bio-API system.
- I think “brace for it” might mean imagining human-only spaces, online
- and off. We might be headed, paradoxically, for a golden age of “get
- that robot out of my face”.
+ “Authenticating … authentication successful, human-user identified. Enjoy
+ your time on the application!”
- In the extreme case, if AI doesn’t wreck the world, language models
- could certainly wreck the internet, like Jack’s Attention Harvesters
- above. Maybe we’ll look back at the Web Parenthesis, 1990-2030. It was
- weird and fun, though no one in the future will quite understand
- the appeal.
+ I spent a couple of hours logged-on, doing a mixture of work and pleasure.
+ I was part of an all-human gaming league called the No-Centaurs; we came
+ second in a mini tournament. I also talked to my therapist sans his
+ augment, and I sent a few emails over the BioNet protocol.
- We are living and thinking together in an interesting time. My
- recommendation is to avoid chasing the ball of AI around the field,
- always a step behind. Instead, set your stance a little wider and form
- a question that actually matters to you.
+ When I logged out, I went back to the regular internet. Since the AI models
+ had got minituarized and proliferated a decade ago, the internet had
+ radically changed. For one thing, it was so much faster now. It was also
+ dangerous in ways it hadn’t been before - Attention Harvesters were every
+ where and the only reason I was confident in my browsing was I’d paid for a
+ few protection programs.
- It might be as simple as: is this kind of capability, extrapolated
- forward, useful to me and my work? If so, how?
+I think “brace for it” might mean imagining human-only spaces, online and off.
+We might be headed, paradoxically, for a golden age of “get that robot out of
+my face”.
- It might be as wacky as: what kind of protocol could I build around
- plain language, the totally sci-fi vision of computers just TALKING to
- each other?
+In the extreme case, if AI doesn’t wreck the world, language models could
+certainly wreck the internet, like Jack’s Attention Harvesters above. Maybe
+we’ll look back at the Web Parenthesis, 1990-2030. It was weird and fun, though
+no one in the future will quite understand the appeal.
- It might even be my original question, or a version of it: what do
- I want from the internet, anyway?
+We are living and thinking together in an interesting time. My recommendation
+is to avoid chasing the ball of AI around the field, always a step behind.
+Instead, set your stance a little wider and form a question that actually
+matters to you.
- From Oakland,
+It might be as simple as: is this kind of capability, extrapolated forward,
+useful to me and my work? If so, how?
- Robin
+It might be as wacky as: what kind of protocol could I build around plain
+language, the totally sci-fi vision of computers just TALKING to each other?
- March 2023, Oakland
+It might even be my original question, or a version of it: what do I want from
+the internet, anyway?
- I'm [20]Robin Sloan, a fiction writer. You can sign up for my
- lab newsletter:
- ____________________ Subscribe
+From Oakland,
- This website doesn’t collect any information about you or your reading.
- It aspires to the speed and privacy of the printed page.
+Robin
- Don’t miss [21]the colophon. Hony soyt qui mal pence
+March 2023, Oakland
-References
+I'm [18]Robin Sloan, a fiction writer. You can sign up for my lab newsletter:
- 1. https://www.robinsloan.com/confirm/main/subscribe/
- 2. https://www.robinsloan.com/feed.xml
- 3. https://www.robinsloan.com/
- 4. https://www.robinsloan.com/about/
- 5. https://www.robinsloan.com/moonbound/
- 6. https://publicdomainreview.org/essay/the-snowflake-man-of-vermont?utm_source=Robin_Sloan_sent_me
- 7. https://www.robinsloan.com/newsletters/ring-got-good/?utm_source=Robin_Sloan_sent_me
- 8. https://genmon.github.io/braggoscope/?utm_source=Robin_Sloan_sent_me
- 9. https://interconnected.org/home/2023/02/07/braggoscope?utm_source=Robin_Sloan_sent_me
- 10. https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api?utm_source=Robin_Sloan_sent_me
- 11. https://news.ycombinator.com/item?id=35073824&utm_source=Robin_Sloan_sent_me
- 12. https://brxnd.substack.com/p/the-prompt-to-rule-all-prompts-brxnd?utm_source=Robin_Sloan_sent_me
- 13. https://www.kqed.org/forum/2010101892368/how-to-wrap-our-heads-around-these-new-shockingly-fluent-chatbots?utm_source=Robin_Sloan_sent_me
- 14. https://www.anthropic.com/index/toy-models-of-superposition-2?utm_source=Robin_Sloan_sent_me
- 15. https://www.lexaloffle.com/pico-8.php?utm_source=Robin_Sloan_sent_me
- 16. https://importai.substack.com/?utm_source=Robin_Sloan_sent_me
- 17. https://www.robinsloan.com/lab/specifying-spring-83/
- 18. https://fat.gold/?utm_source=Robin_Sloan_sent_me
- 19. https://us13.campaign-archive.com/?u=67bd06787e84d73db24fb0aa5&&id=a03ebcd500&utm_source=Robin_Sloan_sent_me
- 20. https://www.robinsloan.com/about?utm_source=Robin_Sloan_sent_me
- 21. https://www.robinsloan.com/colophon/
+[19][ ] [20][Subscribe]
+This website doesn’t collect any information about you or your reading.
+It aspires to the speed and privacy of the printed page.
+
+Don’t miss [21]the colophon. Hony soyt qui mal pence
+
+
+References:
+
+[1] https://www.robinsloan.com/
+[2] https://www.robinsloan.com/about/
+[3] https://www.robinsloan.com/moonbound/
+[4] https://publicdomainreview.org/essay/the-snowflake-man-of-vermont?utm_source=Robin_Sloan_sent_me
+[5] https://www.robinsloan.com/newsletters/ring-got-good/?utm_source=Robin_Sloan_sent_me
+[6] https://genmon.github.io/braggoscope/?utm_source=Robin_Sloan_sent_me
+[7] https://interconnected.org/home/2023/02/07/braggoscope?utm_source=Robin_Sloan_sent_me
+[8] https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api?utm_source=Robin_Sloan_sent_me
+[9] https://news.ycombinator.com/item?id=35073824&utm_source=Robin_Sloan_sent_me
+[10] https://brxnd.substack.com/p/the-prompt-to-rule-all-prompts-brxnd?utm_source=Robin_Sloan_sent_me
+[11] https://www.kqed.org/forum/2010101892368/how-to-wrap-our-heads-around-these-new-shockingly-fluent-chatbots?utm_source=Robin_Sloan_sent_me
+[12] https://www.anthropic.com/index/toy-models-of-superposition-2?utm_source=Robin_Sloan_sent_me
+[13] https://www.lexaloffle.com/pico-8.php?utm_source=Robin_Sloan_sent_me
+[14] https://importai.substack.com/?utm_source=Robin_Sloan_sent_me
+[15] https://www.robinsloan.com/lab/specifying-spring-83/
+[16] https://fat.gold/?utm_source=Robin_Sloan_sent_me
+[17] https://us13.campaign-archive.com/?u=67bd06787e84d73db24fb0aa5&&id=a03ebcd500&utm_source=Robin_Sloan_sent_me
+[18] https://www.robinsloan.com/about?utm_source=Robin_Sloan_sent_me
+[21] https://www.robinsloan.com/colophon/
diff --git a/static/archive/www-sitepoint-com-6vwmef.txt b/static/archive/www-sitepoint-com-6vwmef.txt
index 1131d81..3b17d12 100644
--- a/static/archive/www-sitepoint-com-6vwmef.txt
+++ b/static/archive/www-sitepoint-com-6vwmef.txt
@@ -1,380 +1,358 @@
- #[1]SitePoint
+[1]
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-KL8PMMW
+ • [3][ ]
+ • [4]Blog
+ •
+ □ [5]Free Tech Books →
+ □ [6]AI →
+ □ [7]JavaScript
+ □ [8]Computing
+ □ [9]Design & UX
+ □ [10]HTML & CSS
+ □ [11]Entrepreneur
+ □ [12]Web
+ □ [13]PHP
+ □ [14]WordPress
+ □ [15]Mobile
+ □ [16]Programming
+ □ [17]Python →
+ • [18]Forum
+ • [19]Library
+ • [20]Login
+ • [21]Join Premium
- (BUTTON)
- * ____________________
- * [3]Blog
- *
- + [4]Free Tech Books →
- + [5]AI →
- + [6]JavaScript
- + [7]Computing
- + [8]Design & UX
- + [9]HTML & CSS
- + [10]Entrepreneur
- + [11]Web
- + [12]PHP
- + [13]WordPress
- + [14]Mobile
- + [15]Programming
- + [16]Python →
- * [17]Forum
- * [18]Library
- * [19]Login
- * [20]Join Premium
+[22]Join Premium
+[23][ ]
- [21]Join Premium
+ • [26]Free Tech Books
+ • [27]AI
+ • [28]JavaScript
+ • [29]Computing
+ • [30]Design & UX
+ • [31]HTML & CSS
+ • [32]Entrepreneur
+ • [33]Web
+ • [34]PHP
+ • [35]WordPress
+ • [36]Mobile
+ • [37]Programming
+ • [38]Python
- ____________________
-
- (BUTTON)
- (BUTTON)
- * [22]Free Tech Books
- * [23]AI
- * [24]JavaScript
- * [25]Computing
- * [26]Design & UX
- * [27]HTML & CSS
- * [28]Entrepreneur
- * [29]Web
- * [30]PHP
- * [31]WordPress
- * [32]Mobile
- * [33]Programming
- * [34]Python
-
- (BUTTON)
- (BUTTON)
-
- [35]Ruby
+[41]Ruby
The History of Ruby
- [36][1433174717Profile-2015-May-96x96.jpg]
+[42][1433174717]
+[43]Jesse Herrick
+July 26, 2014
+Share
- [37]Jesse Herrick
+rubygrows
- July 26, 2014
- Share (BUTTON) (BUTTON) (BUTTON) (BUTTON) (BUTTON)
+The Ruby language is 21 years old. Its strong community and adoption by the
+open source community has kept this language steady and improving. Ruby has
+changed drastically over the years. It has grown from a young child to the
+strong adult that it is today. But it didn’t get that way overnight. Let’s take
+a look at the life of the Ruby programming language.
- rubygrows
-
- The Ruby language is 21 years old. Its strong community and adoption by
- the open source community has kept this language steady and improving.
- Ruby has changed drastically over the years. It has grown from a young
- child to the strong adult that it is today. But it didn’t get that way
- overnight. Let’s take a look at the life of the Ruby programming
- language.
-
- Note: This article is packed with metaphors (language to human), so be
- prepared.
+Note: This article is packed with metaphors (language to human), so be
+prepared.
Birth (1993)
- Ruby was born in 1993, conceieved in a discussion between Yukihiro
- Matsumoto (“Matz”) and a colleague. They were discussing the
- possibility of an object-oriented scripting-language. Matz stated in
- [38]ruby-talk:00382 that he knew Perl, but did not like it very much;
- that it had the smell of a “toy” language. He also discussed that he
- knew Python, but didn’t like it because it wasn’t a true
- object-oriented programming language.
+Ruby was born in 1993, conceieved in a discussion between Yukihiro Matsumoto
+(“Matz”) and a colleague. They were discussing the possibility of an
+object-oriented scripting-language. Matz stated in [49]ruby-talk:00382 that he
+knew Perl, but did not like it very much; that it had the smell of a “toy”
+language. He also discussed that he knew Python, but didn’t like it because it
+wasn’t a true object-oriented programming language.
- Matz wanted a language perfect for his needs:
- * Syntactically Simple
- * Truly Object-Oriented
- * Having Iterators and Closures
- * Exception Handling
- * Garbage Collection
- * Portable
+Matz wanted a language perfect for his needs:
- Having looked around and not found a language suited for him, Yukihiro
- Matsumoto decided to create his own. After spending several months
- writing an interpreter, Matz finally published the first public version
- of Ruby (0.95) to various Japanese domestic newsgroups in December,
- 1995. You can still download the infant version of Ruby [39]here at
- your own risk.
+ • Syntactically Simple
+ • Truly Object-Oriented
+ • Having Iterators and Closures
+ • Exception Handling
+ • Garbage Collection
+ • Portable
+
+Having looked around and not found a language suited for him, Yukihiro
+Matsumoto decided to create his own. After spending several months writing an
+interpreter, Matz finally published the first public version of Ruby (0.95) to
+various Japanese domestic newsgroups in December, 1995. You can still download
+the infant version of Ruby [50]here at your own risk.
Toddler Years
- Ruby became a toddler (n.: a young child who is just beginning to walk)
- when Ruby 1.0 was released in December, 1996. Ruby 1.1 shortly followed
- in August of 1997, and the first stable version of Ruby (1.2) was
- released in December of 1998.
+Ruby became a toddler (n.: a young child who is just beginning to walk) when
+Ruby 1.0 was released in December, 1996. Ruby 1.1 shortly followed in August of
+1997, and the first stable version of Ruby (1.2) was released in December of
+1998.
- At this point in time, Ruby was localized to Japan only, but it would
- soon spread to other parts of the world…
+At this point in time, Ruby was localized to Japan only, but it would soon
+spread to other parts of the world…
Primary School Years
- In 1998, Matz created a simple English homepage for Ruby. However, Ruby
- was still very localized to Japan. In trying to further this expansion,
- the first English language Ruby mailing list, [40]Ruby-Talk, was
- created. Ruby was beginning to spread beyond Japan.
+In 1998, Matz created a simple English homepage for Ruby. However, Ruby was
+still very localized to Japan. In trying to further this expansion, the first
+English language Ruby mailing list, [51]Ruby-Talk, was created. Ruby was
+beginning to spread beyond Japan.
- Ruby-Talk is still very active today, and you can subscribe to it
- [41]here.
+Ruby-Talk is still very active today, and you can subscribe to it [52]here.
- In October of 1999, Yukihiro Matsumoto and Keiju Ishitsuka wrote the
- first book on the Ruby programming language: The Object-oriented
- Scripting Language Ruby. Ruby was beginning to get very popular in
- Japan, and spreading rapidly to English-speaking countries.
+In October of 1999, Yukihiro Matsumoto and Keiju Ishitsuka wrote the first book
+on the Ruby programming language: The Object-oriented Scripting Language Ruby.
+Ruby was beginning to get very popular in Japan, and spreading rapidly to
+English-speaking countries.
- In 2001, the first English book on Ruby, Programming Ruby (“The
- Pickaxe”), was published in 2001. With this new information on Ruby,
- many more people were able to learn the language.
+In 2001, the first English book on Ruby, Programming Ruby (“The Pickaxe”), was
+published in 2001. With this new information on Ruby, many more people were
+able to learn the language.
- Ruby 1.8 was released in 2003. This release made large amounts of
- changes to the agile 10-year-old language. Including:
- * Duck Typing (looks like a duck, swims like a duck, quacks like a
- duck: it’s a duck)
- * Fully Qualified Names (Foo::Bar)
- * Native YAML Support
- * WEBrick
- * StringIO
- * open-uri
- * PP (Pretty Printer for Hash#inspect)
- * ruby -run (UNIX commands for all! ruby -run -e mkdir foo)
- * And many other minor features
+Ruby 1.8 was released in 2003. This release made large amounts of changes to
+the agile 10-year-old language. Including:
- In 2004, RubyGems was released to the public. Good things started
- happening next…
+ • Duck Typing (looks like a duck, swims like a duck, quacks like a duck: it’s
+ a duck)
+ • Fully Qualified Names (Foo::Bar)
+ • Native YAML Support
+ • WEBrick
+ • StringIO
+ • open-uri
+ • PP (Pretty Printer for Hash#inspect)
+ • ruby -run (UNIX commands for all! ruby -run -e mkdir foo)
+ • And many other minor features
+
+In 2004, RubyGems was released to the public. Good things started happening
+next…
The Rebellious Teenager
- In 2005, Ruby use took off. The reason: Ruby on Rails. This new
- framework changed the history of rapid web development. Ruby had been
- used in the past to write CGI scripts, but Ruby on Rails took this a
- step further. Rails has a Model-View-Controller structure that focuses
- on “convention over configuration”, which is great for developing web
- applications.
+In 2005, Ruby use took off. The reason: Ruby on Rails. This new framework
+changed the history of rapid web development. Ruby had been used in the past to
+write CGI scripts, but Ruby on Rails took this a step further. Rails has a
+Model-View-Controller structure that focuses on “convention over
+configuration”, which is great for developing web applications.
- People loved it. So much so that, the Ruby community was almost taken
- over by the Rails framework. Ruby in turn became very popular.
+People loved it. So much so that, the Ruby community was almost taken over by
+the Rails framework. Ruby in turn became very popular.
- In March of 2007, Ruby 1.8.6 was released, with 1.8.7 following in May
- of 2008. At this point, Ruby was at its peak. Mac OS X even began
- shipping with it in 2007. At this point, Ruby was 15 years old.
+In March of 2007, Ruby 1.8.6 was released, with 1.8.7 following in May of 2008.
+At this point, Ruby was at its peak. Mac OS X even began shipping with it in
+2007. At this point, Ruby was 15 years old.
- Ruby 1.9 (development version) was released in December, 2007, then
- stabilized 4 years later (2011) as Ruby 1.9.3. Ruby 1.9.3 was the
- production version of 1.9.2. These versions brought new changes to the
- language, such as:
- * Significant speed improvements
- * New methods
- * New hash syntax ({ foo: 'bar' })
- * RubyGems included
- * New Socket API (IPv6 support)
- * Several random number generators
- * Regular Expression improvements
- * File loading performance improvements
- * Test::Unit Improvements
- * New encoding support
- * More string formatting tweaks
- * And so much more
+Ruby 1.9 (development version) was released in December, 2007, then stabilized
+4 years later (2011) as Ruby 1.9.3. Ruby 1.9.3 was the production version of
+1.9.2. These versions brought new changes to the language, such as:
- Ruby was making the transition from a rebellious teenager to a strong
- adult as it turned 18 with Ruby 1.9.3.
+ • Significant speed improvements
+ • New methods
+ • New hash syntax ({ foo: 'bar' })
+ • RubyGems included
+ • New Socket API (IPv6 support)
+ • Several random number generators
+ • Regular Expression improvements
+ • File loading performance improvements
+ • Test::Unit Improvements
+ • New encoding support
+ • More string formatting tweaks
+ • And so much more
+
+Ruby was making the transition from a rebellious teenager to a strong adult as
+it turned 18 with Ruby 1.9.3.
Strong Adult
- Ruby 2.0.0 was released in February 2013 and brought many stabilizing
- changes to the language. Among them are:
- * More speed improvements
- * Refinements (safe monkey patching)
- * Keyword arguments
- * UTF-8 by default
- * New regular expressions engine
- * Optimized garbage collection
- * The addition of built-in syntax documentation (ri ruby:syntax)
+Ruby 2.0.0 was released in February 2013 and brought many stabilizing changes
+to the language. Among them are:
- Unlike 1.9.x, which broke numerous gems with its changes, 2.0.0 was
- almost completely backwards compatible with 1.9.3. In addition, Heroku,
- one of the leading Ruby/Rails hosts upgraded to 2.0.0 quickly, causing
- earlier than usual adoption by new and existing projects. The Ruby
- language was (and is) in its golden age.
+ • More speed improvements
+ • Refinements (safe monkey patching)
+ • Keyword arguments
+ • UTF-8 by default
+ • New regular expressions engine
+ • Optimized garbage collection
+ • The addition of built-in syntax documentation (ri ruby:syntax)
- Ruby 2.1.0 was released on Christmas day of 2013. It brought several
- minor changes to the language. But the biggest news of 2.1.0 was
- [42]semantic versioning, a way to properly version a project without
- breaking dependencies by accident.
+Unlike 1.9.x, which broke numerous gems with its changes, 2.0.0 was almost
+completely backwards compatible with 1.9.3. In addition, Heroku, one of the
+leading Ruby/Rails hosts upgraded to 2.0.0 quickly, causing earlier than usual
+adoption by new and existing projects. The Ruby language was (and is) in its
+golden age.
- Ruby 2.1.1 was released on Ruby’s 21st birthday (February 24, 2014).
- Ruby is now legally allowed to drink in the US (not that we’d want it
- to). This version was mainly speed improvements and bugfixes. Shortly
- after 2.1.1, Ruby 2.1.2 was released in May of 2014. 2.1.2 consists of
- more bugfixes and is the current stable version of Ruby.
+Ruby 2.1.0 was released on Christmas day of 2013. It brought several minor
+changes to the language. But the biggest news of 2.1.0 was [53]semantic
+versioning, a way to properly version a project without breaking dependencies
+by accident.
+
+Ruby 2.1.1 was released on Ruby’s 21st birthday (February 24, 2014). Ruby is
+now legally allowed to drink in the US (not that we’d want it to). This version
+was mainly speed improvements and bugfixes. Shortly after 2.1.1, Ruby 2.1.2 was
+released in May of 2014. 2.1.2 consists of more bugfixes and is the current
+stable version of Ruby.
The Future
- Ruby is a great language. Matz wanted a programming language that
- suited his needs, so he built one. This is an inspiring story of
- software development: if you can’t find something that you like,
- program it yourself. From 0.95 to 2.1.2, Ruby has struck the awe of
- those who wished to program the way they wanted, not the way the
- machine wanted.
+Ruby is a great language. Matz wanted a programming language that suited his
+needs, so he built one. This is an inspiring story of software development: if
+you can’t find something that you like, program it yourself. From 0.95 to
+2.1.2, Ruby has struck the awe of those who wished to program the way they
+wanted, not the way the machine wanted.
- We can’t know the future of the Ruby language, but we can predict it
- based on the past. I believe that the Ruby language, and its fantastic
- community will continue furthering the language above and beyond what
- others think is possible, and projects built using it will do the same.
+We can’t know the future of the Ruby language, but we can predict it based on
+the past. I believe that the Ruby language, and its fantastic community will
+continue furthering the language above and beyond what others think is
+possible, and projects built using it will do the same.
Share This Article
- (BUTTON) (BUTTON) (BUTTON) (BUTTON) (BUTTON)
+
+[59]Jesse Herrick
+[60]Jesse Herrick
+
+Jesse Herrick is an avid Ruby developer who specializes in web development. He
+is a back-end developer at [61]Littlelines and loves programming. You can read
+his personal blog at: [62]https://jesse.codes.
+
+ [63][64]
- [43]Jesse Herrick
-
- [44]Jesse Herrick
-
- Jesse Herrick is an avid Ruby developer who specializes in web
- development. He is a back-end developer at [45]Littlelines and loves
- programming. You can read his personal blog at:
- [46]https://jesse.codes.
-
- GlennGhistoryruby
+GlennGhistoryruby
Up Next
- [47]How to Build an Interactive History Map with WRLD
- [48]How to Build an Interactive History Map with WRLD[49]Adrian Try
+[65]How to Build an Interactive History Map with WRLD
+[66]How to Build an Interactive History Map with WRLD[67]Adrian Try
+[68]Digital Fonts: A Condensed History
+[69]Digital Fonts: A Condensed History[70]Alex Bigman
+[71]A History of CSS Image Replacement
+[72]A History of CSS Image Replacement[73]Baljeet Rathi
+[74]Making Alternative ’80s Film History Come to Life with Photoshop
+[75]Making Alternative ’80s Film History Come to Life with Photoshop[76]
+Gabrielle Gosha
+[77]10 Years of Mobile Industry History in 10 Minutes
+[78]10 Years of Mobile Industry History in 10 Minutes[79]Dirk Reagle
+[80]How to Modify the Browser History in Complex HTML5 and JavaScript
+Applications
+[81]How to Modify the Browser History in Complex HTML5 and JavaScript
+Applications[82]Craig Buckler
- [50]Digital Fonts: A Condensed History
- [51]Digital Fonts: A Condensed History[52]Alex Bigman
+ • Stuff we do
- [53]A History of CSS Image Replacement
- [54]A History of CSS Image Replacement[55]Baljeet Rathi
+ • [83]Premium
+ • [84]Newsletters
+ • [85]Forums
- [56]Making Alternative ’80s Film History Come to Life with Photoshop
- [57]Making Alternative ’80s Film History Come to Life with
- Photoshop[58]Gabrielle Gosha
+ • About
- [59]10 Years of Mobile Industry History in 10 Minutes
- [60]10 Years of Mobile Industry History in 10 Minutes[61]Dirk Reagle
+ • [86]Our story
+ • [87]Terms of use
+ • [88]Privacy policy
+ • [89]Corporate memberships
- [62]How to Modify the Browser History in Complex HTML5 and JavaScript
- Applications
- [63]How to Modify the Browser History in Complex HTML5 and JavaScript
- Applications[64]Craig Buckler
+ • Contact
- * Stuff we do
- * [65]Premium
- * [66]Newsletters
- * [67]Forums
+ • [90]Contact us
+ • [91]FAQ
+ • [92]Publish your book with us
+ • [93]Write an article for us
+ • [94]Advertise
- * About
- * [68]Our story
- * [69]Terms of use
- * [70]Privacy policy
- * [71]Corporate memberships
+ • Connect
- * Contact
- * [72]Contact us
- * [73]FAQ
- * [74]Publish your book with us
- * [75]Write an article for us
- * [76]Advertise
+ • [95][96][97]
- * Connect
- *
+© 2000 – 2024 SitePoint Pty. Ltd.
- © 2000 – 2024 SitePoint Pty. Ltd.
+This site is protected by reCAPTCHA and the Google[98] Privacy Policy and[99]
+Terms of Service apply.
- This site is protected by reCAPTCHA and the Google[77] Privacy Policy
- and[78] Terms of Service apply.
+
-
+References:
-References
-
- Visible links:
- 1. https://www.sitepoint.com/sitepoint.rss
- 2. https://www.googletagmanager.com/ns.html?id=GTM-KL8PMMW
- 3. https://www.sitepoint.com/blog/
- 4. https://www.sitepoint.com/premium/library/free/?ref_source=blog_nav
- 5. https://www.sitepoint.com/ai/
- 6. https://www.sitepoint.com/javascript/
- 7. https://www.sitepoint.com/computing/
- 8. https://www.sitepoint.com/design-ux/
- 9. https://www.sitepoint.com/html-css/
- 10. https://www.sitepoint.com/entrepreneur/
- 11. https://www.sitepoint.com/web/
- 12. https://www.sitepoint.com/php/
- 13. https://www.sitepoint.com/wordpress/
- 14. https://www.sitepoint.com/mobile/
- 15. https://www.sitepoint.com/programming/
- 16. https://www.sitepoint.com/python/
- 17. https://www.sitepoint.com/community/
- 18. https://www.sitepoint.com/premium/library/
- 19. https://www.sitepoint.com/premium/sign-in/
- 20. https://www.sitepoint.com/premium/pricing/?ref_source=sitepoint&ref_medium=topnav
- 21. https://www.sitepoint.com/premium/pricing/?ref_source=sitepoint&ref_medium=topnav
- 22. https://www.sitepoint.com/premium/library/free/?ref_source=blog_nav
- 23. https://www.sitepoint.com/ai/
- 24. https://www.sitepoint.com/javascript/
- 25. https://www.sitepoint.com/computing/
- 26. https://www.sitepoint.com/design-ux/
- 27. https://www.sitepoint.com/html-css/
- 28. https://www.sitepoint.com/entrepreneur/
- 29. https://www.sitepoint.com/web/
- 30. https://www.sitepoint.com/php/
- 31. https://www.sitepoint.com/wordpress/
- 32. https://www.sitepoint.com/mobile/
- 33. https://www.sitepoint.com/programming/
- 34. https://www.sitepoint.com/python/
- 35. https://www.sitepoint.com/ruby/
- 36. https://www.sitepoint.com/author/jherrick/
- 37. https://www.sitepoint.com/author/jherrick/
- 38. http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/382
- 39. https://ftp.ruby-lang.org/pub/ruby/1.0/
- 40. http://blade.nagaokaut.ac.jp/ruby/ruby-talk/index.shtml
- 41. https://www.ruby-lang.org/en/community/mailing-lists/
- 42. http://semver.org/
- 43. https://www.sitepoint.com/author/jherrick/
- 44. https://www.sitepoint.com/author/jherrick/
- 45. http://www.littlelines.com/
- 46. https://jesse.codes/
- 47. https://www.sitepoint.com/how-to-build-an-interactive-history-map-with-wrld/
- 48. https://www.sitepoint.com/how-to-build-an-interactive-history-map-with-wrld/
- 49. https://www.sitepoint.com/author/atry/
- 50. https://www.sitepoint.com/digital-fonts-condensed-history/
- 51. https://www.sitepoint.com/digital-fonts-condensed-history/
- 52. https://www.sitepoint.com/author/alex-bigman/
- 53. https://www.sitepoint.com/css-image-replacement-text-indent-negative-margins-and-more/
- 54. https://www.sitepoint.com/css-image-replacement-text-indent-negative-margins-and-more/
- 55. https://www.sitepoint.com/author/brathi/
- 56. https://www.sitepoint.com/making-alternative-80s-film-history-come-life-photoshop/
- 57. https://www.sitepoint.com/making-alternative-80s-film-history-come-life-photoshop/
- 58. https://www.sitepoint.com/author/ggosha/
- 59. https://www.sitepoint.com/the-advancements-in-mobile-design-and-how-it-has-developed-into-a-strong-industry/
- 60. https://www.sitepoint.com/the-advancements-in-mobile-design-and-how-it-has-developed-into-a-strong-industry/
- 61. https://www.sitepoint.com/author/dreagle/
- 62. https://www.sitepoint.com/javascript-history-pushstate/
- 63. https://www.sitepoint.com/javascript-history-pushstate/
- 64. https://www.sitepoint.com/author/craig-buckler/
- 65. https://www.sitepoint.com/premium/library/
- 66. https://www.sitepoint.com/newsletters/
- 67. https://www.sitepoint.com/community/
- 68. https://www.sitepoint.com/about-us/
- 69. https://www.sitepoint.com/legals/
- 70. https://www.sitepoint.com/privacy-policy/
- 71. https://www.sitepoint.com/premium-for-teams/
- 72. https://www.sitepoint.com/contact-us/
- 73. https://support.sitepoint.com/hc/en-us
- 74. https://sitepoint.typeform.com/to/HtAXVN
- 75. https://www.sitepoint.com/write-for-us/
- 76. https://www.sitepoint.com/partnerships/
- 77. https://policies.google.com/privacy
- 78. https://policies.google.com/terms
-
- Hidden links:
- 80. https://www.sitepoint.com/
- 81. https://github.com/JesseHerrick
- 82. https://twitter.com/JesseHerrick
- 83. https://www.facebook.com/sitepoint
- 84. https://twitter.com/sitepointdotcom
- 85. https://www.sitepoint.com/sitepoint.rss
+[1] https://www.sitepoint.com/
+[4] https://www.sitepoint.com/blog/
+[5] https://www.sitepoint.com/premium/library/free/?ref_source=blog_nav
+[6] https://www.sitepoint.com/ai/
+[7] https://www.sitepoint.com/javascript/
+[8] https://www.sitepoint.com/computing/
+[9] https://www.sitepoint.com/design-ux/
+[10] https://www.sitepoint.com/html-css/
+[11] https://www.sitepoint.com/entrepreneur/
+[12] https://www.sitepoint.com/web/
+[13] https://www.sitepoint.com/php/
+[14] https://www.sitepoint.com/wordpress/
+[15] https://www.sitepoint.com/mobile/
+[16] https://www.sitepoint.com/programming/
+[17] https://www.sitepoint.com/python/
+[18] https://www.sitepoint.com/community/
+[19] https://www.sitepoint.com/premium/library/
+[20] https://www.sitepoint.com/premium/sign-in/
+[21] https://www.sitepoint.com/premium/pricing/?ref_source=sitepoint&ref_medium=topnav
+[22] https://www.sitepoint.com/premium/pricing/?ref_source=sitepoint&ref_medium=topnav
+[26] https://www.sitepoint.com/premium/library/free/?ref_source=blog_nav
+[27] https://www.sitepoint.com/ai/
+[28] https://www.sitepoint.com/javascript/
+[29] https://www.sitepoint.com/computing/
+[30] https://www.sitepoint.com/design-ux/
+[31] https://www.sitepoint.com/html-css/
+[32] https://www.sitepoint.com/entrepreneur/
+[33] https://www.sitepoint.com/web/
+[34] https://www.sitepoint.com/php/
+[35] https://www.sitepoint.com/wordpress/
+[36] https://www.sitepoint.com/mobile/
+[37] https://www.sitepoint.com/programming/
+[38] https://www.sitepoint.com/python/
+[41] https://www.sitepoint.com/ruby/
+[42] https://www.sitepoint.com/author/jherrick/
+[43] https://www.sitepoint.com/author/jherrick/
+[49] http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/382
+[50] https://ftp.ruby-lang.org/pub/ruby/1.0/
+[51] http://blade.nagaokaut.ac.jp/ruby/ruby-talk/index.shtml
+[52] https://www.ruby-lang.org/en/community/mailing-lists/
+[53] http://semver.org/
+[59] https://www.sitepoint.com/author/jherrick/
+[60] https://www.sitepoint.com/author/jherrick/
+[61] http://www.littlelines.com/
+[62] https://jesse.codes/
+[63] https://github.com/JesseHerrick
+[64] https://twitter.com/JesseHerrick
+[65] https://www.sitepoint.com/how-to-build-an-interactive-history-map-with-wrld/
+[66] https://www.sitepoint.com/how-to-build-an-interactive-history-map-with-wrld/
+[67] https://www.sitepoint.com/author/atry/
+[68] https://www.sitepoint.com/digital-fonts-condensed-history/
+[69] https://www.sitepoint.com/digital-fonts-condensed-history/
+[70] https://www.sitepoint.com/author/alex-bigman/
+[71] https://www.sitepoint.com/css-image-replacement-text-indent-negative-margins-and-more/
+[72] https://www.sitepoint.com/css-image-replacement-text-indent-negative-margins-and-more/
+[73] https://www.sitepoint.com/author/brathi/
+[74] https://www.sitepoint.com/making-alternative-80s-film-history-come-life-photoshop/
+[75] https://www.sitepoint.com/making-alternative-80s-film-history-come-life-photoshop/
+[76] https://www.sitepoint.com/author/ggosha/
+[77] https://www.sitepoint.com/the-advancements-in-mobile-design-and-how-it-has-developed-into-a-strong-industry/
+[78] https://www.sitepoint.com/the-advancements-in-mobile-design-and-how-it-has-developed-into-a-strong-industry/
+[79] https://www.sitepoint.com/author/dreagle/
+[80] https://www.sitepoint.com/javascript-history-pushstate/
+[81] https://www.sitepoint.com/javascript-history-pushstate/
+[82] https://www.sitepoint.com/author/craig-buckler/
+[83] https://www.sitepoint.com/premium/library/
+[84] https://www.sitepoint.com/newsletters/
+[85] https://www.sitepoint.com/community/
+[86] https://www.sitepoint.com/about-us/
+[87] https://www.sitepoint.com/legals/
+[88] https://www.sitepoint.com/privacy-policy/
+[89] https://www.sitepoint.com/premium-for-teams/
+[90] https://www.sitepoint.com/contact-us/
+[91] https://support.sitepoint.com/hc/en-us
+[92] https://sitepoint.typeform.com/to/HtAXVN
+[93] https://www.sitepoint.com/write-for-us/
+[94] https://www.sitepoint.com/partnerships/
+[95] https://www.facebook.com/sitepoint
+[96] https://twitter.com/sitepointdotcom
+[97] https://www.sitepoint.com/sitepoint.rss
+[98] https://policies.google.com/privacy
+[99] https://policies.google.com/terms
diff --git a/static/archive/www-theatlantic-com-biphm9.txt b/static/archive/www-theatlantic-com-biphm9.txt
index ab9526b..c83e025 100644
--- a/static/archive/www-theatlantic-com-biphm9.txt
+++ b/static/archive/www-theatlantic-com-biphm9.txt
@@ -1,291 +1,287 @@
- #[1]The Atlantic [2]Best of The Atlantic
-
- [3]Skip to content
+[1]Skip to content
Site Navigation
- *
- * (BUTTON)
- (BUTTON)
- [4]Popular[5]Latest[6]Newsletters
+ • [2]
+ •
+ [5]Popular[6]Latest[7]Newsletters
-Sections
- + [7]Politics
- + [8]Ideas
- + [9]Fiction
- + [10]Technology
- + [11]Science
- + [12]Photo
- + [13]Business
- + [14]Culture
- + [15]Planet
- + [16]Global
- + [17]Books
- + [18]Podcasts
- + [19]Health
- + [20]Education
- + [21]Projects
- + [22]Features
- + [23]Family
- + [24]Events
- + [25]Washington Week
- + [26]Progress
- + [27]Newsletters
- + [28]Explore The Atlantic Archive
- + [29]Play The Atlantic crossword
+ Sections
-The Print Edition
- [30]Latest Issue[31]Past Issues
- ______________________________________________________________
+ □ [8]Politics
+ □ [9]Ideas
+ □ [10]Fiction
+ □ [11]Technology
+ □ [12]Science
+ □ [13]Photo
+ □ [14]Business
+ □ [15]Culture
+ □ [16]Planet
+ □ [17]Global
+ □ [18]Books
+ □ [19]Podcasts
+ □ [20]Health
+ □ [21]Education
+ □ [22]Projects
+ □ [23]Features
+ □ [24]Family
+ □ [25]Events
+ □ [26]Washington Week
+ □ [27]Progress
+ □ [28]Newsletters
+ □ [29][nav-arch]Explore The Atlantic Archive
+ □ [30][crosswor]Play The Atlantic crossword
- [32]Give a Gift
- * (BUTTON)
- Search The Atlantic
- (BUTTON) ____________________
- Quick Links
- + [33]Dear Therapist
- Dear Therapist
- + [34]Crossword Puzzle
- Crossword Puzzle
- + [35]Magazine Archive
- Magazine Archive
- + [36]Your Subscription
- Your Subscription
- (BUTTON)
- * [37]Popular
- * [38]Latest
- * [39]Newsletters
+ The Print Edition
- * [40]Sign In
- * [41]Subscribe
+ [31][current-issue]
+ [32]Latest Issue[33]Past Issues
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ [34]Give a Gift
+ •
+ Search The Atlantic
+ [37][ ]
+ Quick Links
+ □ [38]Dear Therapist
+ Dear Therapist
+ □ [39]Crossword Puzzle
+ Crossword Puzzle
+ □ [40]Magazine Archive
+ Magazine Archive
+ □ [41]Your Subscription
+ Your Subscription
+ • [43]Popular
+ • [44]Latest
+ • [45]Newsletters
-[42]More From Planet
+[46][47]
+
+ • [48]Sign In
+ • [49]Subscribe
+
+[50]More From Planet
More From Planet
- [43]Explore This Series
- * A person holds an umbrella in the wet and snowy city
- The Threshold at Which Snow Starts Irreversibly Disappearing[44]Zoë
- Schlanger
- * Color photo of an arctic vole resting on small tundra plants
- A Major Climate Force Has Been Ignored for Decades[45]Bathsheba Demuth
- * Photos of flooding, as well as of family Polaroids and heirlooms,
- arranged in a 3 x 4 grid and washed blue, against a blue background
- Pack Your Memories Into Your Disaster Bag[46]Ayurella Horn-Muller
- * A man works on an electric car
- Electric Cars Are Already Upending America[47]Saahil Desai
+[51]Explore This Series
- [48]Health
+ • [52]A person holds an umbrella in the wet and snowy city
+
+ The Threshold at Which Snow Starts Irreversibly Disappearing
+
+ [53]Zoë Schlanger
+ • [54]Color photo of an arctic vole resting on small tundra plants
+
+ A Major Climate Force Has Been Ignored for Decades
+
+ [55]Bathsheba Demuth
+ • [56]Photos of flooding, as well as of family Polaroids and heirlooms,
+ arranged in a 3 x 4 grid and washed blue, against a blue background
+
+ Pack Your Memories Into Your Disaster Bag
+
+ [57]Ayurella Horn-Muller
+ • [58]A man works on an electric car
+
+ Electric Cars Are Already Upending America
+
+ [59]Saahil Desai
+
+[60]Health
The Real Reason You Should Get an E-bike
- It’ll cut your emissions. It’ll also make you happier.
+It’ll cut your emissions. It’ll also make you happier.
- By [49]Michael Thomas
+By [61]Michael Thomas
+A collage of 12 photographs of e-bikes against a light-pink background
+Illustration by The Atlantic. Source: Getty.
+October 20, 2023
+Share
+Save
- A collage of 12 photographs of e-bikes against a light-pink background
- Illustration by The Atlantic. Source: Getty.
- October 20, 2023
- (BUTTON) Share
- (BUTTON) Save
+Today’s happiness and personal-finance gurus have no shortage of advice for
+living a good life. Meditate daily. Sleep for eight hours a night. Don’t forget
+to save for retirement. They’re not wrong, but few of these experts will tell
+you one of the best ways to improve your life: Ditch your car.
- Today’s happiness and personal-finance gurus have no shortage of advice
- for living a good life. Meditate daily. Sleep for eight hours a night.
- Don’t forget to save for retirement. They’re not wrong, but few of
- these experts will tell you one of the best ways to improve your life:
- Ditch your car.
+A year ago, my wife and I sold one of our cars and replaced it with an e-bike.
+As someone who writes about climate change, I knew that I was doing something
+good for the planet. I knew that passenger vehicles are responsible for much of
+our greenhouse-gas emissions—[64]16 percent in the U.S., to be exact—and that
+the pollution spewing from gas-powered cars doesn’t just heat up the planet; it
+could increase the risk of [65]premature death. I also knew that electric cars
+were an imperfect fix: Though they’re responsible for less carbon pollution
+than gas cars, even when powered by today’s dirty electric grid, their supply
+chain is carbon intensive, and many of the materials needed to produce their
+batteries are, in some cases, mined via a process that [66]brutally exploits
+workers and harms [67]ecosystems and sacred Indigenous lands. An e-bike’s
+comparatively tiny battery means less electricity, fewer emissions, fewer
+resources. They are clearly better for the planet than cars of any kind.
- A year ago, my wife and I sold one of our cars and replaced it with an
- e-bike. As someone who writes about climate change, I knew that I was
- doing something good for the planet. I knew that passenger vehicles are
- responsible for much of our greenhouse-gas emissions—[50]16 percent in
- the U.S., to be exact—and that the pollution spewing from gas-powered
- cars doesn’t just heat up the planet; it could increase the risk of
- [51]premature death. I also knew that electric cars were an imperfect
- fix: Though they’re responsible for less carbon pollution than gas
- cars, even when powered by today’s dirty electric grid, their supply
- chain is carbon intensive, and many of the materials needed to produce
- their batteries are, in some cases, mined via a process that
- [52]brutally exploits workers and harms [53]ecosystems and sacred
- Indigenous lands. An e-bike’s comparatively tiny battery means less
- electricity, fewer emissions, fewer resources. They are clearly better
- for the planet than cars of any kind.
+[68]Read: America is missing out on the biggest EV boom of all
- [54]Read: America is missing out on the biggest EV boom of all
+I knew all of this. But I also viewed getting rid of my car as a
+sacrifice—something for the militant and reckless, something that Greenpeace
+volunteers did to make the world better. I live in Colorado; e-biking would
+mean freezing in the winter and sweating in the summer. It was the right thing
+to do, I thought, but it was not going to be fun.
- I knew all of this. But I also viewed getting rid of my car as a
- sacrifice—something for the militant and reckless, something that
- Greenpeace volunteers did to make the world better. I live in Colorado;
- e-biking would mean freezing in the winter and sweating in the summer.
- It was the right thing to do, I thought, but it was not going to be
- fun.
+I was very wrong. The first thing I noticed was the savings. Between car
+payments, insurance, maintenance, and gas, a car-centered lifestyle is
+expensive. According to AAA, after fuel, maintenance, insurance, taxes, and the
+like, owning and driving a new car in America costs[69] $10,728 a year. My
+e-bike, by comparison, cost $2,000 off the rack and has near-negligible
+recurring charges. After factoring in maintenance and a few bucks a month in
+electricity costs, I estimate that we’ll save about $50,000 over the next five
+years by ditching our car.
- I was very wrong. The first thing I noticed was the savings. Between
- car payments, insurance, maintenance, and gas, a car-centered lifestyle
- is expensive. According to AAA, after fuel, maintenance, insurance,
- taxes, and the like, owning and driving a new car in America costs[55]
- $10,728 a year. My e-bike, by comparison, cost $2,000 off the rack and
- has near-negligible recurring charges. After factoring in maintenance
- and a few bucks a month in electricity costs, I estimate that we’ll
- save about $50,000 over the next five years by ditching our car.
+The actual experience of riding to work each day over the past year has been
+equally surprising. Before selling our car, I worried most about riding in the
+cold winter months. But I quickly learned that, as the saying goes, there is
+[70]no bad weather, only bad gear. I wear gloves, warm socks, a balaclava, and
+a ski jacket when I ride, and am almost never too cold.
- The actual experience of riding to work each day over the past year has
- been equally surprising. Before selling our car, I worried most about
- riding in the cold winter months. But I quickly learned that, as the
- saying goes, there is [56]no bad weather, only bad gear. I wear gloves,
- warm socks, a balaclava, and a ski jacket when I ride, and am almost
- never too cold.
+Sara Hastings-Simon is a professor at the University of Calgary, where she
+studies low-carbon transportation systems. She’s also a native Californian who
+now bikes to work in a city where temperatures tend to hover around freezing
+from December through March. She told me that with the right equipment, she’s
+able to do it on all but the snowiest days—days when she wouldn’t want to be in
+a car, either. “Those days are honestly a mess even on the roads,” she said.
- Sara Hastings-Simon is a professor at the University of Calgary, where
- she studies low-carbon transportation systems. She’s also a native
- Californian who now bikes to work in a city where temperatures tend to
- hover around freezing from December through March. She told me that
- with the right equipment, she’s able to do it on all but the snowiest
- days—days when she wouldn’t want to be in a car, either. “Those days
- are honestly a mess even on the roads,” she said.
+And though I, like [71]many would-be cyclists, was worried about arriving at
+the office sweaty in hotter months, the e-bike solved my problem. Even when it
+was 90 degrees outside, I didn’t break a sweat, thanks to my bike’s
+pedal-assist mode. If I’m honest, sometimes I didn’t even pedal; I just used
+the throttle, sat back, and enjoyed my ride.
- And though I, like [57]many would-be cyclists, was worried about
- arriving at the office sweaty in hotter months, the e-bike solved my
- problem. Even when it was 90 degrees outside, I didn’t break a sweat,
- thanks to my bike’s pedal-assist mode. If I’m honest, sometimes I
- didn’t even pedal; I just used the throttle, sat back, and enjoyed my
- ride.
+Indeed, a big part of the appeal here is in the e part of the bike: “E-bikes
+aren’t just a traditional bike with a motor. They are an entirely new
+technology,” Hastings-Simon told me. Riding them is a radically different
+experience from riding a normal bike, at least when it comes to the hard parts
+of cycling. “It’s so much easier to take a bike over a bridge or in a hilly
+neighborhood,” Laura Fox, the former general manager of New York City’s
+bike-share program, told me. “I’ve had countless people come up to me and say,
+‘I never thought that I could bike to work before, and now that I have an
+option where you don’t have to show up sweaty, it’s possible.’” (When New York
+introduced e-bikes to its fleet, ridership tripled, she told me, from 500,000
+to 1.5 million people.)
- Indeed, a big part of the appeal here is in the e part of the bike:
- “E-bikes aren’t just a traditional bike with a motor. They are an
- entirely new technology,” Hastings-Simon told me. Riding them is a
- radically different experience from riding a normal bike, at least when
- it comes to the hard parts of cycling. “It’s so much easier to take a
- bike over a bridge or in a hilly neighborhood,” Laura Fox, the former
- general manager of New York City’s bike-share program, told me. “I’ve
- had countless people come up to me and say, ‘I never thought that I
- could bike to work before, and now that I have an option where you
- don’t have to show up sweaty, it’s possible.’” (When New York
- introduced e-bikes to its fleet, ridership tripled, she told me, from
- 500,000 to 1.5 million people.)
+[72]Read: How to get fewer people to commute in cars
- [58]Read: How to get fewer people to commute in cars
+But biking to work wasn’t just not unpleasant—it was downright enjoyable. It
+made me feel happier and healthier; I arrived to work a little more buoyant for
+having spent the morning in fresh air rather than traffic. [73]Study after [74]
+study shows that people with longer car commutes are more likely to experience
+poor health outcomes and lower personal well-being—and that cyclists are the
+[75]happiest commuters. One day, shortly after selling our car, I hopped on my
+bike after a stressful day at work and rode home down a street edged with
+changing fall leaves. I felt more connected to the physical environment around
+me than I had when I’d traveled the same route surrounded by metal and glass. I
+breathed in the air, my muscles relaxed, and I grinned like a giddy
+schoolchild.
- But biking to work wasn’t just not unpleasant—it was downright
- enjoyable. It made me feel happier and healthier; I arrived to work a
- little more buoyant for having spent the morning in fresh air rather
- than traffic. [59]Study after [60]study shows that people with longer
- car commutes are more likely to experience poor health outcomes and
- lower personal well-being—and that cyclists are the [61]happiest
- commuters. One day, shortly after selling our car, I hopped on my bike
- after a stressful day at work and rode home down a street edged with
- changing fall leaves. I felt more connected to the physical environment
- around me than I had when I’d traveled the same route surrounded by
- metal and glass. I breathed in the air, my muscles relaxed, and I
- grinned like a giddy schoolchild.
+“E-bikes are like a miracle drug,” David Zipper, a transportation expert and
+Visiting Fellow at Harvard Kennedy School, told me. “They provide so much
+upside, not just for the riders, but for the people who are living around them
+too.”
- “E-bikes are like a miracle drug,” David Zipper, a transportation
- expert and Visiting Fellow at Harvard Kennedy School, told me. “They
- provide so much upside, not just for the riders, but for the people who
- are living around them too.”
+Of course, e-bikes aren’t going to replace every car on every trip. In a
+country where sprawling suburbs and strip malls, not protected bike lanes, are
+the norm, it’s unrealistic to expect e-bikes to replace cars in the way that
+the Model T replaced horses. But we don’t need everyone to ride an e-bike to
+work to make a big dent in our carbon-pollution problem. [76]A recent study
+found that if 5 percent of commuters were to switch to e-bikes as their mode of
+transportation, emissions would fall by 4 percent. As an individual, you don’t
+even need to sell your car to reduce your carbon footprint significantly. In
+2021, half of all trips in the United States were less than three miles,
+according to [77]the Bureau of Transportation Statistics. Making those short
+trips on an e-bike instead of in a car would likely save people money, cut
+their emissions, and improve their health and happiness.
- Of course, e-bikes aren’t going to replace every car on every trip. In
- a country where sprawling suburbs and strip malls, not protected bike
- lanes, are the norm, it’s unrealistic to expect e-bikes to replace cars
- in the way that the Model T replaced horses. But we don’t need everyone
- to ride an e-bike to work to make a big dent in our carbon-pollution
- problem. [62]A recent study found that if 5 percent of commuters were
- to switch to e-bikes as their mode of transportation, emissions would
- fall by 4 percent. As an individual, you don’t even need to sell your
- car to reduce your carbon footprint significantly. In 2021, half of all
- trips in the United States were less than three miles, according to
- [63]the Bureau of Transportation Statistics. Making those short trips
- on an e-bike instead of in a car would likely save people money, cut
- their emissions, and improve their health and happiness.
+E-bikes are such a no-brainer for individuals, and for the collective, that
+state and local governments [78]are now subsidizing them. In May, I asked Will
+Toor, the executive director of the Colorado Energy Office, to explain the
+state’s rationale for [79]a newly passed incentive that offers residents $450
+to get an e-bike. He dutifully ticked through the environmental benefits and
+potential cost savings for low-income people. Then he surprised me: The
+legislation, he added, was also about “putting more joy into the world.”
- E-bikes are such a no-brainer for individuals, and for the collective,
- that state and local governments [64]are now subsidizing them. In May,
- I asked Will Toor, the executive director of the Colorado Energy
- Office, to explain the state’s rationale for [65]a newly passed
- incentive that offers residents $450 to get an e-bike. He dutifully
- ticked through the environmental benefits and potential cost savings
- for low-income people. Then he surprised me: The legislation, he added,
- was also about “putting more joy into the world.”
+This story is part of the Atlantic Planet series supported by HHMI’s Science
+and Educational Media Group.
- This story is part of the Atlantic Planet series supported by HHMI’s
- Science and Educational Media Group.
-References
+References:
- Visible links:
- 1. https://www.theatlantic.com/feed/all/
- 2. https://www.theatlantic.com/feed/best-of/
- 3. https://www.theatlantic.com/health/archive/2023/10/reasons-to-get-e-bike-emissions-climate-change-benefits/675716/#main-content
- 4. https://www.theatlantic.com/most-popular/
- 5. https://www.theatlantic.com/latest/
- 6. https://www.theatlantic.com/newsletters/
- 7. https://www.theatlantic.com/politics/
- 8. https://www.theatlantic.com/ideas/
- 9. https://www.theatlantic.com/category/fiction/
- 10. https://www.theatlantic.com/technology/
- 11. https://www.theatlantic.com/science/
- 12. https://www.theatlantic.com/photo/
- 13. https://www.theatlantic.com/business/
- 14. https://www.theatlantic.com/culture/
- 15. https://www.theatlantic.com/projects/planet/
- 16. https://www.theatlantic.com/international/
- 17. https://www.theatlantic.com/books/
- 18. https://www.theatlantic.com/podcasts/
- 19. https://www.theatlantic.com/health/
- 20. https://www.theatlantic.com/education/
- 21. https://www.theatlantic.com/projects/
- 22. https://www.theatlantic.com/category/features/
- 23. https://www.theatlantic.com/family/
- 24. https://www.theatlantic.com/events/
- 25. https://www.theatlantic.com/category/washington-week-atlantic/
- 26. https://www.theatlantic.com/progress/
- 27. https://www.theatlantic.com/newsletters/
- 28. https://www.theatlantic.com/archive/
- 29. https://www.theatlantic.com/free-daily-crossword-puzzle/
- 30. https://www.theatlantic.com/magazine/
- 31. https://www.theatlantic.com/magazine/backissues/
- 32. https://accounts.theatlantic.com/products/gift
- 33. https://www.theatlantic.com/projects/dear-therapist/
- 34. https://www.theatlantic.com/free-daily-crossword-puzzle/
- 35. https://www.theatlantic.com/archive/
- 36. https://accounts.theatlantic.com/accounts/subscription/
- 37. https://www.theatlantic.com/most-popular/
- 38. https://www.theatlantic.com/latest/
- 39. https://www.theatlantic.com/newsletters/
- 40. https://accounts.theatlantic.com/login/
- 41. https://www.theatlantic.com/subscribe/navbar/
- 42. https://www.theatlantic.com/projects/planet/
- 43. https://www.theatlantic.com/projects/planet/
- 44. https://www.theatlantic.com/author/zoe-schlanger/
- 45. https://www.theatlantic.com/author/bathsheba-demuth/
- 46. https://www.theatlantic.com/author/ayurella-horn-muller/
- 47. https://www.theatlantic.com/author/saahil-desai/
- 48. https://www.theatlantic.com/health/
- 49. https://www.theatlantic.com/author/michael-thomas/
- 50. https://energy.mit.edu/news/us-passenger-cars/
- 51. https://qz.com/135509/more-americans-die-from-car-pollution-than-car-accidents
- 52. https://www.npr.org/sections/goatsandsoda/2023/02/01/1152893248/red-cobalt-congo-drc-mining-siddharth-kara
- 53. https://www.nrdc.org/stories/lithium-mining-leaving-chiles-indigenous-communities-high-and-dry-literally
- 54. https://www.theatlantic.com/science/archive/2023/04/electric-ev-rickshaw-sales-climate-change/673629/
- 55. https://newsroom.aaa.com/2022/08/annual-cost-of-new-car-ownership-crosses-10k-mark/
- 56. https://www.theatlantic.com/health/archive/2021/01/how-socialize-outside-winter/617520/
- 57. https://www.sciencedirect.com/science/article/abs/pii/S2214140518306054
- 58. https://www.theatlantic.com/business/archive/2018/02/seattle-car-commute/553589/
- 59. https://travelbehaviour.files.wordpress.com/2017/10/caw-summaryreport-onlineedition.pdf
- 60. https://www.reuters.com/article/us-commuting/long-commutes-may-be-bad-for-health-study-idUKBRE8470U520120508
- 61. https://www.sciencedirect.com/science/article/abs/pii/S2214140518305255
- 62. https://peopleforbikes.cdn.prismic.io/peopleforbikes/e3dad6f7-d81b-4e59-9208-b012406ffa8e_E-bike-Potential-Paper-05_15_19-Final.pdf
- 63. https://www.energy.gov/eere/vehicles/articles/fotw-1230-march-21-2022-more-half-all-daily-trips-were-less-three-miles-2021#:~:text=A research study for the,were greater than 50 miles.
- 64. https://electrek.co/2023/02/19/free-electric-bikes-rebates-us-cities-and-states/
- 65. https://www.cpr.org/2023/08/10/colorado-ebike-rebates-how-to-qualify/
-
- Hidden links:
- 67. https://www.theatlantic.com/
- 68. https://www.theatlantic.com/magazine/
- 69. https://www.theatlantic.com/
- 70. https://www.theatlantic.com/
- 71. https://www.theatlantic.com/science/archive/2024/01/winter-snow-loss-climate-change/677078/
- 72. https://www.theatlantic.com/science/archive/2024/01/alaska-arctic-voles-carbon-source-climate-change/677014/
- 73. https://www.theatlantic.com/health/archive/2023/12/disaster-kit-loss-memories-mental-health/676961/
- 74. https://www.theatlantic.com/technology/archive/2023/12/tesla-chatgpt-most-important-technology/676980/
+[1] https://www.theatlantic.com/health/archive/2023/10/reasons-to-get-e-bike-emissions-climate-change-benefits/675716/#main-content
+[2] https://www.theatlantic.com/
+[5] https://www.theatlantic.com/most-popular/
+[6] https://www.theatlantic.com/latest/
+[7] https://www.theatlantic.com/newsletters/
+[8] https://www.theatlantic.com/politics/
+[9] https://www.theatlantic.com/ideas/
+[10] https://www.theatlantic.com/category/fiction/
+[11] https://www.theatlantic.com/technology/
+[12] https://www.theatlantic.com/science/
+[13] https://www.theatlantic.com/photo/
+[14] https://www.theatlantic.com/business/
+[15] https://www.theatlantic.com/culture/
+[16] https://www.theatlantic.com/projects/planet/
+[17] https://www.theatlantic.com/international/
+[18] https://www.theatlantic.com/books/
+[19] https://www.theatlantic.com/podcasts/
+[20] https://www.theatlantic.com/health/
+[21] https://www.theatlantic.com/education/
+[22] https://www.theatlantic.com/projects/
+[23] https://www.theatlantic.com/category/features/
+[24] https://www.theatlantic.com/family/
+[25] https://www.theatlantic.com/events/
+[26] https://www.theatlantic.com/category/washington-week-atlantic/
+[27] https://www.theatlantic.com/progress/
+[28] https://www.theatlantic.com/newsletters/
+[29] https://www.theatlantic.com/archive/
+[30] https://www.theatlantic.com/free-daily-crossword-puzzle/
+[31] https://www.theatlantic.com/magazine/
+[32] https://www.theatlantic.com/magazine/
+[33] https://www.theatlantic.com/magazine/backissues/
+[34] https://accounts.theatlantic.com/products/gift
+[38] https://www.theatlantic.com/projects/dear-therapist/
+[39] https://www.theatlantic.com/free-daily-crossword-puzzle/
+[40] https://www.theatlantic.com/archive/
+[41] https://accounts.theatlantic.com/accounts/subscription/
+[43] https://www.theatlantic.com/most-popular/
+[44] https://www.theatlantic.com/latest/
+[45] https://www.theatlantic.com/newsletters/
+[46] https://www.theatlantic.com/
+[47] https://www.theatlantic.com/
+[48] https://accounts.theatlantic.com/login/
+[49] https://www.theatlantic.com/subscribe/navbar/
+[50] https://www.theatlantic.com/projects/planet/
+[51] https://www.theatlantic.com/projects/planet/
+[52] https://www.theatlantic.com/science/archive/2024/01/winter-snow-loss-climate-change/677078/
+[53] https://www.theatlantic.com/author/zoe-schlanger/
+[54] https://www.theatlantic.com/science/archive/2024/01/alaska-arctic-voles-carbon-source-climate-change/677014/
+[55] https://www.theatlantic.com/author/bathsheba-demuth/
+[56] https://www.theatlantic.com/health/archive/2023/12/disaster-kit-loss-memories-mental-health/676961/
+[57] https://www.theatlantic.com/author/ayurella-horn-muller/
+[58] https://www.theatlantic.com/technology/archive/2023/12/tesla-chatgpt-most-important-technology/676980/
+[59] https://www.theatlantic.com/author/saahil-desai/
+[60] https://www.theatlantic.com/health/
+[61] https://www.theatlantic.com/author/michael-thomas/
+[64] https://energy.mit.edu/news/us-passenger-cars/
+[65] https://qz.com/135509/more-americans-die-from-car-pollution-than-car-accidents
+[66] https://www.npr.org/sections/goatsandsoda/2023/02/01/1152893248/red-cobalt-congo-drc-mining-siddharth-kara
+[67] https://www.nrdc.org/stories/lithium-mining-leaving-chiles-indigenous-communities-high-and-dry-literally
+[68] https://www.theatlantic.com/science/archive/2023/04/electric-ev-rickshaw-sales-climate-change/673629/
+[69] https://newsroom.aaa.com/2022/08/annual-cost-of-new-car-ownership-crosses-10k-mark/
+[70] https://www.theatlantic.com/health/archive/2021/01/how-socialize-outside-winter/617520/
+[71] https://www.sciencedirect.com/science/article/abs/pii/S2214140518306054
+[72] https://www.theatlantic.com/business/archive/2018/02/seattle-car-commute/553589/
+[73] https://travelbehaviour.files.wordpress.com/2017/10/caw-summaryreport-onlineedition.pdf
+[74] https://www.reuters.com/article/us-commuting/long-commutes-may-be-bad-for-health-study-idUKBRE8470U520120508
+[75] https://www.sciencedirect.com/science/article/abs/pii/S2214140518305255
+[76] https://peopleforbikes.cdn.prismic.io/peopleforbikes/e3dad6f7-d81b-4e59-9208-b012406ffa8e_E-bike-Potential-Paper-05_15_19-Final.pdf
+[77] https://www.energy.gov/eere/vehicles/articles/fotw-1230-march-21-2022-more-half-all-daily-trips-were-less-three-miles-2021#:~:text=A%20research%20study%20for%20the,were%20greater%20than%2050%20miles.
+[78] https://electrek.co/2023/02/19/free-electric-bikes-rebates-us-cities-and-states/
+[79] https://www.cpr.org/2023/08/10/colorado-ebike-rebates-how-to-qualify/
diff --git a/static/archive/www-theverge-com-mjsr9z.txt b/static/archive/www-theverge-com-mjsr9z.txt
index 09946bf..6939343 100644
--- a/static/archive/www-theverge-com-mjsr9z.txt
+++ b/static/archive/www-theverge-com-mjsr9z.txt
@@ -1,476 +1,463 @@
- #[1]The Verge
+[1]Skip to main content
+[2]The Verge logo.[3]The Verge homepage
- [2]Skip to main content
- The Verge logo.[3]The Verge homepage
+ • [4]The Verge homepageThe Verge logo./
+ • [5]Tech/
+ • [6]Reviews/
+ • [7]Science/
+ • [8]Entertainment/
+ • MoreMenu
- * [4]The Verge homepageThe Verge logo./
- * [5]Tech/
- * [6]Reviews/
- * [7]Science/
- * [8]Entertainment/
- * (BUTTON) MoreMenuExpand
+[10]The Verge logo.
+Menu
- The Verge logo.
- (BUTTON) MenuExpand
-
- * [9]Platformer/
- * [10]Apps/
- * [11]Tech
+ • [12]Platformer/
+ • [13]Apps/
+ • [14]Tech
Why note-taking apps don’t make us smarter
Why note-taking apps don’t make us smarter
- /
+/
They’re designed for storage, not sparking insights. Can AI change that?
- By [12]Casey Newton, a contributing editor who has been writing about
- tech for over 10 years. He founded Platformer, a newsletter about Big
- Tech and democracy.
- Aug 25, 2023, 2:30 PM UTC| (BUTTON) Comments
+By [15]Casey Newton, a contributing editor who has been writing about tech for
+over 10 years. He founded Platformer, a newsletter about Big Tech and
+democracy.
+
+Aug 25, 2023, 2:30 PM UTC|
Share this story
- * (BUTTON)
- * (BUTTON)
- * (BUTTON)
-
- Screenshots of the note-taking app Obsidian.
- Screenshots of the note-taking app Obsidian. Image: Obsidian
-
- This is Platformer, a newsletter on the intersection of Silicon Valley
- and democracy from Casey Newton and Zoë Schiffer. [13]Sign up here.
- __________________________________________________________________
-
- Today let’s step outside the news cycle and turn our attention toward a
- topic I’m deeply invested in but only rarely write about: productivity
- platforms. For decades now, software tools have promised to make
- working life easier. But on one critical dimension — their ability to
- improve our thinking — they don’t seem to be making much progress at
- all.
-
- Meanwhile, the arrival of generative artificial intelligence could make
- the tools we use more powerful than ever — or they could turn out to be
- just another mirage.
-
- To understand where things went wrong, I want to focus on the humble
- note-taking app: the place where, for so many of us, thinking begins.
-
- I.
-
- Earlier this week I read a story about farmers. “America’s Farmers Are
- Bogged Down by Data,” read the headline on [14]Belle Lin’s story in the
- Wall Street Journal. I thought to myself: You and me both, farmer! And
- I read the piece.
-
- Over the past decade, farmers have been offered all manner of software
- tools to analyze and manage their crops. In general, though, the more
- software that farmers use, the more they find themselves overwhelmed by
- data that the tools collect. “We’re collecting so much data that you’re
- almost paralyzed with having to analyze it all,” one farmer told the
- Journal.
-
- As a journalist, I’ve never collected as much data as I do now. The
- collapse of Twitter has me browsing four or five text-based social
- feeds a day, scanning for news and thoughtful conversation. The growing
- popularity of arXiv and pre-prints in general has left me with a stack
- of research that I will never get through. Book galleys pile up in my
- house.
- A screenshot of the app Notion. A screenshot of the app Notion.
- A screenshot of the app Notion. A screenshot of the app Notion.
- A screenshot of the app Notion. Image: Notion
-
- Meanwhile, all day long I browse the web. Stories that might belong in
- Platformer get saved into a database in the productivity platform
- Notion. Every link that has ever been in this newsletter is stored
- there, in many cases with the full article text.
-
- Collectively, this material offers me an abundance of riches — far more
- to work with than any beat reporter had such easy access to even 15
- years ago.
-
- And yet most days I find myself with the same problem as the farmer: I
- have so much information at hand that I feel paralyzed.
-
- II.
-
- One solution to this data paralysis is to take notes. As a journalist,
- of course, I have always taken notes. A few years ago, I thought we had
- seen some true breakthroughs in note-taking, and increasingly put my
- faith in those tools not just to capture my writing but to improve the
- quality of my thinking.
-
- The breakthrough tool was [15]Roam Research. In 2021, I wrote here
- about [16]my first year using the subscription-based software, which
- had two key insights into knowledge work. One was to make professional
- note-taking feel more like journaling. It turns out that a fresh note
- created each day, labeled with a date, is a good canvas for collecting
- transient thoughts, which can serve as a springboard into deeper
- thinking.
-
- The second is known to note-taking nerds as “[17]bidirectional
- linking.” Standard links, like the ones you find on the web, go in only
- one direction — from one page to another. In a note-taking app,
- bidirectional links join two pages together. This effectively lets you
- add backlinks to any concept — a company that’s important to you, say,
- or a concept that’s on your mind — and then let you browse everything
- you’ve collected related to that concept at your leisure.
- A graphic from Roam illustrating bidirectional linking. A graphic from
- Roam illustrating bidirectional linking.
- A graphic from Roam illustrating bidirectional linking. A graphic from
- Roam illustrating bidirectional linking.
- A graphic from Roam illustrating bidirectional linking. Image: Roam
-
- On one level, that’s not so different from adding tags to notes. But
- tags are more about search. Bidirectional links, which some apps show
- you on pages that include snippets of all the other notes that contain
- the same link, are more about browsing and rediscovery.
-
- Initially, I threw myself into this kind of associative note-taking. I
- gathered links around concepts I wanted to explore (“the internet
- enables information to travel too quickly,” for example, or social
- networks and polarization). When I had an interesting conversation with
- a person, I would add notes to a personal page I had created for them.
- A few times a week, I would revisit those notes.
-
- I waited for the insights to come.
-
- And waited. And waited.
-
- Note-taking apps are up against a much stronger foe
-
- My gusto for concept-based, link-heavy note-taking diminished. Roam’s
- development slowed to a crawl, and I spent a season with the
- lightweight, mostly free alternative known as [18]Obsidian. Obsidian’s
- brutalist design wore on me, though, and eventually I decamped for the
- more polished user interface of [19]Mem. (These apps all enable the
- exporting of your notes in Markdown, making switching relatively
- painless.)
-
- I continue to journal most days, and occasionally find myself working
- to refine one concept or another among those notes.
-
- But the original promise of Roam — that it would improve my thinking by
- helping me to build a knowledge base and discover new ideas — fizzled
- completely.
-
- III.
-
- One interpretation of these events is that the software failed: that
- journaling and souped-up links simply don’t have the power some of us
- once hoped they did.
-
- Another view, though, is that they are up against a much stronger foe —
- the infinite daily distractions of the internet.
-
- Note-taking, after all, does not take place in a vacuum. It takes place
- on your computer, next to email, and Slack, and Discord, and iMessage,
- and the text-based social network of your choosing. In the era of
- alt-tabbing between these and other apps, our ability to build
- knowledge and draw connections is permanently challenged by what might
- be our ultimately futile efforts to multitask.
-
- Ezra Klein wrote beautifully about this situation this week [20]in the
- New York Times:
-
- Gloria Mark, a professor of information science at the University of
- California, Irvine, and the author of “[21]Attention Span,” started
- researching the way people used computers in 2004. The average time
- people spent on a single screen was 2.5 minutes. “I was astounded,”
- she told me. “That was so much worse than I’d thought it would be.”
- But that was just the beginning. By 2012, Mark and her colleagues
- found the average time on a single task was 75 seconds. Now it’s
- down to about 47.
-
- This is an acid bath for human cognition. Multitasking is mostly a
- myth. We can focus on one thing at a time. “It’s like we have an
- internal whiteboard in our minds,” Mark said. “If I’m working on one
- task, I have all the info I need on that mental whiteboard. Then I
- switch to email. I have to mentally erase that whiteboard and write
- all the information I need to do email. And just like on a real
- whiteboard, there can be a residue in our minds. We may still be
- thinking of something from three tasks ago.”
-
- My first thought upon reading this was that it seems rare for me to
- spend even 47 seconds looking at one screen on my computer without at
- least glancing at another. (I bought a 38-inch widescreen monitor for
- the express purpose of being able to glance at many windows
- simultaneously. At the time I understood this as a tool for enhancing
- my productivity.)
-
- My second thought is that if you want to take good notes, you have to
- first extract your mind from the acid bath.
-
- IV.
-
- Klein’s piece starts from the observation that productivity growth is
- now about half of what it was in the 1950s and ‘60s. The internet’s
- arrival briefly speeded it up, he writes, but the more we stared at our
- screens the slower our productivity improved. He worries that AI will
- have a similar effect on the economy — promising to make us more
- productive, while simultaneously inventing so many new distractions and
- entertainments that they overwhelm and paralyze us.
-
- The piece stuck with me, because there is one specific way I am
- counting on AI to make me more productive. It goes back to that
- database of links I’ve been building in Notion, and the insights I was
- hoping to get out of Roam.
- Saving an article in Mem. Saving an article in Mem.
- Saving an article in Mem. Saving an article in Mem.
- Saving an article in Mem. Image: Mem
-
- Earlier this year, like many productivity tools, Notion added a handful
- of AI features. I use two of them in my links database. One extracts
- the names of any companies mentioned in an article, creating a kind of
- automatic tagging system. The other provides a two- or three-sentence
- summary of the article I’m saving.
-
- Neither of these, in practice, is particularly useful. Tags might
- theoretically be useful for revisiting old material, but databases are
- not designed to be browsed. And while we publish summaries of news
- articles in each edition of Platformer, we wouldn’t use AI-written
- summaries: among other reasons, they often miss important details and
- context.
-
- At the same time, the database contains nearly three years of links to
- every subject I cover here, along with the complete text of thousands
- of articles. It is here, and not in a note-taking app, that knowledge
- of my beat has been accreting over the past few years. If only I could
- access that knowledge in some way that went beyond my memory.
-
- It’s here that AI should be able to help. Within some reasonable period
- of time, I expect that I will be able to talk to my Notion database as
- if it’s ChatGPT. If I could, I imagine I would talk to it all the time.
-
- Much of journalism simply involves remembering relevant events from the
- past. An AI-powered link database has a perfect memory; all it’s
- missing is a usable chat interface. If it had one, it might be a
- perfect research assistant.
-
- Today’s chatbots can’t do any of this to a reporter’s standard
-
- I imagine using it to generate little briefing documents to help me
- when I return to a subject after some time away. Catch me up on
- Canada’s fight with Meta over news, I might say. Make me a timeline of
- events at Twitter since Elon Musk bought it. Show me coverage of
- deepfakes over the past three months.
-
- Today’s chatbots can’t do any of this to a reporter’s standard. The
- training data often stops in 2021, for one thing. The bots continue to
- make stuff up, and struggle to cite their sources.
-
- But if I could chat in natural language with a massive archive, built
- from hand-picked trustworthy sources? That seems powerful to me, at
- least in the abstract.
-
- Of course, the output from this kind of AI tool has to be trustworthy.
- A significant problem with using AI tools to summarize things is that
- you can’t trust the summary unless you read all the relevant documents
- yourself — defeating the point of asking for a summary in the first
- place.
-
- Still, if you are the sort of productivity-tool optimist who will try
- any to-do list or calendar app on the off chance it makes you even a
- little happier at work, it seems to me that a database you can talk to
- might be the next-generation note-taking tool we have been waiting for.
-
- V.
-
- I’ve learned something else about note-taking apps, though, since my
- mania for them began in 2020.
-
- In short: it is probably a mistake, in the end, to ask software to
- improve our thinking. Even if you can rescue your attention from the
- acid bath of the internet; even if you can gather the most interesting
- data and observations into the app of your choosing; even if you
- revisit that data from time to time — this will not be enough. It might
- not even be worth trying.
-
- I’ll admit to having forgotten those questions over the past couple
- years
-
- The reason, sadly, is that thinking takes place in your brain. And
- thinking is an active pursuit — one that often happens when you are
- spending long stretches of time staring into space, then writing a bit,
- and then staring into space a bit more. It’s here here that the
- connections are made and the insights are formed. And it is a process
- that stubbornly resists automation.
-
- Which is not to say that software can’t help. Andy Matuschak, a
- researcher whose [22]spectacular website offers a feast of thinking
- about notes and note-taking, observes [23]that note-taking apps
- emphasize displaying and manipulating notes, but never making sense
- between them. Before I totally resign myself to the idea that a
- note-taking app can’t solve my problems, I will admit that on some
- fundamental level no one has really tried.
-
- “The goal is not to take notes — the goal is to think effectively,”
- [24]Matuschak writes. “Better questions are ‘what practices can help me
- reliably develop insights over time?’ [and] ‘how can I shepherd my
- attention effectively?’”
-
- I’ll admit to having forgotten those questions over the past couple
- years as I kept filling up documents with transient strings of text
- inside expensive software. And I accept that to be a better thinker,
- I’ll have to devote more time and attention to wrestling with what I
- find.
-
- If there’s a friendly AI to help me do that, though, I’ll be first in
- line to try it.
-
- IFRAME: [25]https://www.platformer.news/embed
-
- (BUTTON) Comments
- Most Popular
- 1. [26]
-
-Apple Vision Pro hands-on, again, for the first time
- ______________________________________________________________
-
- 2. [27]
+ •
+ •
+ •
+
+Screenshots of the note-taking app Obsidian.
+Screenshots of the note-taking app Obsidian. Image: Obsidian
+
+This is Platformer, a newsletter on the intersection of Silicon Valley and
+democracy from Casey Newton and Zoë Schiffer. [20]Sign up here.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+Today let’s step outside the news cycle and turn our attention toward a topic
+I’m deeply invested in but only rarely write about: productivity platforms. For
+decades now, software tools have promised to make working life easier. But on
+one critical dimension — their ability to improve our thinking — they don’t
+seem to be making much progress at all.
-Google layoffs continue with ‘hundreds’ from sales team
- ______________________________________________________________
+Meanwhile, the arrival of generative artificial intelligence could make the
+tools we use more powerful than ever — or they could turn out to be just
+another mirage.
- 3. [28]
+To understand where things went wrong, I want to focus on the humble
+note-taking app: the place where, for so many of us, thinking begins.
-Microsoft’s new Copilot Pro brings AI-powered Office features to the rest of
-us
- ______________________________________________________________
+I.
- 4. [29]
+Earlier this week I read a story about farmers. “America’s Farmers Are Bogged
+Down by Data,” read the headline on [21]Belle Lin’s story in the Wall Street
+Journal. I thought to myself: You and me both, farmer! And I read the piece.
-Google’s latest layoffs are just the beginning
- ______________________________________________________________
+Over the past decade, farmers have been offered all manner of software tools to
+analyze and manage their crops. In general, though, the more software that
+farmers use, the more they find themselves overwhelmed by data that the tools
+collect. “We’re collecting so much data that you’re almost paralyzed with
+having to analyze it all,” one farmer told the Journal.
+
+As a journalist, I’ve never collected as much data as I do now. The collapse of
+Twitter has me browsing four or five text-based social feeds a day, scanning
+for news and thoughtful conversation. The growing popularity of arXiv and
+pre-prints in general has left me with a stack of research that I will never
+get through. Book galleys pile up in my house.
+
+A screenshot of the app Notion.A screenshot of the app Notion.
+A screenshot of the app Notion.A screenshot of the app Notion.
+A screenshot of the app Notion. Image: Notion
+
+Meanwhile, all day long I browse the web. Stories that might belong in
+Platformer get saved into a database in the productivity platform Notion. Every
+link that has ever been in this newsletter is stored there, in many cases with
+the full article text.
+
+Collectively, this material offers me an abundance of riches — far more to work
+with than any beat reporter had such easy access to even 15 years ago.
+
+And yet most days I find myself with the same problem as the farmer: I have so
+much information at hand that I feel paralyzed.
+
+II.
+
+One solution to this data paralysis is to take notes. As a journalist, of
+course, I have always taken notes. A few years ago, I thought we had seen some
+true breakthroughs in note-taking, and increasingly put my faith in those tools
+not just to capture my writing but to improve the quality of my thinking.
+
+The breakthrough tool was [22]Roam Research. In 2021, I wrote here about [23]my
+first year using the subscription-based software, which had two key insights
+into knowledge work. One was to make professional note-taking feel more like
+journaling. It turns out that a fresh note created each day, labeled with a
+date, is a good canvas for collecting transient thoughts, which can serve as a
+springboard into deeper thinking.
+
+The second is known to note-taking nerds as “[24]bidirectional linking.”
+Standard links, like the ones you find on the web, go in only one direction —
+from one page to another. In a note-taking app, bidirectional links join two
+pages together. This effectively lets you add backlinks to any concept — a
+company that’s important to you, say, or a concept that’s on your mind — and
+then let you browse everything you’ve collected related to that concept at your
+leisure.
+
+A graphic from Roam illustrating bidirectional linking.A graphic from Roam
+illustrating bidirectional linking.
+A graphic from Roam illustrating bidirectional linking.A graphic from Roam
+illustrating bidirectional linking.
+A graphic from Roam illustrating bidirectional linking. Image: Roam
+
+On one level, that’s not so different from adding tags to notes. But tags are
+more about search. Bidirectional links, which some apps show you on pages that
+include snippets of all the other notes that contain the same link, are more
+about browsing and rediscovery.
+
+Initially, I threw myself into this kind of associative note-taking. I gathered
+links around concepts I wanted to explore (“the internet enables information to
+travel too quickly,” for example, or social networks and polarization). When I
+had an interesting conversation with a person, I would add notes to a personal
+page I had created for them. A few times a week, I would revisit those notes.
+
+I waited for the insights to come.
+
+And waited. And waited.
+
+Note-taking apps are up against a much stronger foe
+
+My gusto for concept-based, link-heavy note-taking diminished. Roam’s
+development slowed to a crawl, and I spent a season with the lightweight,
+mostly free alternative known as [25]Obsidian. Obsidian’s brutalist design wore
+on me, though, and eventually I decamped for the more polished user interface
+of [26]Mem. (These apps all enable the exporting of your notes in Markdown,
+making switching relatively painless.)
+
+I continue to journal most days, and occasionally find myself working to refine
+one concept or another among those notes.
+
+But the original promise of Roam — that it would improve my thinking by helping
+me to build a knowledge base and discover new ideas — fizzled completely.
+
+III.
+
+One interpretation of these events is that the software failed: that journaling
+and souped-up links simply don’t have the power some of us once hoped they did.
+
+Another view, though, is that they are up against a much stronger foe — the
+infinite daily distractions of the internet.
+
+Note-taking, after all, does not take place in a vacuum. It takes place on your
+computer, next to email, and Slack, and Discord, and iMessage, and the
+text-based social network of your choosing. In the era of alt-tabbing between
+these and other apps, our ability to build knowledge and draw connections is
+permanently challenged by what might be our ultimately futile efforts to
+multitask.
+
+Ezra Klein wrote beautifully about this situation this week [27]in the New York
+Times:
+
+ Gloria Mark, a professor of information science at the University of
+ California, Irvine, and the author of “[28]Attention Span,” started
+ researching the way people used computers in 2004. The average time people
+ spent on a single screen was 2.5 minutes. “I was astounded,” she told me.
+ “That was so much worse than I’d thought it would be.” But that was just
+ the beginning. By 2012, Mark and her colleagues found the average time on a
+ single task was 75 seconds. Now it’s down to about 47.
+
+ This is an acid bath for human cognition. Multitasking is mostly a myth. We
+ can focus on one thing at a time. “It’s like we have an internal whiteboard
+ in our minds,” Mark said. “If I’m working on one task, I have all the info
+ I need on that mental whiteboard. Then I switch to email. I have to
+ mentally erase that whiteboard and write all the information I need to do
+ email. And just like on a real whiteboard, there can be a residue in our
+ minds. We may still be thinking of something from three tasks ago.”
+
+My first thought upon reading this was that it seems rare for me to spend even
+47 seconds looking at one screen on my computer without at least glancing at
+another. (I bought a 38-inch widescreen monitor for the express purpose of
+being able to glance at many windows simultaneously. At the time I understood
+this as a tool for enhancing my productivity.)
+
+My second thought is that if you want to take good notes, you have to first
+extract your mind from the acid bath.
+
+IV.
+
+Klein’s piece starts from the observation that productivity growth is now about
+half of what it was in the 1950s and ‘60s. The internet’s arrival briefly
+speeded it up, he writes, but the more we stared at our screens the slower our
+productivity improved. He worries that AI will have a similar effect on the
+economy — promising to make us more productive, while simultaneously inventing
+so many new distractions and entertainments that they overwhelm and paralyze
+us.
+
+The piece stuck with me, because there is one specific way I am counting on AI
+to make me more productive. It goes back to that database of links I’ve been
+building in Notion, and the insights I was hoping to get out of Roam.
+
+Saving an article in Mem.Saving an article in Mem.
+Saving an article in Mem.Saving an article in Mem.
+Saving an article in Mem. Image: Mem
+
+Earlier this year, like many productivity tools, Notion added a handful of AI
+features. I use two of them in my links database. One extracts the names of any
+companies mentioned in an article, creating a kind of automatic tagging system.
+The other provides a two- or three-sentence summary of the article I’m saving.
+
+Neither of these, in practice, is particularly useful. Tags might theoretically
+be useful for revisiting old material, but databases are not designed to be
+browsed. And while we publish summaries of news articles in each edition of
+Platformer, we wouldn’t use AI-written summaries: among other reasons, they
+often miss important details and context.
- 5. [30]
+At the same time, the database contains nearly three years of links to every
+subject I cover here, along with the complete text of thousands of articles. It
+is here, and not in a note-taking app, that knowledge of my beat has been
+accreting over the past few years. If only I could access that knowledge in
+some way that went beyond my memory.
-Apple Watch drops blood oxygen features to dodge the import ban
- ______________________________________________________________
+It’s here that AI should be able to help. Within some reasonable period of
+time, I expect that I will be able to talk to my Notion database as if it’s
+ChatGPT. If I could, I imagine I would talk to it all the time.
+
+Much of journalism simply involves remembering relevant events from the past.
+An AI-powered link database has a perfect memory; all it’s missing is a usable
+chat interface. If it had one, it might be a perfect research assistant.
+
+Today’s chatbots can’t do any of this to a reporter’s standard
+
+I imagine using it to generate little briefing documents to help me when I
+return to a subject after some time away. Catch me up on Canada’s fight with
+Meta over news, I might say. Make me a timeline of events at Twitter since Elon
+Musk bought it. Show me coverage of deepfakes over the past three months.
+
+Today’s chatbots can’t do any of this to a reporter’s standard. The training
+data often stops in 2021, for one thing. The bots continue to make stuff up,
+and struggle to cite their sources.
+
+But if I could chat in natural language with a massive archive, built from
+hand-picked trustworthy sources? That seems powerful to me, at least in the
+abstract.
+
+Of course, the output from this kind of AI tool has to be trustworthy. A
+significant problem with using AI tools to summarize things is that you can’t
+trust the summary unless you read all the relevant documents yourself —
+defeating the point of asking for a summary in the first place.
+
+Still, if you are the sort of productivity-tool optimist who will try any to-do
+list or calendar app on the off chance it makes you even a little happier at
+work, it seems to me that a database you can talk to might be the
+next-generation note-taking tool we have been waiting for.
+
+V.
+
+I’ve learned something else about note-taking apps, though, since my mania for
+them began in 2020.
+
+In short: it is probably a mistake, in the end, to ask software to improve our
+thinking. Even if you can rescue your attention from the acid bath of the
+internet; even if you can gather the most interesting data and observations
+into the app of your choosing; even if you revisit that data from time to time
+— this will not be enough. It might not even be worth trying.
+
+I’ll admit to having forgotten those questions over the past couple years
+
+The reason, sadly, is that thinking takes place in your brain. And thinking is
+an active pursuit — one that often happens when you are spending long stretches
+of time staring into space, then writing a bit, and then staring into space a
+bit more. It’s here here that the connections are made and the insights are
+formed. And it is a process that stubbornly resists automation.
+
+Which is not to say that software can’t help. Andy Matuschak, a researcher
+whose [29]spectacular website offers a feast of thinking about notes and
+note-taking, observes [30]that note-taking apps emphasize displaying and
+manipulating notes, but never making sense between them. Before I totally
+resign myself to the idea that a note-taking app can’t solve my problems, I
+will admit that on some fundamental level no one has really tried.
+
+“The goal is not to take notes — the goal is to think effectively,” [31]
+Matuschak writes. “Better questions are ‘what practices can help me reliably
+develop insights over time?’ [and] ‘how can I shepherd my attention
+effectively?’”
+
+I’ll admit to having forgotten those questions over the past couple years as I
+kept filling up documents with transient strings of text inside expensive
+software. And I accept that to be a better thinker, I’ll have to devote more
+time and attention to wrestling with what I find.
+
+If there’s a friendly AI to help me do that, though, I’ll be first in line to
+try it.
+
+Most Popular
+
+ 1. [33]
+
+ Apple Vision Pro hands-on, again, for the first time
+
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ 2. [34]
+
+ Google layoffs continue with ‘hundreds’ from sales team
+
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ 3. [35]
+
+ The AI phones are coming
+
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ 4. [36]
+
+ Google quietly updates Chrome’s incognito warning in wake of tracking
+ lawsuit
+
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ 5. [37]
+
+ Nvidia RTX 4070 Super review: a super performance bump for $599
+
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Verge Deals
- / Sign up for Verge Deals to get deals on products we've tested sent to
- your inbox daily.
+/ Sign up for Verge Deals to get deals on products we've tested sent to your
+inbox daily.
- Email (required) ____________________ (BUTTON) Sign up
+Email (required)[38][ ]Sign up
+By submitting your email, you agree to our [40]Terms and [41]Privacy Notice.
+This site is protected by reCAPTCHA and the Google [42]Privacy Policy and [43]
+Terms of Service apply.
+From our sponsor
- By submitting your email, you agree to our [31]Terms and [32]Privacy
- Notice. This site is protected by reCAPTCHA and the Google [33]Privacy
- Policy and [34]Terms of Service apply.
- From our sponsor
+[44]
- Advertiser Content From Sponsor logo
- Sponsor thumbnail
+[45]
+Advertiser Content FromSponsor logo
+Sponsor thumbnail
-More from [35]Apps
+More from [46]Apps
- * An image showing the WhatsApp logo in black An image showing the
- WhatsApp logo in black
- [36]WhatsApp tests voice messages that disappear after your recipient
- hears them
- * WhatsApp logo on a green, black, and white background WhatsApp logo
- on a green, black, and white background
- [37]WhatsApp will soon let you stay logged in to two accounts at once
- * A screenshot of widgets from Pixel Pals. A screenshot of widgets
- from Pixel Pals.
- [38]The creator of Apollo for Reddit has moved onto smaller and
- weirder things
- * A picture of the Internal Revenue Service headquarters in
- Washington, DC. A picture of the Internal Revenue Service
- headquarters in Washington, DC.
- [39]13 states join the IRS direct-file test after tax prep firms
- dropped the ball
- * Advertiser Content From Sponsor logo
+ • An image showing the WhatsApp logo in blackAn image showing the WhatsApp
+ logo in black
+
+ [47]WhatsApp tests voice messages that disappear after your recipient hears
+ them
+
+ • WhatsApp logo on a green, black, and white backgroundWhatsApp logo on a
+ green, black, and white background
+
+ [48]WhatsApp will soon let you stay logged in to two accounts at once
+
+ • A screenshot of widgets from Pixel Pals.A screenshot of widgets from Pixel
+ Pals.
+
+ [49]The creator of Apollo for Reddit has moved onto smaller and weirder
+ things
+
+ • A picture of the Internal Revenue Service headquarters in Washington, DC.A
+ picture of the Internal Revenue Service headquarters in Washington, DC.
+
+ [50]13 states join the IRS direct-file test after tax prep firms dropped
+ the ball
+
+ •
+ [51]
+ Advertiser Content FromSponsor logo
+
+ [52]
+
+[53]The Verge logo.
+
+ • [54]Terms of Use
+ • [55]Privacy Notice
+ • [56]Cookie Policy
+ • [57]Do Not Sell Or Share My Personal Info
+ • [58]Licensing FAQ
+ • [59]Accessibility
+ • [60]Platform Status
+ • [61]How We Rate and Review Products
+
+ • [62]Contact
+ • [63]Tip Us
+ • [64]Community Guidelines
+ • [65]About
+ • [66]Ethics Statement
+
+The Verge is a vox media network
+
+ • [67]Advertise with us
+ • [68]Jobs @ Vox Media
+
+© 2024 [69]Vox Media, LLC. All Rights Reserved
- The Verge logo.
- * [40]Terms of Use
- * [41]Privacy Notice
- * [42]Cookie Policy
- * [43]Do Not Sell Or Share My Personal Info
- * [44]Licensing FAQ
- * [45]Accessibility
- * [46]Platform Status
- * [47]How We Rate and Review Products
+References:
- * [48]Contact
- * [49]Tip Us
- * [50]Community Guidelines
- * [51]About
- * [52]Ethics Statement
-
- The Verge is a vox media network
- * [53]Advertise with us
- * [54]Jobs @ Vox Media
-
- © 2024 [55]Vox Media, LLC. All Rights Reserved
-
-References
-
- Visible links:
- 1. https://www.theverge.com/rss/index.xml
- 2. https://www.theverge.com/2023/8/25/23845590/note-taking-apps-ai-chat-distractions-notion-roam-mem-obsidian#content
- 3. https://www.theverge.com/
- 4. https://www.theverge.com/
- 5. https://www.theverge.com/tech
- 6. https://www.theverge.com/reviews
- 7. https://www.theverge.com/science
- 8. https://www.theverge.com/entertainment
- 9. https://www.theverge.com/platformer
- 10. https://www.theverge.com/apps
- 11. https://www.theverge.com/tech
- 12. https://www.theverge.com/authors/casey-newton
- 13. https://www.platformer.news/
- 14. https://www.wsj.com/articles/americas-farmers-are-bogged-down-by-data-524f0a4d
- 15. https://roamresearch.com/
- 16. https://www.platformer.news/p/notes-on-a-year-using-roam-research
- 17. https://maggieappleton.com/bidirectionals
- 18. https://obsidian.md/
- 19. https://get.mem.ai/
- 20. https://www.nytimes.com/2023/05/28/opinion/artificial-intelligence-thinking-minds-concentration.html
- 21. https://www.harpercollins.com/products/attention-span-gloria-mark?variant=40346590117922
- 22. https://notes.andymatuschak.org/§Note-writing_systems
- 23. https://notes.andymatuschak.org/§Note-writing_systems?stackedNotes=zsRuFxYgckGS81tr2eiBAP
- 24. https://notes.andymatuschak.org/§Note-writing_systems?stackedNotes=z8V2q398qu89vdJ73N2BEYCgevMqux3yxQUAC&stackedNotes=z7kEFe6NfUSgtaDuUjST1oczKKzQQeQWk4Dbc
- 25. https://www.platformer.news/embed
- 26. https://www.theverge.com/24040075/apple-vision-pro-hands-on-virtual-reality
- 27. https://www.theverge.com/2024/1/16/24040093/google-layoffs-ad-sales-team
- 28. https://www.theverge.com/2024/1/15/24038711/microsoft-copilot-pro-office-ai-apps
- 29. https://www.theverge.com/2024/1/14/24038397/google-layoffs-just-the-beginning
- 30. https://www.theverge.com/2024/1/15/24034324/apple-watch-ban-us-customs-decision
- 31. https://www.voxmedia.com/legal/terms-of-use
- 32. https://www.voxmedia.com/legal/privacy-notice
- 33. https://policies.google.com/privacy
- 34. https://policies.google.com/terms
- 35. https://www.theverge.com/apps
- 36. https://www.theverge.com/2023/10/19/23923648/whatsapp-view-once-voice-messages-notes-beta-test
- 37. https://www.theverge.com/2023/10/19/23923113/whatsapp-stay-logged-in-two-accounts-meta
- 38. https://www.theverge.com/2023/10/18/23922707/pixel-pals-language-widget-christian-selig-apollo
- 39. https://www.theverge.com/2023/10/18/23922150/irs-direct-file-pilot-available-13-states-income-tax-2024
- 40. https://www.voxmedia.com/legal/terms-of-use
- 41. https://www.voxmedia.com/legal/privacy-notice
- 42. https://www.voxmedia.com/legal/cookie-policy
- 43. https://www.theverge.com/contact
- 44. https://www.voxmedia.com/pages/licensing
- 45. https://www.voxmedia.com/legal/accessibility
- 46. https://status.voxmedia.com/
- 47. https://www.theverge.com/pages/how-we-rate
- 48. https://www.theverge.com/contact-the-verge
- 49. https://www.theverge.com/a/tip-us-secure-contact-email
- 50. https://www.theverge.com/community-guidelines
- 51. https://www.theverge.com/about-the-verge
- 52. https://www.theverge.com/ethics-statement
- 53. https://www.voxmedia.com/vox-advertising
- 54. https://jobs.voxmedia.com/
- 55. https://www.voxmedia.com/
-
- Hidden links:
- 57. https://www.theverge.com/
- 58. https://www.theverge.com/
- 59. http://theverge.com/
- 60. http://theverge.com/
- 61. http://theverge.com/
- 62. http://theverge.com/
- 63. https://www.theverge.com/
+[1] https://www.theverge.com/2023/8/25/23845590/note-taking-apps-ai-chat-distractions-notion-roam-mem-obsidian#content
+[2] https://www.theverge.com/
+[3] https://www.theverge.com/
+[4] https://www.theverge.com/
+[5] https://www.theverge.com/tech
+[6] https://www.theverge.com/reviews
+[7] https://www.theverge.com/science
+[8] https://www.theverge.com/entertainment
+[10] https://www.theverge.com/
+[12] https://www.theverge.com/platformer
+[13] https://www.theverge.com/apps
+[14] https://www.theverge.com/tech
+[15] https://www.theverge.com/authors/casey-newton
+[20] https://www.platformer.news/
+[21] https://www.wsj.com/articles/americas-farmers-are-bogged-down-by-data-524f0a4d
+[22] https://roamresearch.com/
+[23] https://www.platformer.news/p/notes-on-a-year-using-roam-research
+[24] https://maggieappleton.com/bidirectionals
+[25] https://obsidian.md/
+[26] https://get.mem.ai/
+[27] https://www.nytimes.com/2023/05/28/opinion/artificial-intelligence-thinking-minds-concentration.html
+[28] https://www.harpercollins.com/products/attention-span-gloria-mark?variant=40346590117922
+[29] https://notes.andymatuschak.org/%C2%A7Note-writing_systems
+[30] https://notes.andymatuschak.org/%C2%A7Note-writing_systems?stackedNotes=zsRuFxYgckGS81tr2eiBAP
+[31] https://notes.andymatuschak.org/%C2%A7Note-writing_systems?stackedNotes=z8V2q398qu89vdJ73N2BEYCgevMqux3yxQUAC&stackedNotes=z7kEFe6NfUSgtaDuUjST1oczKKzQQeQWk4Dbc
+[33] https://www.theverge.com/24040075/apple-vision-pro-hands-on-virtual-reality
+[34] https://www.theverge.com/2024/1/16/24040093/google-layoffs-ad-sales-team
+[35] https://www.theverge.com/2024/1/16/24040562/samsung-unpacked-galaxy-ai-s24
+[36] https://www.theverge.com/2024/1/16/24039883/google-incognito-mode-tracking-lawsuit-notice-change
+[37] https://www.theverge.com/24039832/nvidia-rtx-4070-super-review-gpu-graphics-card-benchmark-test
+[40] https://www.voxmedia.com/legal/terms-of-use
+[41] https://www.voxmedia.com/legal/privacy-notice
+[42] https://policies.google.com/privacy
+[43] https://policies.google.com/terms
+[44] http://theverge.com/
+[45] http://theverge.com/
+[46] https://www.theverge.com/apps
+[47] https://www.theverge.com/2023/10/19/23923648/whatsapp-view-once-voice-messages-notes-beta-test
+[48] https://www.theverge.com/2023/10/19/23923113/whatsapp-stay-logged-in-two-accounts-meta
+[49] https://www.theverge.com/2023/10/18/23922707/pixel-pals-language-widget-christian-selig-apollo
+[50] https://www.theverge.com/2023/10/18/23922150/irs-direct-file-pilot-available-13-states-income-tax-2024
+[51] http://theverge.com/
+[52] http://theverge.com/
+[53] https://www.theverge.com/
+[54] https://www.voxmedia.com/legal/terms-of-use
+[55] https://www.voxmedia.com/legal/privacy-notice
+[56] https://www.voxmedia.com/legal/cookie-policy
+[57] https://www.theverge.com/contact
+[58] https://www.voxmedia.com/pages/licensing
+[59] https://www.voxmedia.com/legal/accessibility
+[60] https://status.voxmedia.com/
+[61] https://www.theverge.com/pages/how-we-rate
+[62] https://www.theverge.com/contact-the-verge
+[63] https://www.theverge.com/a/tip-us-secure-contact-email
+[64] https://www.theverge.com/community-guidelines
+[65] https://www.theverge.com/about-the-verge
+[66] https://www.theverge.com/ethics-statement
+[67] https://www.voxmedia.com/vox-advertising
+[68] https://jobs.voxmedia.com/
+[69] https://www.voxmedia.com/
diff --git a/static/archive/www-valetmag-com-b1tpcf.txt b/static/archive/www-valetmag-com-b1tpcf.txt
index 13480b8..2bde3c2 100644
--- a/static/archive/www-valetmag-com-b1tpcf.txt
+++ b/static/archive/www-valetmag-com-b1tpcf.txt
@@ -1,535 +1,586 @@
- [tr?id=588737784839840&ev=PageView&noscript=1] #[1]Valet.
+*
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-TKWJ6RK
+ • [1]☰
+ • [2]Valet.
+ • Search Valet.
- * [3]☰
- * [4]Valet.
- * (BUTTON) Search Valet.
+ • [4]Valet.
- * [5]Valet.
+ • [5]Style
+ • [6]Living
+ • [7]Health & Fitness
+ • [8]Grooming
+ • [9]Personal Shopper
+ • [10]The Handbook
- * [6]Style
- * [7]Living
- * [8]Health & Fitness
- * [9]Grooming
- * [10]Personal Shopper
- * [11]The Handbook
+Search Valet.
- (BUTTON) Search Valet.
+ • [12]☰
+ • [13]Valet.
+ • Search Valet.
- * [12]☰
- * [13]Valet.
- * (BUTTON) Search Valet.
+ • [15]Valet.
- * [14]Valet.
+ • [16]Style
+ • [17]Living
+ • [18]Health & Fitness
+ • [19]Grooming
+ • [20]Personal Shopper
+ • [21]The Handbook
- * [15]Style
- * [16]Living
- * [17]Health & Fitness
- * [18]Grooming
- * [19]Personal Shopper
- * [20]The Handbook
+Search Valet.
+×
- (BUTTON) Search Valet.
- (BUTTON) ×
- * [21]The Latest
- * [22]Style
- * [23]Living
- * [24]Health & Fitness
- * [25]Grooming
- * [26]Personal Shopper
- * [27]The Handbook
+ • [24]The Latest
+ • [25]Style
+ • [26]Living
+ • [27]Health & Fitness
+ • [28]Grooming
+ • [29]Personal Shopper
+ • [30]The Handbook
- (BUTTON) ⨯
- Search ... ____________________
+⨯
+Search ... [35][ ]
+Hit enter to search or ESC to close
- Hit enter to search or ESC to close
+[36]31 Days
-[28]31 Days
-
- Day 9
+Day 9
You Can Slow Down Time
- *
- *
- *
+ • [37]
+ • [38]
+ • [39]
- Gears
+“Where does the time go?” We've all asked this at one time or another and it
+only gets more common the older you get. Remember how long holiday breaks or
+summer vacation felt like when we were kids? Now, we leave the office on a
+Friday evening only to be jolted into the realization that it's now Sunday
+night and we barely recall anything from the weekend. Entire years seem to
+speed by so fast nowadays, right?
- “Where does the time go?” We've all asked this at one time or another
- and it only gets more common the older you get. Remember how long
- holiday breaks or summer vacation felt like when we were kids? Now, we
- leave the office on a Friday evening only to be jolted into the
- realization that it's now Sunday night and we barely recall anything
- from the weekend. Entire years seem to speed by so fast nowadays,
- right?
- Gears
+This perception of time moving at a leisurely pace in childhood, and then
+quickening as we become adults, is a common experience, according to
+neuroscientists. It's due to a few factors, says [40]Dr. Santosh Kesari, a
+board-certified neurologist and director of Neuro-oncology at Pacific
+Neuroscience Institute.
- This perception of time moving at a leisurely pace in childhood, and
- then quickening as we become adults, is a common experience, according
- to neuroscientists. It's due to a few factors, says [29]Dr. Santosh
- Kesari, a board-certified neurologist and director of Neuro-oncology at
- Pacific Neuroscience Institute.
+First of all, when we're children, a year of life amounts to much more time of
+existence, percentage-wise. "For a 10-year-old, one year is 10 percent of their
+lives," says Kesari. "For a 60-year-old, one year is less than two percent of
+their lives." But more importantly, we're constantly being introduced to new
+things and ideas when we're young that leave lasting impressions on our
+memories. "We gauge time by memorable events and fewer new things occur as we
+age to remember," he says. "And this makes it seem like childhood lasted
+longer."
- First of all, when we're children, a year of life amounts to much more
- time of existence, percentage-wise. "For a 10-year-old, one year is 10
- percent of their lives," says Kesari. "For a 60-year-old, one year is
- less than two percent of their lives." But more importantly, we're
- constantly being introduced to new things and ideas when we're young
- that leave lasting impressions on our memories. "We gauge time by
- memorable events and fewer new things occur as we age to remember," he
- says. "And this makes it seem like childhood lasted longer."
+Which means by paying attention, staying curious and actively noticing new
+things, we can slow down our perception of time. David Eagleman, a
+neuroscientist who studies time perception, was profiled in [41]The New Yorker
+and called time "a rubbery thing" that changes based on mental engagement.
- Which means by paying attention, staying curious and actively noticing
- new things, we can slow down our perception of time. David Eagleman, a
- neuroscientist who studies time perception, was profiled in [30]The New
- Yorker and called time "a rubbery thing" that changes based on mental
- engagement.
-
- "Time stretches out when you really turn your brain resources on, and
- when you say, 'Oh, I got this, everything is as expected,' it shrinks
- up," he explained. "The more familiar the world becomes, the less
- information your brain writes down, and the more quickly time seems to
- pass." Here are three ways to make your life richer and more memorable,
- thus allowing your time to expand.
+"Time stretches out when you really turn your brain resources on, and when you
+say, 'Oh, I got this, everything is as expected,' it shrinks up," he explained.
+"The more familiar the world becomes, the less information your brain writes
+down, and the more quickly time seems to pass." Here are three ways to make
+your life richer and more memorable, thus allowing your time to expand.
Embrace New Experiences
- Routines are necessary in life but are the enemy when it comes to
- extending time. As we touched on previously, the lack of new
- experiences is what makes time appear to speed up, so introducing
- novelty into your life is the key to slowing down your perception of
- time. By trying new things—accepting invitations and challenges or
- learning a new skill or hobby—this will form "accessible memory
- anchors," as a neurologist might put it. It's as simple as switching up
- your coffee order or getting a few coworkers to try a new place for
- lunch or afterwork drinks.
+Routines are necessary in life but are the enemy when it comes to extending
+time. As we touched on previously, the lack of new experiences is what makes
+time appear to speed up, so introducing novelty into your life is the key to
+slowing down your perception of time. By trying new things—accepting
+invitations and challenges or learning a new skill or hobby—this will form
+"accessible memory anchors," as a neurologist might put it. It's as simple as
+switching up your coffee order or getting a few coworkers to try a new place
+for lunch or afterwork drinks.
Be More Mindful
- In the past few years, there has been a lot of talk about mindfulness.
- But it's often in the context of [31]meditation. In terms of slowing
- down time, you don't necessarily need to start each day meditating.
- Instead, you'll want to become more mindful in everyday life. Meaning
- you'll want to focus all your attention and energy to what you're
- doing, seeing and experiencing right now. Instead of multi-tasking and
- doing three things at once, try to be fully engrossed in what's right
- in front of you. A [32]study by Harvard Medical School found that those
- in an eight-week mindfulness-based program experienced changes in the
- concentration of gray matter areas in the brain responsible for
- learning, memory and emotion regulation.
+In the past few years, there has been a lot of talk about mindfulness. But it's
+often in the context of [42]meditation. In terms of slowing down time, you
+don't necessarily need to start each day meditating. Instead, you'll want to
+become more mindful in everyday life. Meaning you'll want to focus all your
+attention and energy to what you're doing, seeing and experiencing right now.
+Instead of multi-tasking and doing three things at once, try to be fully
+engrossed in what's right in front of you. A [43]study by Harvard Medical
+School found that those in an eight-week mindfulness-based program experienced
+changes in the concentration of gray matter areas in the brain responsible for
+learning, memory and emotion regulation.
Keep Track of Progress
- We've extolled the virtues of [33]journaling before. But it definitely
- comes in handy to help you slow time by taking time to reflect on your
- day, your thoughts and your personal progress. It provides the context
- to make life events relevant, and more importantly, memorable. That
- context is key. A [34]study by the Wharton School found that we
- underestimate the passage of time—especially when there aren't related
- memories to build upon knowledge. It illustrated why you can feel
- regretful when another birthday rolls around too quickly. Journaling
- and tracking your progress will ensure you don't feel unaccomplished.
- The positive byproduct is that accountability will also serve as
- motivation to do more.
+We've extolled the virtues of [44]journaling before. But it definitely comes in
+handy to help you slow time by taking time to reflect on your day, your
+thoughts and your personal progress. It provides the context to make life
+events relevant, and more importantly, memorable. That context is key. A [45]
+study by the Wharton School found that we underestimate the passage of
+time—especially when there aren't related memories to build upon knowledge. It
+illustrated why you can feel regretful when another birthday rolls around too
+quickly. Journaling and tracking your progress will ensure you don't feel
+unaccomplished. The positive byproduct is that accountability will also serve
+as motivation to do more.
FYI
- [35]Matt Damon aging
+[46]
- The average life expectancy in the United States is 78.6 years,
- according to the [36]Centers for Disease Control and Prevention.
+The average life expectancy in the United States is 78.6 years, according to
+the [47]Centers for Disease Control and Prevention.
- «
- The Win-Win Kitchen Swap
+[48]
- Day 8
+«
- The Win-Win Kitchen Swap
- Be Your Own Style God
+Day 8
- Day 10
+The Win-Win Kitchen Swap
- Be Your Own Style God
+[49]
- »
+Day 10
-[37]31 Days
+Be Your Own Style God
- Volume 12 / Year 2020
- *
- *
- *
- * [38]Boost Your Coffee
- 1
+»
-Boost
-Your Coffee
- * [39]The Trick to Achieving Your Goals
- 2
+[50]31 Days
-The Trick to
-Achieving Your Goals
- * [40]Don't Forget the Dry Cleaner
- 3
+Volume 12 / Year 2020
-Don't Forget
-the Dry Cleaner
- * [41]Stay Hydrated
- 4
+ •
+ •
+ •
+ • [51] Boost Your Coffee
-Stay
-Hydrated
- * [42]Save More Money
- 5
+ 1
-Save
-More Money
- * [43]Prioritize Relaxation
- 6
+ Boost
+ Your Coffee
-Prioritize
-Relaxation
- * [44]Get the Most From Your Cast Iron
- 7
+ • [52] The Trick to Achieving Your Goals
-Get the Most From
-Your Cast Iron
- * [45]Use Less Paper Towels
- 8
+ 2
-Use Less
-Paper Towels
- * [46]You Can Slow Down Time
- 9
+ The Trick to
+ Achieving Your Goals
-You Can
-Slow Down Time
- * [47]Be Your Own Style God
- 10
+ • [53] Don't Forget the Dry Cleaner
-Be Your Own
-Style God
- * [48]How to Deal With Failure
- 11
+ 3
-How to Deal
-With Failure
- * [49]Stop Sitting So Much
- 12
+ Don't Forget
+ the Dry Cleaner
-Stop Sitting
-So Much
- * [50]Dress for Productivity
- 13
+ • [54] Stay Hydrated
-Dress for
-Productivity
- * [51]Improve Your Gut Health
- 14
+ 4
-Improve Your
-Gut Health
- * [52]Become an Early Riser
- 15
+ Stay
+ Hydrated
-Become an
-Early Riser
- * [53]Boost Your Credit Score
- 16
+ • [55] Save More Money
-Boost Your
-Credit Score
- * [54]How to Read a Whiskey Label
- 17
+ 5
-How to Read
-a Whiskey Label
- * [55]Go Solo
- 18
+ Save
+ More Money
-Go
-Solo
- * [56]Clean Your Jewelry and Watches
- 19
+ • [56] Prioritize Relaxation
-Clean Your Jewelry
-and Watches
- * [57]Boost Your Testosterone
- 20
+ 6
-Boost Your
-Testosterone
- * [58]Swear at Work
- 21
+ Prioritize
+ Relaxation
-Swear
-at Work
- * [59]Look Younger
- 22
+ • [57] Get the Most From Your Cast Iron
-Look
-Younger
- * [60]Boost Your Creativity
- 23
+ 7
-Boost Your
-Creativity
- * [61]Worry Away
- 24
+ Get the Most From
+ Your Cast Iron
-Worry
-Away
- * [62]Make Better Conversation
- 25
+ • [58] Use Less Paper Towels
-Make Better
-Conversation
- * [63]Overcome Imposter Syndrome
- 26
+ 8
-Overcome
-Imposter Syndrome
- * [64]How to Stay Focused at Work
- 27
+ Use Less
+ Paper Towels
-How to Stay
-Focused at Work
- * [65]Save Your Face
- 28
+ • [59] You Can Slow Down Time
-Save
-Your Face
- * [66]Trust Your Gut
- 29
+ 9
-Trust
-Your Gut
- * [67]Optimize Your Breath
- 30
+ You Can
+ Slow Down Time
-Optimize
-Your Breath
- * [68]Sharpen Your Knives
- 31
+ • [60] Be Your Own Style God
-Sharpen
-Your Knives
+ 10
- [69]See all “31 Days” features »
+ Be Your Own
+ Style God
- Advertisement
+ • [61] How to Deal With Failure
- [70]Valet. homepage
+ 11
- Your concierge to a well-styled life.
+ How to Deal
+ With Failure
- Established in 2008
+ • [62] Stop Sitting So Much
- Made in California
- * [71]Facebook
- * [72]Twitter
- * [73]Instagram
- * [74]Valet. App
- * [75]RSS
+ 12
- * [76]Style
- * [77]Trends
- * [78]Products
- * [79]Profiles & Features
- * [80]How Tos
+ Stop Sitting
+ So Much
- * [81]Living
- * [82]Interiors
- * [83]Gear
- * [84]Food & Drink
- * [85]Travel
- * [86]Sex & Relationships
- * [87]Culture
- * [88]Money
- * [89]Career
- * [90]Features
+ • [63] Dress for Productivity
- * [91]Grooming
- * [92]Skin Care
- * [93]Hair Care
- * [94]Shaving
- * [95]Fragrances
- * [96]Profiles & Features
- * [97]How Tos
- * [98]My Morning Routine
+ 13
- * [99]Health & Fitness
- * [100]Diet & Nutrition
- * [101]Fitness
- * [102]Strength Training
- * [103]Features
- * [104]The Inside Man
+ Dress for
+ Productivity
- * [105]Personal Shopper
- * [106]Sales & Deals
- * [107]Seasonal Calendar
+ • [64] Improve Your Gut Health
- * [108]The
- Handbook
- * [109]Style
- * [110]Grooming
- * [111]Living
- * [112]31 Days Series
+ 14
- Subscribe to Valet.
+ Improve Your
+ Gut Health
- Smart reads, expert tips, exclusive sale alerts and more. You won't be
- disappointed.
+ • [65] Become an Early Riser
- Enter Your Email Address ...
- ____________________
- [X]
- The
- Obtainer
- [X]
- The Daily Valet.
- [ ]
- Daily
- Digest
- [ ]
- Weekly
- Digest
- ____________________
+ 15
- Sign Up
- Subscribe
+ Become an
+ Early Riser
- [113]About Valet. | [114]Advertising on Valet.
+ • [66] Boost Your Credit Score
- © Copyright 2024 Valet Media LLC - All Rights
- Reserved. | [115]Privacy Policy | [116]Terms & Conditions
- [tr?id=130137150768080&ev=PageView&noscript=1]
+ 16
-References
+ Boost Your
+ Credit Score
- Visible links:
- 1. https://valetmag.com/distribution/rss_all.xml
- 2. https://www.googletagmanager.com/ns.html?id=GTM-TKWJ6RK
- 3. https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php
- 4. https://www.valetmag.com/
- 5. https://www.valetmag.com/
- 6. https://www.valetmag.com/style/
- 7. https://www.valetmag.com/living/
- 8. https://www.valetmag.com/health-fitness/
- 9. https://www.valetmag.com/grooming/
- 10. http://www.valetmag.com/personal-shopper/
- 11. http://www.valetmag.com/the-handbook/
- 12. https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php
- 13. https://www.valetmag.com/
- 14. https://www.valetmag.com/
- 15. https://www.valetmag.com/style/
- 16. https://www.valetmag.com/living/
- 17. https://www.valetmag.com/health-fitness/
- 18. https://www.valetmag.com/grooming/
- 19. http://www.valetmag.com/personal-shopper/
- 20. http://www.valetmag.com/the-handbook/
- 21. https://www.valetmag.com/
- 22. https://www.valetmag.com/style/
- 23. https://www.valetmag.com/living/
- 24. https://www.valetmag.com/health-fitness/
- 25. https://www.valetmag.com/grooming/
- 26. http://www.valetmag.com/personal-shopper/
- 27. http://www.valetmag.com/the-handbook/
- 28. https://www.valetmag.com/the-handbook/features/31-days/
- 29. https://www.pacificneuroscienceinstitute.org/people/santosh-kesari/
- 30. https://www.newyorker.com/magazine/2011/04/25/the-possibilian
- 31. http://www.valetmag.com/living/features/2016/four-ways-meditation-will-improve-your-brain-021716.php
- 32. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3004979/
- 33. http://www.valetmag.com/the-handbook/living/benefits-of-journaling.php
- 34. https://www.jstor.org/stable/41062175?seq=1
- 35. https://www.cdc.gov/nchs/fastats/life-expectancy.htm
- 36. https://www.cdc.gov/nchs/fastats/life-expectancy.htm
- 37. https://www.valetmag.com/the-handbook/features/31-days/
- 38. https://www.valetmag.com/the-handbook/living/coffee-boost-nutrition.php
- 39. https://www.valetmag.com/the-handbook/living/how-to-accomplish-your-goals.php
- 40. https://www.valetmag.com/the-handbook/style/dry-cleaning-benefits.php
- 41. https://www.valetmag.com/the-handbook/living/how-much-water-should-you-drink-per-day.php
- 42. https://www.valetmag.com/the-handbook/living/how-to-save-away-more-money.php
- 43. https://www.valetmag.com/the-handbook/living/prioritize-relaxation-how-to.php
- 44. https://www.valetmag.com/the-handbook/living/cast-iron-pan-seasoning-guide.php
- 45. https://www.valetmag.com/the-handbook/living/use-less-paper-towels.php
- 46. https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php
- 47. https://www.valetmag.com/the-handbook/style/be-your-own-style-god.php
- 48. https://www.valetmag.com/the-handbook/living/how-to-deal-with-failure.php
- 49. https://www.valetmag.com/the-handbook/living/stop-sitting-so-much.php
- 50. https://www.valetmag.com/the-handbook/style/rules-for-office-wardrobes.php
- 51. https://www.valetmag.com/the-handbook/living/improve-your-gut-health-microbiome.php
- 52. https://www.valetmag.com/the-handbook/living/how-to-wake-up-early.php
- 53. https://www.valetmag.com/the-handbook/living/boost-your-credit-score.php
- 54. https://www.valetmag.com/the-handbook/living/how-to-read-whiskey-label.php
- 55. https://www.valetmag.com/the-handbook/living/alone-time-benefits.php
- 56. https://www.valetmag.com/the-handbook/style/watch-jewelry-cleaning-guide.php
- 57. https://www.valetmag.com/the-handbook/living/boost-your-testosterone.php
- 58. https://www.valetmag.com/the-handbook/living/swear-at-work.php
- 59. https://www.valetmag.com/the-handbook/grooming/how-to-look-younger.php
- 60. https://www.valetmag.com/the-handbook/living/boost-your-creativity.php
- 61. https://www.valetmag.com/the-handbook/living/productive-worrying.php
- 62. https://www.valetmag.com/the-handbook/living/make-better-conversation.php
- 63. https://www.valetmag.com/the-handbook/living/overcome-imposter-syndrome.php
- 64. https://www.valetmag.com/the-handbook/living/how-to-stay-focused-at-work.php
- 65. https://www.valetmag.com/the-handbook/grooming/mens-face-exfoliating-scrubs.php
- 66. https://www.valetmag.com/the-handbook/living/trust-your-gut.php
- 67. https://www.valetmag.com/the-handbook/living/optimize-your-breathing.php
- 68. https://www.valetmag.com/the-handbook/living/sharpen-your-kitchen-knives.php
- 69. https://www.valetmag.com/the-handbook/features/31-days/
- 70. https://www.valetmag.com/
- 71. https://www.facebook.com/valetmag
- 72. https://twitter.com/valetmag
- 73. https://www.instagram.com/valetmag/
- 74. http://www.valetmag.com/distribution/app.php
- 75. http://www.valetmag.com/distribution/rss.php
- 76. https://www.valetmag.com/style/
- 77. https://www.valetmag.com/style/trends/
- 78. https://www.valetmag.com/style/products/
- 79. https://www.valetmag.com/style/profiles-features/
- 80. https://www.valetmag.com/style/how-tos/
- 81. https://www.valetmag.com/living/
- 82. https://www.valetmag.com/living/interiors/
- 83. https://www.valetmag.com/living/gear/
- 84. https://www.valetmag.com/living/food-drink/
- 85. https://www.valetmag.com/living/travel/
- 86. https://www.valetmag.com/living/sex-relationships/
- 87. https://www.valetmag.com/living/culture/
- 88. https://www.valetmag.com/living/money/
- 89. https://www.valetmag.com/living/career/
- 90. https://www.valetmag.com/living/features/
- 91. https://www.valetmag.com/grooming/
- 92. https://www.valetmag.com/grooming/skin-care/
- 93. https://www.valetmag.com/grooming/hair-care/
- 94. https://www.valetmag.com/grooming/shaving/
- 95. https://www.valetmag.com/grooming/fragrances/
- 96. https://www.valetmag.com/grooming/profiles-features/
- 97. https://www.valetmag.com/grooming/how-tos/
- 98. https://www.valetmag.com/grooming/profiles-features/my-morning-routine.php
- 99. https://www.valetmag.com/health-fitness/
- 100. https://www.valetmag.com/health-fitness/diet-nutrition/
- 101. https://www.valetmag.com/health-fitness/fitness/
- 102. https://www.valetmag.com/health-fitness/strength-training/
- 103. https://www.valetmag.com/health-fitness/features/
- 104. https://www.valetmag.com/health-fitness/the-inside-man/
- 105. http://www.valetmag.com/personal-shopper/
- 106. http://www.valetmag.com/personal-shopper/sales-deals/
- 107. http://www.valetmag.com/personal-shopper/seasonal-calendar/
- 108. http://www.valetmag.com/the-handbook/
- 109. http://www.valetmag.com/the-handbook/style/
- 110. http://www.valetmag.com/the-handbook/grooming/
- 111. http://www.valetmag.com/the-handbook/living/
- 112. https://www.valetmag.com/the-handbook/features/31-days/
- 113. http://www.valetmag.com/about/
- 114. http://www.valetmag.com/about/advertising/
- 115. http://www.valetmag.com/about/privacy_policy.php
- 116. http://www.valetmag.com/about/terms_conditions.php
+ • [67] How to Read a Whiskey Label
- Hidden links:
- 118. https://www.facebook.com/sharer/sharer.php?u=https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php
- 119. https://twitter.com/intent/tweet?text=You%20Can%20Slow%20Down%20Time%20%20https%3A%2F%2Fwww.valetmag.com%2Fthe-handbook%2Fliving%2Fhow-to-slow-down-time.php%20via%20@valetmag
- 120. mailto:?subject=You%20Can%20Slow%20Down%20Time%20-%20Valet.&body=https%3A%2F%2Fwww.valetmag.com%2Fthe-handbook%2Fliving%2Fhow-to-slow-down-time.php%0D%0A%0D%0AHow%20to%20stop%20life%20from%20passing%20you%20by.
- 121. https://www.valetmag.com/the-handbook/living/use-less-paper-towels.php
- 122. https://www.valetmag.com/the-handbook/style/be-your-own-style-god.php
+ 17
+
+ How to Read
+ a Whiskey Label
+
+ • [68] Go Solo
+
+ 18
+
+ Go
+ Solo
+
+ • [69] Clean Your Jewelry and Watches
+
+ 19
+
+ Clean Your Jewelry
+ and Watches
+
+ • [70] Boost Your Testosterone
+
+ 20
+
+ Boost Your
+ Testosterone
+
+ • [71] Swear at Work
+
+ 21
+
+ Swear
+ at Work
+
+ • [72] Look Younger
+
+ 22
+
+ Look
+ Younger
+
+ • [73] Boost Your Creativity
+
+ 23
+
+ Boost Your
+ Creativity
+
+ • [74] Worry Away
+
+ 24
+
+ Worry
+ Away
+
+ • [75] Make Better Conversation
+
+ 25
+
+ Make Better
+ Conversation
+
+ • [76] Overcome Imposter Syndrome
+
+ 26
+
+ Overcome
+ Imposter Syndrome
+
+ • [77] How to Stay Focused at Work
+
+ 27
+
+ How to Stay
+ Focused at Work
+
+ • [78] Save Your Face
+
+ 28
+
+ Save
+ Your Face
+
+ • [79] Trust Your Gut
+
+ 29
+
+ Trust
+ Your Gut
+
+ • [80] Optimize Your Breath
+
+ 30
+
+ Optimize
+ Your Breath
+
+ • [81] Sharpen Your Knives
+
+ 31
+
+ Sharpen
+ Your Knives
+
+[82]See all “31 Days” features »
+
+Advertisement
+
+[83]
+
+Your concierge to a well-styled life.
+
+Established in 2008
+
+Made in California
+
+ • [84]Facebook
+ • [85]Twitter
+ • [86]Instagram
+ • [87]Valet. App
+ • [88]RSS
+
+ • [89]Style
+ • [90]Trends
+ • [91]Products
+ • [92]Profiles & Features
+ • [93]How Tos
+
+ • [94]Living
+ • [95]Interiors
+ • [96]Gear
+ • [97]Food & Drink
+ • [98]Travel
+ • [99]Sex & Relationships
+ • [100]Culture
+ • [101]Money
+ • [102]Career
+ • [103]Features
+
+ • [104]Grooming
+ • [105]Skin Care
+ • [106]Hair Care
+ • [107]Shaving
+ • [108]Fragrances
+ • [109]Profiles & Features
+ • [110]How Tos
+ • [111]My Morning Routine
+
+ • [112]Health & Fitness
+ • [113]Diet & Nutrition
+ • [114]Fitness
+ • [115]Strength Training
+ • [116]Features
+ • [117]The Inside Man
+
+ • [118]Personal Shopper
+ • [119]Sales & Deals
+ • [120]Seasonal Calendar
+
+ • [121]The
+ Handbook
+ • [122]Style
+ • [123]Grooming
+ • [124]Living
+ • [125]31 Days Series
+
+Subscribe to Valet.
+
+Smart reads, expert tips, exclusive sale alerts and more. You won't be
+disappointed.
+
+Enter Your Email Address ...
+
+[126][ ]
+[127][*]
+The
+Obtainer
+[128][*]
+The Daily Valet.
+[129][ ]
+Daily
+Digest
+[130][ ]
+Weekly
+Digest
+[131][ ]
+
+Sign Up
+
+[132][Subscribe]
+[134]About Valet. | [135]Advertising on Valet.
+
+© Copyright 2024 Valet Media LLC - All Rights Reserved. | [136]Privacy Policy
+ | [137]Terms & Conditions
+
+*
+
+References:
+
+[1] https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php#
+[2] https://www.valetmag.com/
+[4] https://www.valetmag.com/
+[5] https://www.valetmag.com/style/
+[6] https://www.valetmag.com/living/
+[7] https://www.valetmag.com/health-fitness/
+[8] https://www.valetmag.com/grooming/
+[9] http://www.valetmag.com/personal-shopper/
+[10] http://www.valetmag.com/the-handbook/
+[12] https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php#
+[13] https://www.valetmag.com/
+[15] https://www.valetmag.com/
+[16] https://www.valetmag.com/style/
+[17] https://www.valetmag.com/living/
+[18] https://www.valetmag.com/health-fitness/
+[19] https://www.valetmag.com/grooming/
+[20] http://www.valetmag.com/personal-shopper/
+[21] http://www.valetmag.com/the-handbook/
+[24] https://www.valetmag.com/
+[25] https://www.valetmag.com/style/
+[26] https://www.valetmag.com/living/
+[27] https://www.valetmag.com/health-fitness/
+[28] https://www.valetmag.com/grooming/
+[29] http://www.valetmag.com/personal-shopper/
+[30] http://www.valetmag.com/the-handbook/
+[36] https://www.valetmag.com/the-handbook/features/31-days/
+[37] https://www.facebook.com/sharer/sharer.php?u=https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php
+[38] https://twitter.com/intent/tweet?text=You%20Can%20Slow%20Down%20Time%20%20https%3A%2F%2Fwww.valetmag.com%2Fthe-handbook%2Fliving%2Fhow-to-slow-down-time.php%20via%20@valetmag
+[39] mailto:?subject=You%20Can%20Slow%20Down%20Time%20-%20Valet.&body=https%3A%2F%2Fwww.valetmag.com%2Fthe-handbook%2Fliving%2Fhow-to-slow-down-time.php%0D%0A%0D%0AHow%20to%20stop%20life%20from%20passing%20you%20by.
+[40] https://www.pacificneuroscienceinstitute.org/people/santosh-kesari/
+[41] https://www.newyorker.com/magazine/2011/04/25/the-possibilian
+[42] http://www.valetmag.com/living/features/2016/four-ways-meditation-will-improve-your-brain-021716.php
+[43] https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3004979/
+[44] http://www.valetmag.com/the-handbook/living/benefits-of-journaling.php
+[45] https://www.jstor.org/stable/41062175?seq=1
+[46] https://www.cdc.gov/nchs/fastats/life-expectancy.htm
+[47] https://www.cdc.gov/nchs/fastats/life-expectancy.htm
+[48] https://www.valetmag.com/the-handbook/living/use-less-paper-towels.php
+[49] https://www.valetmag.com/the-handbook/style/be-your-own-style-god.php
+[50] https://www.valetmag.com/the-handbook/features/31-days/
+[51] https://www.valetmag.com/the-handbook/living/coffee-boost-nutrition.php
+[52] https://www.valetmag.com/the-handbook/living/how-to-accomplish-your-goals.php
+[53] https://www.valetmag.com/the-handbook/style/dry-cleaning-benefits.php
+[54] https://www.valetmag.com/the-handbook/living/how-much-water-should-you-drink-per-day.php
+[55] https://www.valetmag.com/the-handbook/living/how-to-save-away-more-money.php
+[56] https://www.valetmag.com/the-handbook/living/prioritize-relaxation-how-to.php
+[57] https://www.valetmag.com/the-handbook/living/cast-iron-pan-seasoning-guide.php
+[58] https://www.valetmag.com/the-handbook/living/use-less-paper-towels.php
+[59] https://www.valetmag.com/the-handbook/living/how-to-slow-down-time.php
+[60] https://www.valetmag.com/the-handbook/style/be-your-own-style-god.php
+[61] https://www.valetmag.com/the-handbook/living/how-to-deal-with-failure.php
+[62] https://www.valetmag.com/the-handbook/living/stop-sitting-so-much.php
+[63] https://www.valetmag.com/the-handbook/style/rules-for-office-wardrobes.php
+[64] https://www.valetmag.com/the-handbook/living/improve-your-gut-health-microbiome.php
+[65] https://www.valetmag.com/the-handbook/living/how-to-wake-up-early.php
+[66] https://www.valetmag.com/the-handbook/living/boost-your-credit-score.php
+[67] https://www.valetmag.com/the-handbook/living/how-to-read-whiskey-label.php
+[68] https://www.valetmag.com/the-handbook/living/alone-time-benefits.php
+[69] https://www.valetmag.com/the-handbook/style/watch-jewelry-cleaning-guide.php
+[70] https://www.valetmag.com/the-handbook/living/boost-your-testosterone.php
+[71] https://www.valetmag.com/the-handbook/living/swear-at-work.php
+[72] https://www.valetmag.com/the-handbook/grooming/how-to-look-younger.php
+[73] https://www.valetmag.com/the-handbook/living/boost-your-creativity.php
+[74] https://www.valetmag.com/the-handbook/living/productive-worrying.php
+[75] https://www.valetmag.com/the-handbook/living/make-better-conversation.php
+[76] https://www.valetmag.com/the-handbook/living/overcome-imposter-syndrome.php
+[77] https://www.valetmag.com/the-handbook/living/how-to-stay-focused-at-work.php
+[78] https://www.valetmag.com/the-handbook/grooming/mens-face-exfoliating-scrubs.php
+[79] https://www.valetmag.com/the-handbook/living/trust-your-gut.php
+[80] https://www.valetmag.com/the-handbook/living/optimize-your-breathing.php
+[81] https://www.valetmag.com/the-handbook/living/sharpen-your-kitchen-knives.php
+[82] https://www.valetmag.com/the-handbook/features/31-days/
+[83] https://www.valetmag.com/
+[84] https://www.facebook.com/valetmag
+[85] https://twitter.com/valetmag
+[86] https://www.instagram.com/valetmag/
+[87] http://www.valetmag.com/distribution/app.php
+[88] http://www.valetmag.com/distribution/rss.php
+[89] https://www.valetmag.com/style/
+[90] https://www.valetmag.com/style/trends/
+[91] https://www.valetmag.com/style/products/
+[92] https://www.valetmag.com/style/profiles-features/
+[93] https://www.valetmag.com/style/how-tos/
+[94] https://www.valetmag.com/living/
+[95] https://www.valetmag.com/living/interiors/
+[96] https://www.valetmag.com/living/gear/
+[97] https://www.valetmag.com/living/food-drink/
+[98] https://www.valetmag.com/living/travel/
+[99] https://www.valetmag.com/living/sex-relationships/
+[100] https://www.valetmag.com/living/culture/
+[101] https://www.valetmag.com/living/money/
+[102] https://www.valetmag.com/living/career/
+[103] https://www.valetmag.com/living/features/
+[104] https://www.valetmag.com/grooming/
+[105] https://www.valetmag.com/grooming/skin-care/
+[106] https://www.valetmag.com/grooming/hair-care/
+[107] https://www.valetmag.com/grooming/shaving/
+[108] https://www.valetmag.com/grooming/fragrances/
+[109] https://www.valetmag.com/grooming/profiles-features/
+[110] https://www.valetmag.com/grooming/how-tos/
+[111] https://www.valetmag.com/grooming/profiles-features/my-morning-routine.php
+[112] https://www.valetmag.com/health-fitness/
+[113] https://www.valetmag.com/health-fitness/diet-nutrition/
+[114] https://www.valetmag.com/health-fitness/fitness/
+[115] https://www.valetmag.com/health-fitness/strength-training/
+[116] https://www.valetmag.com/health-fitness/features/
+[117] https://www.valetmag.com/health-fitness/the-inside-man/
+[118] http://www.valetmag.com/personal-shopper/
+[119] http://www.valetmag.com/personal-shopper/sales-deals/
+[120] http://www.valetmag.com/personal-shopper/seasonal-calendar/
+[121] http://www.valetmag.com/the-handbook/
+[122] http://www.valetmag.com/the-handbook/style/
+[123] http://www.valetmag.com/the-handbook/grooming/
+[124] http://www.valetmag.com/the-handbook/living/
+[125] https://www.valetmag.com/the-handbook/features/31-days/
+[134] http://www.valetmag.com/about/
+[135] http://www.valetmag.com/about/advertising/
+[136] http://www.valetmag.com/about/privacy_policy.php
+[137] http://www.valetmag.com/about/terms_conditions.php
diff --git a/static/archive/www-viget-com-97ckk4.txt b/static/archive/www-viget-com-97ckk4.txt
index 5b46365..99b106b 100644
--- a/static/archive/www-viget-com-97ckk4.txt
+++ b/static/archive/www-viget-com-97ckk4.txt
@@ -1,365 +1,379 @@
- #[1]Viget Articles
+[1] Skip to Main Content
+[2] Viget
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-5V7V
-
- [3]Skip to Main Content
-
- [4]Viget
-
- * [5]Work
- * [6]Services
- * [7]Articles
- * [8]Careers
- * [9]Contact
- * (BUTTON) Open Menu
+ • [3] Work
+ • [4] Services
+ • [5] Articles
+ • [6] Careers
+ • [7] Contact
+ • Open Menu
Navigation
- [10]Viget (BUTTON) Close
- * Practice
- * [11]Work
- * [12]Services
- * [13]Articles
+[9] Viget Close
- We’re a full-service digital agency that’s been helping clients make
- lasting change since 1999.
- [14]Contact Us
+ • Practice
+ • [11] Work
+ • [12] Services
+ • [13] Articles
+
+We’re a full-service digital agency that’s been helping clients make lasting
+change since 1999.
+
+[14] Contact Us
People
- * [15]Company
- * [16]Careers
- * [17]Code of Ethics
- * [18]Diversity & Inclusion
+ • [15]Company
+ • [16]Careers
+ • [17]Code of Ethics
+ • [18]Diversity & Inclusion
More
- * [19]Pointless Corp.
- * [20]Explorations
- * [21]Code at Viget
+ • [19]Pointless Corp.
+ • [20]Explorations
+ • [21]Code at Viget
Featured
- Read the Article: Revolutionizing the Web
+[22]
+Read the Article: Revolutionizing the Web
- Newsletter
+Newsletter
Revolutionizing the Web
- Read the Article: The Reflection Before Christmas
+[23]
+Read the Article: The Reflection Before Christmas
- Article
+Article
The Reflection Before Christmas
The Enduring Point of Pointless Corp.
- [22]Brian Williams
+[pointless-sticker-bear-article]
+[24] Brian Williams
- [23]Brian Williams, Co-Founder & CEO
+[25]Brian Williams, Co-Founder & CEO
- Article Categories: [24]#News & Culture, [25]#Employee Engagement
+Article Categories: [26] #News & Culture, [27] #Employee Engagement
- Posted on March 24, 2023
- * Share
- * Share
- * Post
+Posted on March 24, 2023
- Pointless Corp. is the innovation lab at Viget, where we step away from
- client work to make fun and useful things for everyone
+ • [28]
+ Share
+ • [29]
+ Share
+ • [30]
+ Post
- P o i n t l e s s C o r p . i s t h e i n n o v a t i o n l a b a t V i
- g e t , w h e r e w e s t e p a w a y f r o m c l i e n t w o r k t o m
- a k e f u n a n d u s e f u l t h i n g s f o r e v e r y o n e
+Pointless Corp. is the innovation lab at Viget, where we step away from client
+work to make fun and useful things for everyone
- “Neither pointless, nor a corporation” is how we describe Pointless
- Corp. here at Viget. We founded Viget – an actual company – in 1999
- during the original dot com bubble to build web products for clients.
- Serving clients has always been our purpose or … point, if you will.
- Over the decades, we’ve done just that, completing thousands of
- projects for hundreds of clients. Never forgetting that we exist to
- serve our clients has been key in our longevity.
+P o i n t l e s s C o r p . i s t h e i n n o v a t i o n l a b a t V i g e t ,
+w h e r e w e s t e p a w a y f r o m c l i e n t w o r k t o m a k e f u n a n
+d u s e f u l t h i n g s f o r e v e r y o n e
- About a decade in, we felt the urge to build and launch our own
- projects. [26]Pointless Corp. became the internal [27]brand we adopted
- to remind ourselves that these projects can be fun and useful but don’t
- replace the primary point of Viget. A line from Harry Nilsson’s The
- Point! referencing the Pointless Man serves as inspiration: “a point in
- every direction is the same as no point at all.” We wanted the freedom
- to experiment in every direction.
+“Neither pointless, nor a corporation” is how we describe Pointless Corp. here
+at Viget. We founded Viget – an actual company – in 1999 during the original
+dot com bubble to build web products for clients. Serving clients has always
+been our purpose or … point, if you will. Over the decades, we’ve done just
+that, completing thousands of projects for hundreds of clients. Never
+forgetting that we exist to serve our clients has been key in our longevity.
- So we did. Ideas and teams formed fairly randomly, and Pointless
- Projects began to fill the gaps between our client work. Projects like
- [28]HeyCraig (2009), which sent you an email alert based on your
- Craigslist search (before Craigslist shut us down and added the
- feature). Or [29]Tincan’d (2011), a simple video call platform before
- Zoom or Google Meet. Or [30]BabyBookie, the baby due date office pool
- app over 500,000 people have used since launch in 2012.
+About a decade in, we felt the urge to build and launch our own projects. [31]
+Pointless Corp. became the internal [32]brand we adopted to remind ourselves
+that these projects can be fun and useful but don’t replace the primary point
+of Viget. A line from Harry Nilsson’s The Point! referencing the Pointless Man
+serves as inspiration: “a point in every direction is the same as no point at
+all.” We wanted the freedom to experiment in every direction.
- These projects allow our teams to work without the input (including,
- ahem, revenue) of clients, so we’re more free to experiment, wear
- different hats, and learn … a lot. We apply what we learn back into our
- client work. Along the way, we get to know each other better, scratch
- our entrepreneurial itches, and hopefully put some fun and/or useful
- things out in the world for others to enjoy.
+So we did. Ideas and teams formed fairly randomly, and Pointless Projects began
+to fill the gaps between our client work. Projects like [33]HeyCraig (2009),
+which sent you an email alert based on your Craigslist search (before
+Craigslist shut us down and added the feature). Or [34]Tincan’d (2011), a
+simple video call platform before Zoom or Google Meet. Or [35]BabyBookie, the
+baby due date office pool app over 500,000 people have used since launch in
+2012.
- For many years, we organized an annual optional Pointless Weekend. We’d
- kick off hackathon-style on a Thursday evening and wrap on a Saturday
- evening with a functional product out in the wild, as I described
- [31]back in 2012. It’s [32]always been an intense, enjoyable, but
- rather exhausting 48 hours. Photos from [33]2011, [34]2014, and
- [35]2016 bring back some great memories.
- Pointless Weekend 2014 spanned three Viget offices
+These projects allow our teams to work without the input (including, ahem,
+revenue) of clients, so we’re more free to experiment, wear different hats, and
+learn … a lot. We apply what we learn back into our client work. Along the way,
+we get to know each other better, scratch our entrepreneurial itches, and
+hopefully put some fun and/or useful things out in the world for others to
+enjoy.
- A couple of years ago, we shifted the schedule to start on Wednesday
- and wrap on Friday. This made participation easier, allowing parents
- and others with weekend commitments to join. It also allowed projects
- to wrap up just in time for our Friday staff meeting. We awkwardly
- called it “Pointless Week” even though it was still only two days.
+For many years, we organized an annual optional Pointless Weekend. We’d kick
+off hackathon-style on a Thursday evening and wrap on a Saturday evening with a
+functional product out in the wild, as I described [36]back in 2012. It’s [37]
+always been an intense, enjoyable, but rather exhausting 48 hours. Photos from
+[38]2011, [39]2014, and [40]2016 bring back some great memories.
- New for 2023: Pointless Palooza
+[pointless-old]
+Pointless Weekend 2014 spanned three Viget offices
- Two things I like: alliteration and lollapalooza (specifically circa
- 1992, but that’s a story for another day). So Pointless Palooza was an
- obvious choice for what to call our little two day adventure. In
- addition to a new name, we’re trying a few other changes this year:
+A couple of years ago, we shifted the schedule to start on Wednesday and wrap
+on Friday. This made participation easier, allowing parents and others with
+weekend commitments to join. It also allowed projects to wrap up just in time
+for our Friday staff meeting. We awkwardly called it “Pointless Week” even
+though it was still only two days.
- Pointless Executives. Nothing injects new energy like new leadership.
- We handed over the Pointless reins to two trusty execs: [36]Andrew (day
- job: developer) is our Pointless CEO and [37]Aimee (day job: project
- manager) is our Pointless COO. They’ve done a phenomenal job setting a
- vision, planning, and leading the activities. Their enthusiasm helped
- inspire more than half the company to participate with a record number
- of projects and great results.
+New for 2023: Pointless Palooza
- Pitching & Team Formation. Previously, project ideas were “pitched”
- with a single slide and a tight 1-2 minute segment at a staff meeting.
- These were fun and lighthearted, but didn’t always capture the full
- vision, and teams often formed and morphed during the kickoff night.
- This year, project ideas were shared more gradually via collaboration
- in Slack and Notion. Project teams formed with more structure in
- advance, and team members had some time before the kickoff to marinate
- on the idea and get excited to build.
+Two things I like: alliteration and lollapalooza (specifically circa 1992, but
+that’s a story for another day). So Pointless Palooza was an obvious choice for
+what to call our little two day adventure. In addition to a new name, we’re
+trying a few other changes this year:
- Even More Remote Friendly. There’s something magical about
- kickoff-pizza, launch day donuts, and [38]in-person collaboration. But
- there’s something even more magical about collaborating with dozens of
- teammates around the country (especially when it’s supplemented by
- [39]sweet swag boxes and Divvy credits for remote treats). Hybrid teams
- work. We still had fun in-office connections, but most of our Pointless
- Projects this year are being worked on with distributed teams, much
- like our client work.
- Pointless Branded Stuff 2023 including a t-shirt and sticker pack --
- very corporate
+Pointless Executives. Nothing injects new energy like new leadership. We handed
+over the Pointless reins to two trusty execs: [41]Andrew (day job: developer)
+is our Pointless CEO and [42]Aimee (day job: project manager) is our Pointless
+COO. They’ve done a phenomenal job setting a vision, planning, and leading the
+activities. Their enthusiasm helped inspire more than half the company to
+participate with a record number of projects and great results.
- Some things haven’t changed from prior years. Team members are still
- swapping roles – PMs writing code, designers running projects, the list
- goes on – which means steep and rapid [40]learning curves. We’re still
- trying out new technologies and approaches to our work, which means
- unexpected blockers and great insights to share. New connections are
- being formed, especially since more than half of this year’s
- participants are in their first year at Viget and experiencing their
- first Pointless event. Forming authentic co-worker connections isn’t
- easy, and our culture is stronger today than it was at the start of the
- week.
+Pitching & Team Formation. Previously, project ideas were “pitched” with a
+single slide and a tight 1-2 minute segment at a staff meeting. These were fun
+and lighthearted, but didn’t always capture the full vision, and teams often
+formed and morphed during the kickoff night. This year, project ideas were
+shared more gradually via collaboration in Slack and Notion. Project teams
+formed with more structure in advance, and team members had some time before
+the kickoff to marinate on the idea and get excited to build.
- So what projects will launch? I won’t steal their thunder, but we just
- wrapped the presentation portion of six Pointless Project teams at our
- weekly staff meeting and it was the most we’ve laughed, cheered, and
- been inspired in a long time. I expect articles will be written and
- shared in the days and weeks ahead outlining the thrills (and mishaps)
- of the teams this year.
- Pointless Palooza 2023 was a blast!
+Even More Remote Friendly. There’s something magical about kickoff-pizza,
+launch day donuts, and [43]in-person collaboration. But there’s something even
+more magical about collaborating with dozens of teammates around the country
+(especially when it’s supplemented by [44]sweet swag boxes and Divvy credits
+for remote treats). Hybrid teams work. We still had fun in-office connections,
+but most of our Pointless Projects this year are being worked on with
+distributed teams, much like our client work.
- Pointless Corp. is more than an annual palooza. We work on projects
- throughout the year in the gaps between client work, weaving the
- teamwork, learning, and teaching values of Viget into all that we do.
+[23-pointless]
+Pointless Branded Stuff 2023 including a t-shirt and sticker pack -- very
+corporate
- If this is the kind of work and culture you might enjoy, learn more
- about [41]our culture and job openings – perhaps you’ll be able to join
- next year’s Pointless Palooza. After all, inspiring people to join us
- is unapologetically part of the point.
+Some things haven’t changed from prior years. Team members are still swapping
+roles – PMs writing code, designers running projects, the list goes on – which
+means steep and rapid [45]learning curves. We’re still trying out new
+technologies and approaches to our work, which means unexpected blockers and
+great insights to share. New connections are being formed, especially since
+more than half of this year’s participants are in their first year at Viget and
+experiencing their first Pointless event. Forming authentic co-worker
+connections isn’t easy, and our culture is stronger today than it was at the
+start of the week.
- [42]Brian Williams
+So what projects will launch? I won’t steal their thunder, but we just wrapped
+the presentation portion of six Pointless Project teams at our weekly staff
+meeting and it was the most we’ve laughed, cheered, and been inspired in a long
+time. I expect articles will be written and shared in the days and weeks ahead
+outlining the thrills (and mishaps) of the teams this year.
- [43]Brian is Viget's co-founder and CEO. He does everything from
- advising our clients to building our conference tables with his bare
- hands in our Falls Church, VA, HQ.
- [44]More articles by Brian
+[PointlessPalooza2023]
+Pointless Palooza 2023 was a blast!
+
+Pointless Corp. is more than an annual palooza. We work on projects throughout
+the year in the gaps between client work, weaving the teamwork, learning, and
+teaching values of Viget into all that we do.
+
+If this is the kind of work and culture you might enjoy, learn more about [46]
+our culture and job openings – perhaps you’ll be able to join next year’s
+Pointless Palooza. After all, inspiring people to join us is unapologetically
+part of the point.
+
+[47] Brian Williams
+
+[48]Brian is Viget's co-founder and CEO. He does everything from advising our
+clients to building our conference tables with his bare hands in our Falls
+Church, VA, HQ.
+
+[49]More articles by Brian
Related Articles
- * Article
+ • [50]
-Our Pointless Logo
- Brian Williams
- * Article
+ Article
-Introducing Pointless Corp.
- Brian Williams
- * What’s the Point of Pointless Weekend?
- Article
+ Our Pointless Logo
-What’s the Point of Pointless Weekend?
- Brian Williams
+ Brian Williams
+
+ • [51]
+
+ Article
+
+ Introducing Pointless Corp.
+
+ Brian Williams
+
+ • [52]
+ What’s the Point of Pointless Weekend?
+
+ Article
+
+ What’s the Point of Pointless Weekend?
+
+ Brian Williams
The Viget Newsletter
- Nobody likes popups, so we waited until now to recommend our
- newsletter, featuring thoughts, opinions, and tools for building a
- better digital world. [45]Read the current issue.
+Nobody likes popups, so we waited until now to recommend our newsletter,
+featuring thoughts, opinions, and tools for building a better digital world.
+[53]Read the current issue.
- [46]Subscribe Here (opens in new window)
+[54]Subscribe Here (opens in new window)
Site Footer
- Have an unsolvable problem or audacious idea?
+Have an unsolvable problem or audacious idea?
- Let’s get to work
- [47]Contact Us [48]hello@viget.com [49]703.891.0670
+Let’s get to work
- * Practice
- * [50]Work
- * [51]Services
- * [52]Articles
+[55] Contact Us [56] hello@viget.com [57] 703.891.0670
- * People
- * [53]Company
- * [54]Careers
- * [55]Code of Ethics
- * [56]Diversity & Inclusion
+ • Practice
+ • [58]Work
+ • [59]Services
+ • [60]Articles
- * More
- * [57]Pointless Corp.
- * [58]Explorations
- * [59]Code at Viget
+ • People
+ • [61]Company
+ • [62]Careers
+ • [63]Code of Ethics
+ • [64]Diversity & Inclusion
+
+ • More
+ • [65]Pointless Corp.
+ • [66]Explorations
+ • [67]Code at Viget
Sign Up For Our Newsletter
- A curated periodical featuring thoughts, opinions, and tools for
- building a better digital world.
- [60]Check it out
+A curated periodical featuring thoughts, opinions, and tools for building a
+better digital world.
+
+[68] Check it out
Social Links
- [61]Viget
- *
- *
- *
- *
- *
- *
+[69] Viget
+
+ • [70]
+ • [71]
+ • [72]
+ • [73]
+ • [74]
+ • [75]
Office Locations
- * [62]Washington DC Metro
- * [63]Durham, NC
- * [64]Boulder, CO
- * [65]Chattanooga, TN
+ • [76]Washington DC Metro
+ • [77]Durham, NC
+ • [78]Boulder, CO
+ • [79]Chattanooga, TN
- © 1999 – 2024 Viget Labs, LLC. [66]Terms [67]Privacy [68]MRF
+© 1999 – 2024 Viget Labs, LLC. [80]Terms [81]Privacy [82]MRF
- * [69]Home
- * [70]Articles
- * [71]The Enduring Point of Pointless Corp.
+ • [83]Home
+ • [84]Articles
+ • [85]The Enduring Point of Pointless Corp.
- [72]Subscribe (opens in a new window)
- (BUTTON) Share
- * [73]Share this page
- * [74]Share this page
- * [75]Post this page
+[86] Subscribe (opens in a new window)
+Share
-References
+ • [88] Share this page
+ • [89] Share this page
+ • [90] Post this page
- Visible links:
- 1. https://feeds.feedburner.com/Viget
- 2. https://www.googletagmanager.com/ns.html?id=GTM-5V7V
- 3. https://www.viget.com/articles/the-enduring-point-of-pointless-corp/#content
- 4. https://www.viget.com/
- 5. https://www.viget.com/work/
- 6. https://www.viget.com/services/
- 7. https://www.viget.com/articles/
- 8. https://www.viget.com/careers/
- 9. https://www.viget.com/contact/
- 10. https://www.viget.com/
- 11. https://www.viget.com/work/
- 12. https://www.viget.com/services/
- 13. https://www.viget.com/articles/
- 14. https://www.viget.com/contact/
- 15. https://www.viget.com/about/
- 16. https://www.viget.com/careers/
- 17. https://www.viget.com/code-of-ethics/
- 18. https://www.viget.com/diversity-equity-and-inclusion/
- 19. https://pointlesscorp.com/
- 20. https://explorations.viget.com/
- 21. https://code.viget.com/
- 22. https://www.viget.com/about/team/bwilliams/
- 23. https://www.viget.com/about/team/bwilliams/
- 24. https://www.viget.com/articles/category/news-culture/
- 25. https://www.viget.com/articles/category/employee-engagement/
- 26. https://www.viget.com/articles/the-point-of-pointless-corp/
- 27. https://www.viget.com/articles/book-review-giveaway-the-geometry-of-design/
- 28. https://www.viget.com/articles/introducing-heycraig/
- 29. https://pointlesscorp.com/tincand
- 30. https://www.babybookie.com/
- 31. https://www.viget.com/articles/a-pointless-weekend-or-so/
- 32. https://www.viget.com/articles/whats-the-point-of-pointless-weekend/
- 33. https://www.flickr.com/photos/viget/albums/72157626084778456
- 34. https://www.flickr.com/photos/viget/albums/72157649003978349
- 35. https://twitter.com/viget/status/798273078132408320
- 36. https://www.viget.com/about/team/athomas/
- 37. https://www.viget.com/about/team/aiwamoto/
- 38. https://twitter.com/pointlesscorp/status/1639274400976445444
- 39. https://twitter.com/viget/status/1637891007868968980
- 40. https://twitter.com/pointlesscorp/status/1638940667060838401
- 41. https://www.viget.com/careers/
- 42. https://www.viget.com/about/team/bwilliams/
- 43. https://www.viget.com/about/team/bwilliams/
- 44. https://www.viget.com/about/team/bwilliams/
- 45. https://www.viget.com/newsletter
- 46. http://eepurl.com/gtHqsj
- 47. https://www.viget.com/contact/
- 48. mailto:hello@viget.com?subject=Hello, Viget!
- 49. tel:7038910670
- 50. https://www.viget.com/work/
- 51. https://www.viget.com/services/
- 52. https://www.viget.com/articles/
- 53. https://www.viget.com/about/
- 54. https://www.viget.com/careers/
- 55. https://www.viget.com/code-of-ethics/
- 56. https://www.viget.com/diversity-equity-and-inclusion/
- 57. https://pointlesscorp.com/
- 58. https://explorations.viget.com/
- 59. https://code.viget.com/
- 60. https://www.viget.com/newsletter/
- 61. https://www.viget.com/
- 62. https://www.viget.com/dc-metro-hq/
- 63. https://www.viget.com/durham/
- 64. https://www.viget.com/boulder/
- 65. https://www.viget.com/chattanooga/
- 66. https://www.viget.com/terms-conditions/
- 67. https://www.viget.com/privacy-policy/
- 68. https://individual.carefirst.com/individuals-families/mandates-policies/machine-readable-file.page
- 69. https://www.viget.com/
- 70. https://www.viget.com/articles
- 71. https://www.viget.com/articles/the-enduring-point-of-pointless-corp/#hero
- 72. http://eepurl.com/gtHqsj
- 73. https://www.facebook.com/sharer/sharer.php?u=https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
- 74. http://www.linkedin.com/shareArticle?mini=true&url=https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
- 75. https://x.com/intent/tweet?text=Pointless Corp. is the innovation lab at Viget, where we step away from client work to make fun and useful things for everyone https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
- Hidden links:
- 77. https://www.viget.com/newsletter/revolutionizing-the-web/
- 78. https://www.viget.com/articles/the-reflection-before-christmas/
- 79. https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
- 80. http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
- 81. https://x.com/intent/tweet?text=Pointless%20Corp.%20is%20the%20innovation%20lab%20at%20Viget%2C%20where%20we%20step%20away%20from%20client%20work%20to%20make%20fun%20and%20useful%20things%20for%20everyone%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
- 82. https://www.viget.com/articles/our-pointless-logo/
- 83. https://www.viget.com/articles/introducing-pointless-corp/
- 84. https://www.viget.com/articles/whats-the-point-of-pointless-weekend/
- 85. http://x.com/viget
- 86. https://github.com/vigetlabs
- 87. https://dribbble.com/viget
- 88. https://www.instagram.com/viget/
- 89. https://www.linkedin.com/company/viget-labs
- 90. https://vimeo.com/viget/collections
+References:
+
+[1] https://www.viget.com/articles/the-enduring-point-of-pointless-corp/#content
+[2] https://www.viget.com/
+[3] https://www.viget.com/work/
+[4] https://www.viget.com/services/
+[5] https://www.viget.com/articles/
+[6] https://www.viget.com/careers/
+[7] https://www.viget.com/contact/
+[9] https://www.viget.com/
+[11] https://www.viget.com/work/
+[12] https://www.viget.com/services/
+[13] https://www.viget.com/articles/
+[14] https://www.viget.com/contact/
+[15] https://www.viget.com/about/
+[16] https://www.viget.com/careers/
+[17] https://www.viget.com/code-of-ethics/
+[18] https://www.viget.com/diversity-equity-and-inclusion/
+[19] https://pointlesscorp.com/
+[20] https://explorations.viget.com/
+[21] https://code.viget.com/
+[22] https://www.viget.com/newsletter/revolutionizing-the-web/
+[23] https://www.viget.com/articles/the-reflection-before-christmas/
+[24] https://www.viget.com/about/team/bwilliams/
+[25] https://www.viget.com/about/team/bwilliams/
+[26] https://www.viget.com/articles/category/news-culture/
+[27] https://www.viget.com/articles/category/employee-engagement/
+[28] https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
+[29] http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
+[30] https://x.com/intent/tweet?text=Pointless%20Corp.%20is%20the%20innovation%20lab%20at%20Viget%2C%20where%20we%20step%20away%20from%20client%20work%20to%20make%20fun%20and%20useful%20things%20for%20everyone%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
+[31] https://www.viget.com/articles/the-point-of-pointless-corp/
+[32] https://www.viget.com/articles/book-review-giveaway-the-geometry-of-design/
+[33] https://www.viget.com/articles/introducing-heycraig/
+[34] https://pointlesscorp.com/tincand
+[35] https://www.babybookie.com/
+[36] https://www.viget.com/articles/a-pointless-weekend-or-so/
+[37] https://www.viget.com/articles/whats-the-point-of-pointless-weekend/
+[38] https://www.flickr.com/photos/viget/albums/72157626084778456
+[39] https://www.flickr.com/photos/viget/albums/72157649003978349
+[40] https://twitter.com/viget/status/798273078132408320
+[41] https://www.viget.com/about/team/athomas/
+[42] https://www.viget.com/about/team/aiwamoto/
+[43] https://twitter.com/pointlesscorp/status/1639274400976445444
+[44] https://twitter.com/viget/status/1637891007868968980
+[45] https://twitter.com/pointlesscorp/status/1638940667060838401
+[46] https://www.viget.com/careers/
+[47] https://www.viget.com/about/team/bwilliams/
+[48] https://www.viget.com/about/team/bwilliams/
+[49] https://www.viget.com/about/team/bwilliams/
+[50] https://www.viget.com/articles/our-pointless-logo/
+[51] https://www.viget.com/articles/introducing-pointless-corp/
+[52] https://www.viget.com/articles/whats-the-point-of-pointless-weekend/
+[53] https://www.viget.com/newsletter
+[54] http://eepurl.com/gtHqsj
+[55] https://www.viget.com/contact/
+[56] mailto:hello@viget.com?subject=Hello%2C%20Viget%21
+[57] tel:7038910670
+[58] https://www.viget.com/work/
+[59] https://www.viget.com/services/
+[60] https://www.viget.com/articles/
+[61] https://www.viget.com/about/
+[62] https://www.viget.com/careers/
+[63] https://www.viget.com/code-of-ethics/
+[64] https://www.viget.com/diversity-equity-and-inclusion/
+[65] https://pointlesscorp.com/
+[66] https://explorations.viget.com/
+[67] https://code.viget.com/
+[68] https://www.viget.com/newsletter/
+[69] https://www.viget.com/
+[70] http://x.com/viget
+[71] https://github.com/vigetlabs
+[72] https://dribbble.com/viget
+[73] https://www.instagram.com/viget/
+[74] https://www.linkedin.com/company/viget-labs
+[75] https://vimeo.com/viget/collections
+[76] https://www.viget.com/dc-metro-hq/
+[77] https://www.viget.com/durham/
+[78] https://www.viget.com/boulder/
+[79] https://www.viget.com/chattanooga/
+[80] https://www.viget.com/terms-conditions/
+[81] https://www.viget.com/privacy-policy/
+[82] https://individual.carefirst.com/individuals-families/mandates-policies/machine-readable-file.page
+[83] https://www.viget.com/
+[84] https://www.viget.com/articles
+[85] https://www.viget.com/articles/the-enduring-point-of-pointless-corp/#hero
+[86] http://eepurl.com/gtHqsj
+[88] https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
+[89] http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
+[90] https://x.com/intent/tweet?text=Pointless%20Corp.%20is%20the%20innovation%20lab%20at%20Viget%2C%20where%20we%20step%20away%20from%20client%20work%20to%20make%20fun%20and%20useful%20things%20for%20everyone%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fthe-enduring-point-of-pointless-corp%2F
diff --git a/static/archive/www-viget-com-biybeb.txt b/static/archive/www-viget-com-biybeb.txt
index be63d73..1fbcb85 100644
--- a/static/archive/www-viget-com-biybeb.txt
+++ b/static/archive/www-viget-com-biybeb.txt
@@ -1,105 +1,106 @@
- #[1]Viget Articles
+[1] Skip to Main Content
+[2] Viget
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-5V7V
-
- [3]Skip to Main Content
-
- [4]Viget
-
- * [5]Work
- * [6]Services
- * [7]Articles
- * [8]Careers
- * [9]Contact
- * (BUTTON) Open Menu
+ • [3] Work
+ • [4] Services
+ • [5] Articles
+ • [6] Careers
+ • [7] Contact
+ • Open Menu
Navigation
- [10]Viget (BUTTON) Close
- * Practice
- * [11]Work
- * [12]Services
- * [13]Articles
+[9] Viget Close
- We’re a full-service digital agency that’s been helping clients make
- lasting change since 1999.
- [14]Contact Us
+ • Practice
+ • [11] Work
+ • [12] Services
+ • [13] Articles
+
+We’re a full-service digital agency that’s been helping clients make lasting
+change since 1999.
+
+[14] Contact Us
People
- * [15]Company
- * [16]Careers
- * [17]Code of Ethics
- * [18]Diversity & Inclusion
+ • [15]Company
+ • [16]Careers
+ • [17]Code of Ethics
+ • [18]Diversity & Inclusion
More
- * [19]Pointless Corp.
- * [20]Explorations
- * [21]Code at Viget
+ • [19]Pointless Corp.
+ • [20]Explorations
+ • [21]Code at Viget
Featured
- Read the Article: Revolutionizing the Web
+[22]
+Read the Article: Revolutionizing the Web
- Newsletter
+Newsletter
Revolutionizing the Web
- Read the Article: Elephants, Squirrels, Porcupines, and Zombies Can
- Help Your Team Thrive
+[23]
+Read the Article: Elephants, Squirrels, Porcupines, and Zombies Can Help Your
+Team Thrive
- Article
+Article
Elephants, Squirrels, Porcupines, and Zombies Can Help Your Team Thrive
Simple Commit Linting for Issue Number in GitHub Actions
- [22]David Eisinger
+[Git-Tips-030718]
+[24] David Eisinger
- [23]David Eisinger, Development Director
+[25]David Eisinger, Development Director
- Article Categories: [24]#Code, [25]#Tooling
+Article Categories: [26] #Code, [27] #Tooling
- Posted on April 28, 2023
- * Share
- * Share
- * Post
+Posted on April 28, 2023
- Including relevant ticket numbers in your git commit messages is a gift
- to your future self. Here's how to ensure you do it consistently.
+ • [28]
+ Share
+ • [29]
+ Share
+ • [30]
+ Post
- I n c l u d i n g r e l e v a n t t i c k e t n u m b e r s i n y o u r
- g i t c o m m i t m e s s a g e s i s a g i f t t o y o u r f u t u r e
- s e l f . H e r e ' s h o w t o e n s u r e y o u d o i t c o n s i s t
- e n t l y .
+Including relevant ticket numbers in your git commit messages is a gift to your
+future self. Here's how to ensure you do it consistently.
- I don't believe there is a right way to do software; I think teams can
- be effective (or ineffective!) in a lot of different ways using all
- sorts of methodologies and technologies. But one hill upon which I will
- die is this: referencing tickets in commit messages pays enormous
- dividends over the long haul and you should always do it. As someone
- who regularly commits code to apps created in the Obama era, nothing
- warms my heart like running [26]:Git blame on some confusing code and
- seeing a reference to a GitHub Issue where I can get the necessary
- context. And, conversely, nothing sparks nerd rage like fix bug or PR
- feedback or, heaven forbid, oops.
+I n c l u d i n g r e l e v a n t t i c k e t n u m b e r s i n y o u r g i t c
+o m m i t m e s s a g e s i s a g i f t t o y o u r f u t u r e s e l f . H e r
+e ' s h o w t o e n s u r e y o u d o i t c o n s i s t e n t l y .
- In a recent [27]project retrospective, the team identified that we
- weren't being as consistent with this as we'd like, and decided to take
- action. I figured some sort of commit linting would be a good candidate
- for [28]continuous integration — when a team member pushes a branch up
- to GitHub, check the commits and make sure they include a reference to
- a ticket.
+I don't believe there is a right way to do software; I think teams can be
+effective (or ineffective!) in a lot of different ways using all sorts of
+methodologies and technologies. But one hill upon which I will die is this:
+referencing tickets in commit messages pays enormous dividends over the long
+haul and you should always do it. As someone who regularly commits code to apps
+created in the Obama era, nothing warms my heart like running [31]:Git blame on
+some confusing code and seeing a reference to a GitHub Issue where I can get
+the necessary context. And, conversely, nothing sparks nerd rage like fix bug
+or PR feedback or, heaven forbid, oops.
+
+In a recent [32]project retrospective, the team identified that we weren't
+being as consistent with this as we'd like, and decided to take action. I
+figured some sort of commit linting would be a good candidate for [33]
+continuous integration — when a team member pushes a branch up to GitHub, check
+the commits and make sure they include a reference to a ticket.
+
+I looked into [34]commitlint, but I found it a lot more opinionated than I am —
+I really just want to make sure commits begin with either [#XXX] (an issue
+number) or [n/a] — and rather difficult to reconfigure. After struggling with
+it for a few hours, I decided to just DIY it with a simple inline script. If
+you just want something you can drop into a GitHub Actions YAML file to lint
+your commits, here it is (but stick around and I'll break it down and then show
+how to do it in a few other languages):
- I looked into [29]commitlint, but I found it a lot more opinionated
- than I am — I really just want to make sure commits begin with either
- [#XXX] (an issue number) or [n/a] — and rather difficult to
- reconfigure. After struggling with it for a few hours, I decided to
- just DIY it with a simple inline script. If you just want something you
- can drop into a GitHub Actions YAML file to lint your commits, here it
- is (but stick around and I'll break it down and then show how to do it
- in a few other languages):
steps:
- name: Checkout code
uses: actions/checkout@v3
@@ -121,24 +122,23 @@ Simple Commit Linting for Issue Number in GitHub Actions
end
'
- A few notes:
- * That fetch-depth: 0 is essential in order to be able to compare the
- branch being built with main (or whatever you call your primary
- development branch) — by default, your Action only knows about the
- current branch.
- * git log --format=format:%s HEAD ^origin/main is going to give you
- the first line of every commit that's in the source branch but not
- in main; those are the commits we want to lint.
- * With that list of commits, we loop through each message and compare
- it with the regular expression /^\[(#\d+|n\/a)\]/, i.e. does this
- message begin with either [#XXX] (where X are digits) or [n/a]?
- * If any message does not match, print an error out to standard error
- (that's warn) and exit with a non-zero status (so that the GitHub
- Action fails).
+A few notes:
+
+ • That fetch-depth: 0 is essential in order to be able to compare the branch
+ being built with main (or whatever you call your primary development
+ branch) — by default, your Action only knows about the current branch.
+ • git log --format=format:%s HEAD ^origin/main is going to give you the first
+ line of every commit that's in the source branch but not in main; those are
+ the commits we want to lint.
+ • With that list of commits, we loop through each message and compare it with
+ the regular expression /^\[(#\d+|n\/a)\]/, i.e. does this message begin
+ with either [#XXX] (where X are digits) or [n/a]?
+ • If any message does not match, print an error out to standard error (that's
+ warn) and exit with a non-zero status (so that the GitHub Action fails).
+
+If you want to try this out locally (or perhaps modify the script to validate
+messages in a different way), here's a docker run command you can use:
- If you want to try this out locally (or perhaps modify the script to
- validate messages in a different way), here's a docker run command you
- can use:
echo '[#123] Message 1
[n/a] Message 2
[#122] Message 3' | docker run --rm -i ruby:3.2.1 ruby -e '
@@ -149,66 +149,64 @@ echo '[#123] Message 1
end
'
- Note that running this command should output nothing since these are
- all valid commit messages; modify one of the messages if you want to
- see the failure state.
+Note that running this command should output nothing since these are all valid
+commit messages; modify one of the messages if you want to see the failure
+state.
-Other Languages [30]#
+Other Languages [35]#
- Since there's a very real possibility you might not otherwise install
- Ruby in your GitHub Actions, and because I weirdly enjoy writing the
- same code in a bunch of different languages, here are scripts for
- several of Viget's other favorites:
+Since there's a very real possibility you might not otherwise install Ruby in
+your GitHub Actions, and because I weirdly enjoy writing the same code in a
+bunch of different languages, here are scripts for several of Viget's other
+favorites:
-JavaScript [31]#
+JavaScript [36]#
git log --format=format:%s HEAD ^origin/main | node -e "
let msgs = require('fs').readFileSync(0).toString().trim().split('\n');
for (let msg of msgs) {
if (msg.match(/^\[(#\d+|n\/a)\]/)) { continue; }
- process.stderr.write('Commits must begin with [#XXX] or [n/a] (' + msg + ')'
-);
+ process.stderr.write('Commits must begin with [#XXX] or [n/a] (' + msg + ')');
process.exit(1);
}
"
- To test:
+To test:
+
echo '[#123] Message 1
[n/a] Message 2
[#122] Message 3' | docker run --rm -i node:18.15.0 node -e "
let msgs = require('fs').readFileSync(0).toString().trim().split('\n');
for (let msg of msgs) {
if (msg.match(/^\[(#\d+|n\/a)\]/)) { continue; }
- process.stderr.write('Commits must begin with [#XXX] or [n/a] (' + msg + ')'
-);
+ process.stderr.write('Commits must begin with [#XXX] or [n/a] (' + msg + ')');
process.exit(1);
}
"
-PHP [32]#
+PHP [37]#
git log --format=format:%s HEAD ^origin/main | php -r '
while ($msg = fgets(STDIN)) {
if (preg_match("/^\[(#\d+|n\/a)\]/", $msg)) { continue; }
- fwrite(STDERR, "Commits must begin with #[XXX] or [n/a] (" . trim($msg) . ")
-\n");
+ fwrite(STDERR, "Commits must begin with #[XXX] or [n/a] (" . trim($msg) . ")\n");
exit(1);
}
'
- To test:
+To test:
+
echo '[#123] Message 1
[n/a] Message 2
[#122] Message 3' | docker run --rm -i php:8.2.4 php -r '
while ($msg = fgets(STDIN)) {
if (preg_match("/^\[(#\d+|n\/a)\]/", $msg)) { continue; }
- fwrite(STDERR, "Commits must begin with #[XXX] or [n/a] (" . trim($msg) . ")
-\n");
+ fwrite(STDERR, "Commits must begin with #[XXX] or [n/a] (" . trim($msg) . ")\n");
exit(1);
}
'
-Python [33]#
+Python [38]#
git log --format=format:%s HEAD ^origin/main | python -c '
import sys
@@ -216,12 +214,12 @@ import re
for msg in sys.stdin:
if re.match(r"^\[(#\d+|n\/a)\]", msg):
continue
- print("Commits must begin with #[xxx] or [n/a] (%s)" % msg.strip(), file=sys
-.stderr)
+ print("Commits must begin with #[xxx] or [n/a] (%s)" % msg.strip(), file=sys.stderr)
sys.exit(1)
'
- To test:
+To test:
+
echo '[#123] Message 1
[n/a] Message 2
[#122] Message 3' | docker run --rm -i python:3.11.3 python -c '
@@ -230,196 +228,207 @@ import re
for msg in sys.stdin:
if re.match(r"^\[(#\d+|n\/a)\]", msg):
continue
- print("Commits must begin with #[xxx] or [n/a] (%s)" % msg.strip(), file=sys
-.stderr)
+ print("Commits must begin with #[xxx] or [n/a] (%s)" % msg.strip(), file=sys.stderr)
sys.exit(1)
'
- __________________________________________________________________
- So there you have it: simple GitHub Actions commit linting in most of
- Viget's favorite languages (try as I might, I could not figure out how
- to do this in [34]Elixir, at least not in a concise way). As I said up
- front, writing good tickets and then referencing them in commit
- messages so that they can easily be surfaced with git blame pays huge
- dividends over the life of a codebase. If you're not already in the
- habit of doing this, well, the best time to start was Initial commit,
- but the second best time is today.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- [35]David Eisinger
+So there you have it: simple GitHub Actions commit linting in most of Viget's
+favorite languages (try as I might, I could not figure out how to do this in
+[39]Elixir, at least not in a concise way). As I said up front, writing good
+tickets and then referencing them in commit messages so that they can easily be
+surfaced with git blame pays huge dividends over the life of a codebase. If
+you're not already in the habit of doing this, well, the best time to start was
+Initial commit, but the second best time is today.
- [36]David is Viget's managing development director. From our Durham,
- NC, office, he builds high-quality, forward-thinking software for PUMA,
- the World Wildlife Fund, NFLPA, and many others.
- [37]More articles by David
+[40] David Eisinger
+
+[41]David is Viget's managing development director. From our Durham, NC,
+office, he builds high-quality, forward-thinking software for PUMA, the World
+Wildlife Fund, NFLPA, and many others.
+
+[42]More articles by David
Related Articles
- * Thoughts on Remix
- Article
+ • [43]
+ Thoughts on Remix
-Thoughts on Remix
- Solomon Hawk
- * Going Headless in 2024: A View of the Headless CMS Landscape
- Article
+ Article
-Going Headless in 2024: A View of the Headless CMS Landscape
- Andrew Mosby
- * Maintenance Matters: Good Tests
- Article
+ Thoughts on Remix
-Maintenance Matters: Good Tests
- David Eisinger
+ Solomon Hawk
+
+ • [44]
+ Going Headless in 2024: A View of the Headless CMS Landscape
+
+ Article
+
+ Going Headless in 2024: A View of the Headless CMS Landscape
+
+ Andrew Mosby
+
+ • [45]
+ Maintenance Matters: Good Tests
+
+ Article
+
+ Maintenance Matters: Good Tests
+
+ David Eisinger
The Viget Newsletter
- Nobody likes popups, so we waited until now to recommend our
- newsletter, featuring thoughts, opinions, and tools for building a
- better digital world. [38]Read the current issue.
+Nobody likes popups, so we waited until now to recommend our newsletter,
+featuring thoughts, opinions, and tools for building a better digital world.
+[46]Read the current issue.
- [39]Subscribe Here (opens in new window)
+[47]Subscribe Here (opens in new window)
Site Footer
- Have an unsolvable problem or audacious idea?
+Have an unsolvable problem or audacious idea?
- Let’s get to work
- [40]Contact Us [41]hello@viget.com [42]703.891.0670
+Let’s get to work
- * Practice
- * [43]Work
- * [44]Services
- * [45]Articles
+[48] Contact Us [49] hello@viget.com [50] 703.891.0670
- * People
- * [46]Company
- * [47]Careers
- * [48]Code of Ethics
- * [49]Diversity & Inclusion
+ • Practice
+ • [51]Work
+ • [52]Services
+ • [53]Articles
- * More
- * [50]Pointless Corp.
- * [51]Explorations
- * [52]Code at Viget
+ • People
+ • [54]Company
+ • [55]Careers
+ • [56]Code of Ethics
+ • [57]Diversity & Inclusion
+
+ • More
+ • [58]Pointless Corp.
+ • [59]Explorations
+ • [60]Code at Viget
Sign Up For Our Newsletter
- A curated periodical featuring thoughts, opinions, and tools for
- building a better digital world.
- [53]Check it out
+A curated periodical featuring thoughts, opinions, and tools for building a
+better digital world.
+
+[61] Check it out
Social Links
- [54]Viget
- *
- *
- *
- *
- *
- *
+[62] Viget
+
+ • [63]
+ • [64]
+ • [65]
+ • [66]
+ • [67]
+ • [68]
Office Locations
- * [55]Washington DC Metro
- * [56]Durham, NC
- * [57]Boulder, CO
- * [58]Chattanooga, TN
+ • [69]Washington DC Metro
+ • [70]Durham, NC
+ • [71]Boulder, CO
+ • [72]Chattanooga, TN
- © 1999 – 2024 Viget Labs, LLC. [59]Terms [60]Privacy [61]MRF
+© 1999 – 2024 Viget Labs, LLC. [73]Terms [74]Privacy [75]MRF
- * [62]Home
- * [63]Articles
- * [64]Simple Commit Linting for Issue Number in GitHub Actions
+ • [76]Home
+ • [77]Articles
+ • [78]Simple Commit Linting for Issue Number in GitHub Actions
- [65]Subscribe (opens in a new window)
- (BUTTON) Share
- * [66]Share this page
- * [67]Share this page
- * [68]Post this page
+[79] Subscribe (opens in a new window)
+Share
-References
+ • [81] Share this page
+ • [82] Share this page
+ • [83] Post this page
- Visible links:
- 1. https://feeds.feedburner.com/Viget
- 2. https://www.googletagmanager.com/ns.html?id=GTM-5V7V
- 3. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#content
- 4. https://www.viget.com/
- 5. https://www.viget.com/work/
- 6. https://www.viget.com/services/
- 7. https://www.viget.com/articles/
- 8. https://www.viget.com/careers/
- 9. https://www.viget.com/contact/
- 10. https://www.viget.com/
- 11. https://www.viget.com/work/
- 12. https://www.viget.com/services/
- 13. https://www.viget.com/articles/
- 14. https://www.viget.com/contact/
- 15. https://www.viget.com/about/
- 16. https://www.viget.com/careers/
- 17. https://www.viget.com/code-of-ethics/
- 18. https://www.viget.com/diversity-equity-and-inclusion/
- 19. https://pointlesscorp.com/
- 20. https://explorations.viget.com/
- 21. https://code.viget.com/
- 22. https://www.viget.com/about/team/deisinger/
- 23. https://www.viget.com/about/team/deisinger/
- 24. https://www.viget.com/articles/category/code/
- 25. https://www.viget.com/articles/category/tooling/
- 26. https://github.com/tpope/vim-fugitive#fugitivevim
- 27. https://www.viget.com/articles/get-the-most-out-of-your-internal-retrospectives/
- 28. https://www.viget.com/articles/maintenance-matters-continuous-integration/
- 29. https://commitlint.js.org/
- 30. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#other-languages
- 31. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#javaScript
- 32. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#php
- 33. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#python
- 34. https://elixir-lang.org/
- 35. https://www.viget.com/about/team/deisinger/
- 36. https://www.viget.com/about/team/deisinger/
- 37. https://www.viget.com/about/team/deisinger/
- 38. https://www.viget.com/newsletter
- 39. http://eepurl.com/gtHqsj
- 40. https://www.viget.com/contact/
- 41. mailto:hello@viget.com?subject=Hello, Viget!
- 42. tel:7038910670
- 43. https://www.viget.com/work/
- 44. https://www.viget.com/services/
- 45. https://www.viget.com/articles/
- 46. https://www.viget.com/about/
- 47. https://www.viget.com/careers/
- 48. https://www.viget.com/code-of-ethics/
- 49. https://www.viget.com/diversity-equity-and-inclusion/
- 50. https://pointlesscorp.com/
- 51. https://explorations.viget.com/
- 52. https://code.viget.com/
- 53. https://www.viget.com/newsletter/
- 54. https://www.viget.com/
- 55. https://www.viget.com/dc-metro-hq/
- 56. https://www.viget.com/durham/
- 57. https://www.viget.com/boulder/
- 58. https://www.viget.com/chattanooga/
- 59. https://www.viget.com/terms-conditions/
- 60. https://www.viget.com/privacy-policy/
- 61. https://individual.carefirst.com/individuals-families/mandates-policies/machine-readable-file.page
- 62. https://www.viget.com/
- 63. https://www.viget.com/articles
- 64. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#hero
- 65. http://eepurl.com/gtHqsj
- 66. https://www.facebook.com/sharer/sharer.php?u=https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/
- 67. http://www.linkedin.com/shareArticle?mini=true&url=https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/
- 68. https://x.com/intent/tweet?text=Including relevant ticket numbers in your git commit messages is a gift to your future self. Here's how to ensure you do it consistently. https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/
- Hidden links:
- 70. https://www.viget.com/newsletter/revolutionizing-the-web/
- 71. https://www.viget.com/articles/elephants-squirrels-porcupines-and-zombies-can-help-your-team-thrive/
- 72. https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
- 73. http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
- 74. https://x.com/intent/tweet?text=Including%20relevant%20ticket%20numbers%20in%20your%20git%20commit%20messages%20is%20a%20gift%20to%20your%20future%20self.%20Here%27s%20how%20to%20ensure%20you%20do%20it%20consistently.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
- 75. https://www.viget.com/articles/thoughts-on-remix/
- 76. https://www.viget.com/articles/a-view-of-the-headless-cms-landscape/
- 77. https://www.viget.com/articles/maintenance-matters-good-tests/
- 78. http://x.com/viget
- 79. https://github.com/vigetlabs
- 80. https://dribbble.com/viget
- 81. https://www.instagram.com/viget/
- 82. https://www.linkedin.com/company/viget-labs
- 83. https://vimeo.com/viget/collections
+References:
+
+[1] https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#content
+[2] https://www.viget.com/
+[3] https://www.viget.com/work/
+[4] https://www.viget.com/services/
+[5] https://www.viget.com/articles/
+[6] https://www.viget.com/careers/
+[7] https://www.viget.com/contact/
+[9] https://www.viget.com/
+[11] https://www.viget.com/work/
+[12] https://www.viget.com/services/
+[13] https://www.viget.com/articles/
+[14] https://www.viget.com/contact/
+[15] https://www.viget.com/about/
+[16] https://www.viget.com/careers/
+[17] https://www.viget.com/code-of-ethics/
+[18] https://www.viget.com/diversity-equity-and-inclusion/
+[19] https://pointlesscorp.com/
+[20] https://explorations.viget.com/
+[21] https://code.viget.com/
+[22] https://www.viget.com/newsletter/revolutionizing-the-web/
+[23] https://www.viget.com/articles/elephants-squirrels-porcupines-and-zombies-can-help-your-team-thrive/
+[24] https://www.viget.com/about/team/deisinger/
+[25] https://www.viget.com/about/team/deisinger/
+[26] https://www.viget.com/articles/category/code/
+[27] https://www.viget.com/articles/category/tooling/
+[28] https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
+[29] http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
+[30] https://x.com/intent/tweet?text=Including%20relevant%20ticket%20numbers%20in%20your%20git%20commit%20messages%20is%20a%20gift%20to%20your%20future%20self.%20Here%27s%20how%20to%20ensure%20you%20do%20it%20consistently.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
+[31] https://github.com/tpope/vim-fugitive#fugitivevim
+[32] https://www.viget.com/articles/get-the-most-out-of-your-internal-retrospectives/
+[33] https://www.viget.com/articles/maintenance-matters-continuous-integration/
+[34] https://commitlint.js.org/
+[35] https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#other-languages
+[36] https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#javaScript
+[37] https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#php
+[38] https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#python
+[39] https://elixir-lang.org/
+[40] https://www.viget.com/about/team/deisinger/
+[41] https://www.viget.com/about/team/deisinger/
+[42] https://www.viget.com/about/team/deisinger/
+[43] https://www.viget.com/articles/thoughts-on-remix/
+[44] https://www.viget.com/articles/a-view-of-the-headless-cms-landscape/
+[45] https://www.viget.com/articles/maintenance-matters-good-tests/
+[46] https://www.viget.com/newsletter
+[47] http://eepurl.com/gtHqsj
+[48] https://www.viget.com/contact/
+[49] mailto:hello@viget.com?subject=Hello%2C%20Viget%21
+[50] tel:7038910670
+[51] https://www.viget.com/work/
+[52] https://www.viget.com/services/
+[53] https://www.viget.com/articles/
+[54] https://www.viget.com/about/
+[55] https://www.viget.com/careers/
+[56] https://www.viget.com/code-of-ethics/
+[57] https://www.viget.com/diversity-equity-and-inclusion/
+[58] https://pointlesscorp.com/
+[59] https://explorations.viget.com/
+[60] https://code.viget.com/
+[61] https://www.viget.com/newsletter/
+[62] https://www.viget.com/
+[63] http://x.com/viget
+[64] https://github.com/vigetlabs
+[65] https://dribbble.com/viget
+[66] https://www.instagram.com/viget/
+[67] https://www.linkedin.com/company/viget-labs
+[68] https://vimeo.com/viget/collections
+[69] https://www.viget.com/dc-metro-hq/
+[70] https://www.viget.com/durham/
+[71] https://www.viget.com/boulder/
+[72] https://www.viget.com/chattanooga/
+[73] https://www.viget.com/terms-conditions/
+[74] https://www.viget.com/privacy-policy/
+[75] https://individual.carefirst.com/individuals-families/mandates-policies/machine-readable-file.page
+[76] https://www.viget.com/
+[77] https://www.viget.com/articles
+[78] https://www.viget.com/articles/simple-commit-linting-for-issue-number-in-github-actions/#hero
+[79] http://eepurl.com/gtHqsj
+[81] https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
+[82] http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
+[83] https://x.com/intent/tweet?text=Including%20relevant%20ticket%20numbers%20in%20your%20git%20commit%20messages%20is%20a%20gift%20to%20your%20future%20self.%20Here%27s%20how%20to%20ensure%20you%20do%20it%20consistently.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fsimple-commit-linting-for-issue-number-in-github-actions%2F
diff --git a/static/archive/www-viget-com-yrczde.txt b/static/archive/www-viget-com-yrczde.txt
index 76b274d..721f491 100644
--- a/static/archive/www-viget-com-yrczde.txt
+++ b/static/archive/www-viget-com-yrczde.txt
@@ -1,405 +1,420 @@
- #[1]Viget Articles
+[1] Skip to Main Content
+[2] Viget
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-5V7V
-
- [3]Skip to Main Content
-
- [4]Viget
-
- * [5]Work
- * [6]Services
- * [7]Articles
- * [8]Careers
- * [9]Contact
- * (BUTTON) Open Menu
+ • [3] Work
+ • [4] Services
+ • [5] Articles
+ • [6] Careers
+ • [7] Contact
+ • Open Menu
Navigation
- [10]Viget (BUTTON) Close
- * Practice
- * [11]Work
- * [12]Services
- * [13]Articles
+[9] Viget Close
- We’re a full-service digital agency that’s been helping clients make
- lasting change since 1999.
- [14]Contact Us
+ • Practice
+ • [11] Work
+ • [12] Services
+ • [13] Articles
+
+We’re a full-service digital agency that’s been helping clients make lasting
+change since 1999.
+
+[14] Contact Us
People
- * [15]Company
- * [16]Careers
- * [17]Code of Ethics
- * [18]Diversity & Inclusion
+ • [15]Company
+ • [16]Careers
+ • [17]Code of Ethics
+ • [18]Diversity & Inclusion
More
- * [19]Pointless Corp.
- * [20]Explorations
- * [21]Code at Viget
+ • [19]Pointless Corp.
+ • [20]Explorations
+ • [21]Code at Viget
Featured
- Read the Article: Revolutionizing the Web
+[22]
+Read the Article: Revolutionizing the Web
- Newsletter
+Newsletter
Revolutionizing the Web
- Read the Article: The Reflection Before Christmas
+[23]
+Read the Article: The Reflection Before Christmas
- Article
+Article
The Reflection Before Christmas
What’s in a Word? Building a Verbose Party Game
- [22]Haroon Matties [23]David Eisinger
+[final]
+[24] Haroon Matties [25] David Eisinger
- Haley Johnson, Former Product Manager,
+Haley Johnson, Former Product Manager,
- [24]Haroon Matties, Product Designer,
+[26]Haroon Matties, Product Designer,
- Andrew Thomas, Former JavaScript Developer,
+Andrew Thomas, Former JavaScript Developer,
- Nicole Rymarz, Former Project Manager, and
+Nicole Rymarz, Former Project Manager, and
- [25]David Eisinger, Development Director
+[27]David Eisinger, Development Director
- Article Categories: [26]#News & Culture, [27]#Employee Engagement
+Article Categories: [28] #News & Culture, [29] #Employee Engagement
- Posted on May 25, 2023
- * Share
- * Share
- * Post
+Posted on May 25, 2023
- Our Pointless Palooza team designed and built a word-association game
- in 48 hours. Here's what we learned (and loved) while doing it.
+ • [30]
+ Share
+ • [31]
+ Share
+ • [32]
+ Post
- O u r P o i n t l e s s P a l o o z a t e a m d e s i g n e d a n d b u
- i l t a w o r d - a s s o c i a t i o n g a m e i n 4 8 h o u r s . H e
- r e ' s w h a t w e l e a r n e d ( a n d l o v e d ) w h i l e d o i n
- g i t .
+Our Pointless Palooza team designed and built a word-association game in 48
+hours. Here's what we learned (and loved) while doing it.
- Fun group party game. Somehow incorporate AI. Build it quickly. These
- were the constraints we put on our mostly Colorado-based Pointless
- Corp. team before [28]Pointless Palooza. A few of us wanted to partake
- in the old Pointless tradition of trying out another role on the
- project, so simplicity was key. Thankfully, Haley was itching to build
- a digital version of a very fun, but relatively straightforward, game.
+O u r P o i n t l e s s P a l o o z a t e a m d e s i g n e d a n d b u i l t a
+w o r d - a s s o c i a t i o n g a m e i n 4 8 h o u r s . H e r e ' s w h a t
+w e l e a r n e d ( a n d l o v e d ) w h i l e d o i n g i t .
- [29]Just One is a collaborative word association game that encourages
- both teamwork and creativity. On a given turn, everyone except one
- player (the Guesser) knows a random mystery word and must attempt to
- get the Guesser to guess the mystery word via one-word hints. The catch
- is that every hint must be unique, so duplicate hints are eliminated
- and not shown to the Guesser.
+Fun group party game. Somehow incorporate AI. Build it quickly. These were the
+constraints we put on our mostly Colorado-based Pointless Corp. team before
+[33]Pointless Palooza. A few of us wanted to partake in the old Pointless
+tradition of trying out another role on the project, so simplicity was key.
+Thankfully, Haley was itching to build a digital version of a very fun, but
+relatively straightforward, game.
- Haley mentioned that she often hacked the board game to accommodate
- more than 7 players and thought that doing so added a fun element of
- chaos to the rounds. A digital version of the game would facilitate
- expanding the party and it seemed like an easy enough lift for our
- team.
+[34]Just One is a collaborative word association game that encourages both
+teamwork and creativity. On a given turn, everyone except one player (the
+Guesser) knows a random mystery word and must attempt to get the Guesser to
+guess the mystery word via one-word hints. The catch is that every hint must be
+unique, so duplicate hints are eliminated and not shown to the Guesser.
- It’s easier to play than explain, so mosey on over to [30]verbose.club
- and give it a try. And, if you want to know more about how each of us
- fared going heads down on one project for 48 hours (and counting), read
- on.
+Haley mentioned that she often hacked the board game to accommodate more than 7
+players and thought that doing so added a fun element of chaos to the rounds. A
+digital version of the game would facilitate expanding the party and it seemed
+like an easy enough lift for our team.
-[31]Haley | Pointless Role: Design | Day Job: PM
+It’s easier to play than explain, so mosey on over to [35]verbose.club and give
+it a try. And, if you want to know more about how each of us fared going heads
+down on one project for 48 hours (and counting), read on.
- My favorite part of building verbose.club was being granted permission
- to focus on one project with my teammates. We hopped on Meets or
- huddles to discuss requirements. Nicole and I jammed in the same Figma
- file or wireframe. I got to drop everything to QA a 600-word word bank.
- Viget has great ways of collaborating remotely, but it was also fun to
- be part of the in-office crew, having late night snacks between cram
- sessions like we were in college again.
+[662shots_so-1]
- Something I learned: I tried my hand at being a “designer” and learned
- quickly that nothing is too precious. Sometimes the code translates
- things differently. Also, design systems are essential to throwing
- together screens quickly. And Figma has tons of libraries that you can
- use instead of starting from scratch!
- __________________________________________________________________
+[36]Haley | Pointless Role: Design | Day Job: PM
-[32]Haroon | Pointless Role: Dev | Day Job: Product Design
+My favorite part of building verbose.club was being granted permission to focus
+on one project with my teammates. We hopped on Meets or huddles to discuss
+requirements. Nicole and I jammed in the same Figma file or wireframe. I got to
+drop everything to QA a 600-word word bank. Viget has great ways of
+collaborating remotely, but it was also fun to be part of the in-office crew,
+having late night snacks between cram sessions like we were in college again.
- My favorite part of building verbose.club was stepping into a new role,
- or at least trying to. I got a chance to build out styled components
- and pages for our game with React, Typescript, and Tailwind. Though my
- constant questions for Andrew and David were likely annoying, it was an
- extremely rewarding experience to see a project come to life from
- another perspective.
+Something I learned: I tried my hand at being a “designer” and learned quickly
+that nothing is too precious. Sometimes the code translates things differently.
+Also, design systems are essential to throwing together screens quickly. And
+Figma has tons of libraries that you can use instead of starting from scratch!
- Something I learned is that it's best to keep commits atomic, meaning
- contributions to the codebase are small, isolated, and clear. Though a
- best practice for many, this approach made it easier for me as a novice
- to contribute quickly, and likely made it easier for Andrew to fix
- things later.
- __________________________________________________________________
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-[33]Nicole | Pointless Role: Design | Day Job: PM
+[37]Haroon | Pointless Role: Dev | Day Job: Product Design
- My favorite part of building verbose.club was seeing our team
- immediately dive in with a “we’re in this together” approach. I am
- still relatively new to Viget and it was my first time working with a
- handful of my teammates, so I really appreciated the collaborative
- environment and how everyone was really open to hearing new ideas,
- trying something new, and working together to make something cool.
+My favorite part of building verbose.club was stepping into a new role, or at
+least trying to. I got a chance to build out styled components and pages for
+our game with React, Typescript, and Tailwind. Though my constant questions for
+Andrew and David were likely annoying, it was an extremely rewarding experience
+to see a project come to life from another perspective.
- Something I learned was how to use [34]Whimsical and [35]Figma to make
- wireframes and designs. I had used these tools before; but, it was my
- first time “building” anything at Viget — and it was super fun. I’m
- glad I got to try something outside of my usual PM role.
- __________________________________________________________________
+Something I learned is that it's best to keep commits atomic, meaning
+contributions to the codebase are small, isolated, and clear. Though a best
+practice for many, this approach made it easier for me as a novice to
+contribute quickly, and likely made it easier for Andrew to fix things later.
-[36]Andrew | Pointless Role: CEO Dev | Day Job: Dev
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- My favorite part of building verbose.club was coordinating work among
- my teammates. With less than 3 days to do everything, we had to hit the
- ground running. To start, our PMs and designer jumped on wireframing
- and design thinking while David brought to life a Rails back-end & API.
- I was in a good spot to act as the messenger between these two lines of
- work: parsing high-level thinking & decisions from the designers into
- information useful to David in crafting the API; then shuttling David’s
- feedback back to the broader team.
- Next up, it was time to build out the user-facing Remix app. We were
- able to split this work into two parallel streams. I built out unstyled
- screens, game business logic, and the necessary glue code, resulting in
- a functional app with a barebones UI. In parallel, Haroon built out
- high-fidelity screens, using static placeholders where dynamic content
- would eventually live. From there, collaborating to merge our work and
- upgrade the UI was a simple task.
- I think our team came out of this project inspired by what can be
- accomplished with smart coordination. We managed to efficiently build
- consensus, parallelize work, and learn from one another — and the
- result speaks for itself.
+[38]Nicole | Pointless Role: Design | Day Job: PM
- Something I learned was that parallelizing a project is tricky and
- communication is key. When multiple streams of work are progressing in
- parallel, decisions are constantly being made — some big, some small —
- and many having more influence than immediately apparent. Keeping all
- contributors 100% in the loop is likely impossible, and certainly
- unrealistic. Smart coordination and communication is the magic sauce
- that makes it all work.
- __________________________________________________________________
+My favorite part of building verbose.club was seeing our team immediately dive
+in with a “we’re in this together” approach. I am still relatively new to Viget
+and it was my first time working with a handful of my teammates, so I really
+appreciated the collaborative environment and how everyone was really open to
+hearing new ideas, trying something new, and working together to make something
+cool.
-[37]David | Pointless Role: Dev | Day Job: Dev
+Something I learned was how to use [39]Whimsical and [40]Figma to make
+wireframes and designs. I had used these tools before; but, it was my first
+time “building” anything at Viget — and it was super fun. I’m glad I got to try
+something outside of my usual PM role.
- My favorite part of working on verbose.club was helping from afar. I
- was 1,500 miles and several time zones away from most of the team, so I
- really focused on doing low-level work that would enable the rest of
- the team to be successful: setting up an API, getting the app running
- on Docker for easy local development, and making it straightforward for
- others to deploy code. It was sort of like being the bass player in a
- rad band.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+[41]Andrew | Pointless Role: CEO Dev | Day Job: Dev
+
+My favorite part of building verbose.club was coordinating work among my
+teammates. With less than 3 days to do everything, we had to hit the ground
+running. To start, our PMs and designer jumped on wireframing and design
+thinking while David brought to life a Rails back-end & API. I was in a good
+spot to act as the messenger between these two lines of work: parsing
+high-level thinking & decisions from the designers into information useful to
+David in crafting the API; then shuttling David’s feedback back to the broader
+team.
+
+Next up, it was time to build out the user-facing Remix app. We were able to
+split this work into two parallel streams. I built out unstyled screens, game
+business logic, and the necessary glue code, resulting in a functional app with
+a barebones UI. In parallel, Haroon built out high-fidelity screens, using
+static placeholders where dynamic content would eventually live. From there,
+collaborating to merge our work and upgrade the UI was a simple task.
+
+I think our team came out of this project inspired by what can be accomplished
+with smart coordination. We managed to efficiently build consensus, parallelize
+work, and learn from one another — and the result speaks for itself.
+
+Something I learned was that parallelizing a project is tricky and
+communication is key. When multiple streams of work are progressing in
+parallel, decisions are constantly being made — some big, some small — and many
+having more influence than immediately apparent. Keeping all contributors 100%
+in the loop is likely impossible, and certainly unrealistic. Smart coordination
+and communication is the magic sauce that makes it all work.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+[42]David | Pointless Role: Dev | Day Job: Dev
+
+My favorite part of working on verbose.club was helping from afar. I was 1,500
+miles and several time zones away from most of the team, so I really focused on
+doing low-level work that would enable the rest of the team to be successful:
+setting up an API, getting the app running on Docker for easy local
+development, and making it straightforward for others to deploy code. It was
+sort of like being the bass player in a rad band.
+
+Something I learned is that [43]Caddy is super legit. Here’s the entire web
+server config file, which automatically sets up HTTPS and proxies traffic to
+our Remix app:
- Something I learned is that [38]Caddy is super legit. Here’s the entire
- web server config file, which automatically sets up HTTPS and proxies
- traffic to our Remix app:
verbose.club
reverse_proxy remix-prod:3001
- Our overall architecture (running with docker compose) looks like this:
- __________________________________________________________________
+Our overall architecture (running with docker compose) looks like this:
- In two days’ time, we had a beautiful, functioning game that we played
- during our Pointless celebration happy hour. Since then, we’ve added
- some cool animations and the ability to pull in AI players — no human
- friends required! So, grab some friends (robot or otherwise) and check
- out [39]verbose.club!
+[verbose-arch]
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- [40]Haroon Matties
+In two days’ time, we had a beautiful, functioning game that we played during
+our Pointless celebration happy hour. Since then, we’ve added some cool
+animations and the ability to pull in AI players — no human friends required!
+So, grab some friends (robot or otherwise) and check out [44]verbose.club!
- [41]Haroon is a product designer in our Boulder, CO office. His
- appreciation for human-centered design informs his approach to
- researching and building intuitive interfaces.
- [42]More articles by Haroon
- [43]David Eisinger
+[45] Haroon Matties
- [44]David is Viget's managing development director. From our Durham,
- NC, office, he builds high-quality, forward-thinking software for PUMA,
- the World Wildlife Fund, NFLPA, and many others.
- [45]More articles by David
+[46]Haroon is a product designer in our Boulder, CO office. His appreciation
+for human-centered design informs his approach to researching and building
+intuitive interfaces.
+
+[47]More articles by Haroon
+[48] David Eisinger
+
+[49]David is Viget's managing development director. From our Durham, NC,
+office, he builds high-quality, forward-thinking software for PUMA, the World
+Wildlife Fund, NFLPA, and many others.
+
+[50]More articles by David
Related Articles
- * Panel by Panel: A Comically Fun Way to Use Figma
- Article
+ • [51]
+ Panel by Panel: A Comically Fun Way to Use Figma
-Panel by Panel: A Comically Fun Way to Use Figma
- Gray Gill
- * The Enduring Point of Pointless Corp.
- Article
+ Article
-The Enduring Point of Pointless Corp.
- Brian Williams
- * Plan a Killer Party with Thrillr
- Article
+ Panel by Panel: A Comically Fun Way to Use Figma
-Plan a Killer Party with Thrillr
- Addison DeLancey
+ Gray Gill
+
+ • [52]
+ The Enduring Point of Pointless Corp.
+
+ Article
+
+ The Enduring Point of Pointless Corp.
+
+ Brian Williams
+
+ • [53]
+ Plan a Killer Party with Thrillr
+
+ Article
+
+ Plan a Killer Party with Thrillr
+
+ Addison DeLancey
The Viget Newsletter
- Nobody likes popups, so we waited until now to recommend our
- newsletter, featuring thoughts, opinions, and tools for building a
- better digital world. [46]Read the current issue.
+Nobody likes popups, so we waited until now to recommend our newsletter,
+featuring thoughts, opinions, and tools for building a better digital world.
+[54]Read the current issue.
- [47]Subscribe Here (opens in new window)
+[55]Subscribe Here (opens in new window)
Site Footer
- Have an unsolvable problem or audacious idea?
+Have an unsolvable problem or audacious idea?
- Let’s get to work
- [48]Contact Us [49]hello@viget.com [50]703.891.0670
+Let’s get to work
- * Practice
- * [51]Work
- * [52]Services
- * [53]Articles
+[56] Contact Us [57] hello@viget.com [58] 703.891.0670
- * People
- * [54]Company
- * [55]Careers
- * [56]Code of Ethics
- * [57]Diversity & Inclusion
+ • Practice
+ • [59]Work
+ • [60]Services
+ • [61]Articles
- * More
- * [58]Pointless Corp.
- * [59]Explorations
- * [60]Code at Viget
+ • People
+ • [62]Company
+ • [63]Careers
+ • [64]Code of Ethics
+ • [65]Diversity & Inclusion
+
+ • More
+ • [66]Pointless Corp.
+ • [67]Explorations
+ • [68]Code at Viget
Sign Up For Our Newsletter
- A curated periodical featuring thoughts, opinions, and tools for
- building a better digital world.
- [61]Check it out
+A curated periodical featuring thoughts, opinions, and tools for building a
+better digital world.
+
+[69] Check it out
Social Links
- [62]Viget
- *
- *
- *
- *
- *
- *
+[70] Viget
+
+ • [71]
+ • [72]
+ • [73]
+ • [74]
+ • [75]
+ • [76]
Office Locations
- * [63]Washington DC Metro
- * [64]Durham, NC
- * [65]Boulder, CO
- * [66]Chattanooga, TN
+ • [77]Washington DC Metro
+ • [78]Durham, NC
+ • [79]Boulder, CO
+ • [80]Chattanooga, TN
- © 1999 – 2024 Viget Labs, LLC. [67]Terms [68]Privacy [69]MRF
+© 1999 – 2024 Viget Labs, LLC. [81]Terms [82]Privacy [83]MRF
- * [70]Home
- * [71]Articles
- * [72]What’s in a Word? Building a Verbose Party Game
+ • [84]Home
+ • [85]Articles
+ • [86]What’s in a Word? Building a Verbose Party Game
- [73]Subscribe (opens in a new window)
- (BUTTON) Share
- * [74]Share this page
- * [75]Share this page
- * [76]Post this page
+[87] Subscribe (opens in a new window)
+Share
-References
+ • [89] Share this page
+ • [90] Share this page
+ • [91] Post this page
- Visible links:
- 1. https://feeds.feedburner.com/Viget
- 2. https://www.googletagmanager.com/ns.html?id=GTM-5V7V
- 3. https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/#content
- 4. https://www.viget.com/
- 5. https://www.viget.com/work/
- 6. https://www.viget.com/services/
- 7. https://www.viget.com/articles/
- 8. https://www.viget.com/careers/
- 9. https://www.viget.com/contact/
- 10. https://www.viget.com/
- 11. https://www.viget.com/work/
- 12. https://www.viget.com/services/
- 13. https://www.viget.com/articles/
- 14. https://www.viget.com/contact/
- 15. https://www.viget.com/about/
- 16. https://www.viget.com/careers/
- 17. https://www.viget.com/code-of-ethics/
- 18. https://www.viget.com/diversity-equity-and-inclusion/
- 19. https://pointlesscorp.com/
- 20. https://explorations.viget.com/
- 21. https://code.viget.com/
- 22. https://www.viget.com/about/team/hmatties/
- 23. https://www.viget.com/about/team/deisinger/
- 24. https://www.viget.com/about/team/hmatties/
- 25. https://www.viget.com/about/team/deisinger/
- 26. https://www.viget.com/articles/category/news-culture/
- 27. https://www.viget.com/articles/category/employee-engagement/
- 28. https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
- 29. https://boardgamegeek.com/boardgame/254640/just-one
- 30. https://verbose.club/
- 31. https://www.viget.com/about/team/hjohnson/
- 32. https://www.viget.com/about/team/hmatties/
- 33. https://www.viget.com/about/team/nrymarz/
- 34. http://whimsical.com/
- 35. http://figma.com/
- 36. https://www.viget.com/about/team/athomas/
- 37. https://www.viget.com/about/team/deisinger/
- 38. https://caddyserver.com/
- 39. https://verbose.club/
- 40. https://www.viget.com/about/team/hmatties/
- 41. https://www.viget.com/about/team/hmatties/
- 42. https://www.viget.com/about/team/hmatties/
- 43. https://www.viget.com/about/team/deisinger/
- 44. https://www.viget.com/about/team/deisinger/
- 45. https://www.viget.com/about/team/deisinger/
- 46. https://www.viget.com/newsletter
- 47. http://eepurl.com/gtHqsj
- 48. https://www.viget.com/contact/
- 49. mailto:hello@viget.com?subject=Hello, Viget!
- 50. tel:7038910670
- 51. https://www.viget.com/work/
- 52. https://www.viget.com/services/
- 53. https://www.viget.com/articles/
- 54. https://www.viget.com/about/
- 55. https://www.viget.com/careers/
- 56. https://www.viget.com/code-of-ethics/
- 57. https://www.viget.com/diversity-equity-and-inclusion/
- 58. https://pointlesscorp.com/
- 59. https://explorations.viget.com/
- 60. https://code.viget.com/
- 61. https://www.viget.com/newsletter/
- 62. https://www.viget.com/
- 63. https://www.viget.com/dc-metro-hq/
- 64. https://www.viget.com/durham/
- 65. https://www.viget.com/boulder/
- 66. https://www.viget.com/chattanooga/
- 67. https://www.viget.com/terms-conditions/
- 68. https://www.viget.com/privacy-policy/
- 69. https://individual.carefirst.com/individuals-families/mandates-policies/machine-readable-file.page
- 70. https://www.viget.com/
- 71. https://www.viget.com/articles
- 72. https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/#hero
- 73. http://eepurl.com/gtHqsj
- 74. https://www.facebook.com/sharer/sharer.php?u=https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/
- 75. http://www.linkedin.com/shareArticle?mini=true&url=https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/
- 76. https://x.com/intent/tweet?text=Our Pointless Palooza team designed and built a word-association game in 48 hours. Here's what we learned (and loved) while doing it. https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/
- Hidden links:
- 78. https://www.viget.com/newsletter/revolutionizing-the-web/
- 79. https://www.viget.com/articles/the-reflection-before-christmas/
- 80. https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
- 81. http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
- 82. https://x.com/intent/tweet?text=Our%20Pointless%20Palooza%20team%20designed%20and%20built%20a%20word-association%20game%20in%2048%20hours.%20Here%27s%20what%20we%20learned%20%28and%20loved%29%20while%20doing%20it.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
- 83. https://www.viget.com/articles/figma-comic-creator/
- 84. https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
- 85. https://www.viget.com/articles/plan-a-killer-party-with-thrillr/
- 86. http://x.com/viget
- 87. https://github.com/vigetlabs
- 88. https://dribbble.com/viget
- 89. https://www.instagram.com/viget/
- 90. https://www.linkedin.com/company/viget-labs
- 91. https://vimeo.com/viget/collections
+References:
+
+[1] https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/#content
+[2] https://www.viget.com/
+[3] https://www.viget.com/work/
+[4] https://www.viget.com/services/
+[5] https://www.viget.com/articles/
+[6] https://www.viget.com/careers/
+[7] https://www.viget.com/contact/
+[9] https://www.viget.com/
+[11] https://www.viget.com/work/
+[12] https://www.viget.com/services/
+[13] https://www.viget.com/articles/
+[14] https://www.viget.com/contact/
+[15] https://www.viget.com/about/
+[16] https://www.viget.com/careers/
+[17] https://www.viget.com/code-of-ethics/
+[18] https://www.viget.com/diversity-equity-and-inclusion/
+[19] https://pointlesscorp.com/
+[20] https://explorations.viget.com/
+[21] https://code.viget.com/
+[22] https://www.viget.com/newsletter/revolutionizing-the-web/
+[23] https://www.viget.com/articles/the-reflection-before-christmas/
+[24] https://www.viget.com/about/team/hmatties/
+[25] https://www.viget.com/about/team/deisinger/
+[26] https://www.viget.com/about/team/hmatties/
+[27] https://www.viget.com/about/team/deisinger/
+[28] https://www.viget.com/articles/category/news-culture/
+[29] https://www.viget.com/articles/category/employee-engagement/
+[30] https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
+[31] http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
+[32] https://x.com/intent/tweet?text=Our%20Pointless%20Palooza%20team%20designed%20and%20built%20a%20word-association%20game%20in%2048%20hours.%20Here%27s%20what%20we%20learned%20%28and%20loved%29%20while%20doing%20it.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
+[33] https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
+[34] https://boardgamegeek.com/boardgame/254640/just-one
+[35] https://verbose.club/
+[36] https://www.viget.com/about/team/hjohnson/
+[37] https://www.viget.com/about/team/hmatties/
+[38] https://www.viget.com/about/team/nrymarz/
+[39] http://whimsical.com/
+[40] http://figma.com/
+[41] https://www.viget.com/about/team/athomas/
+[42] https://www.viget.com/about/team/deisinger/
+[43] https://caddyserver.com/
+[44] https://verbose.club/
+[45] https://www.viget.com/about/team/hmatties/
+[46] https://www.viget.com/about/team/hmatties/
+[47] https://www.viget.com/about/team/hmatties/
+[48] https://www.viget.com/about/team/deisinger/
+[49] https://www.viget.com/about/team/deisinger/
+[50] https://www.viget.com/about/team/deisinger/
+[51] https://www.viget.com/articles/figma-comic-creator/
+[52] https://www.viget.com/articles/the-enduring-point-of-pointless-corp/
+[53] https://www.viget.com/articles/plan-a-killer-party-with-thrillr/
+[54] https://www.viget.com/newsletter
+[55] http://eepurl.com/gtHqsj
+[56] https://www.viget.com/contact/
+[57] mailto:hello@viget.com?subject=Hello%2C%20Viget%21
+[58] tel:7038910670
+[59] https://www.viget.com/work/
+[60] https://www.viget.com/services/
+[61] https://www.viget.com/articles/
+[62] https://www.viget.com/about/
+[63] https://www.viget.com/careers/
+[64] https://www.viget.com/code-of-ethics/
+[65] https://www.viget.com/diversity-equity-and-inclusion/
+[66] https://pointlesscorp.com/
+[67] https://explorations.viget.com/
+[68] https://code.viget.com/
+[69] https://www.viget.com/newsletter/
+[70] https://www.viget.com/
+[71] http://x.com/viget
+[72] https://github.com/vigetlabs
+[73] https://dribbble.com/viget
+[74] https://www.instagram.com/viget/
+[75] https://www.linkedin.com/company/viget-labs
+[76] https://vimeo.com/viget/collections
+[77] https://www.viget.com/dc-metro-hq/
+[78] https://www.viget.com/durham/
+[79] https://www.viget.com/boulder/
+[80] https://www.viget.com/chattanooga/
+[81] https://www.viget.com/terms-conditions/
+[82] https://www.viget.com/privacy-policy/
+[83] https://individual.carefirst.com/individuals-families/mandates-policies/machine-readable-file.page
+[84] https://www.viget.com/
+[85] https://www.viget.com/articles
+[86] https://www.viget.com/articles/whats-in-a-word-building-a-verbose-party-game/#hero
+[87] http://eepurl.com/gtHqsj
+[89] https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
+[90] http://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
+[91] https://x.com/intent/tweet?text=Our%20Pointless%20Palooza%20team%20designed%20and%20built%20a%20word-association%20game%20in%2048%20hours.%20Here%27s%20what%20we%20learned%20%28and%20loved%29%20while%20doing%20it.%20https%3A%2F%2Fwww.viget.com%2Farticles%2Fwhats-in-a-word-building-a-verbose-party-game%2F
diff --git a/static/archive/www-wired-com-ybjipw.txt b/static/archive/www-wired-com-ybjipw.txt
index 75dcdce..b96e5eb 100644
--- a/static/archive/www-wired-com-ybjipw.txt
+++ b/static/archive/www-wired-com-ybjipw.txt
@@ -1,556 +1,589 @@
- #[1]alternate
+[1]Skip to main content
+Open Navigation Menu
- IFRAME: [2]https://www.googletagmanager.com/ns.html?id=GTM-5HBJC2K
+To revist this article, visit My Profile, then [3]View saved stories.
- [3]Skip to main content
+Close Alert
+[5]WIRED
+I Finally Reached Computing Nirvana. What Was It All For?
- (BUTTON) Open Navigation Menu
+ • [6]Backchannel
+ • [7]Business
+ • [8]Culture
+ • [9]Gear
+ • [10]Ideas
+ • [11]Politics
+ • [12]Science
+ • [13]Security
+ • [14]Merch
- To revist this article, visit My Profile, then [4]View saved stories.
- (BUTTON) Close Alert
- [5]WIRED
- I Finally Reached Computing Nirvana. What Was It All For?
+More
- * [6]Backchannel
- * [7]Business
- * [8]Culture
- * [9]Gear
- * [10]Ideas
- * [11]Politics
- * [12]Science
- * [13]Security
- * [14]Merch
+To revist this article, visit My Profile, then [16]View saved stories.
- (BUTTON) More
+Close Alert
+[18]Sign In
- To revist this article, visit My Profile, then [15]View saved stories.
- (BUTTON) Close Alert
- [16]Sign In
+[19]Search
- [17]Search
+ • [20]Backchannel
+ • [21]Business
+ • [22]Culture
+ • [23]Gear
+ • [24]Ideas
+ • [25]Politics
+ • [26]Science
+ • [27]Security
+ • [28]Merch
- * [18]Backchannel
- * [19]Business
- * [20]Culture
- * [21]Gear
- * [22]Ideas
- * [23]Politics
- * [24]Science
- * [25]Security
- * [26]Merch
+ • [29]Podcasts
+ • [30]Video
+ • [31]Wired World
+ • [32]Artificial Intelligence
+ • [33]Climate
+ • [34]Games
+ • [35]Newsletters
+ • [36]Magazine
+ • [37]Events
+ • [38]Wired Insider
+ • [39]Jobs
+ • [40]Coupons
- * [27]Podcasts
- * [28]Video
- * [29]Wired World
- * [30]Artificial Intelligence
- * [31]Climate
- * [32]Games
- * [33]Newsletters
- * [34]Magazine
- * [35]Events
- * [36]Wired Insider
- * [37]Jobs
- * [38]Coupons
+[41]Paul Ford
- [39]Paul Ford
- [40]Ideas
- Apr 1, 2022 7:00 AM
+[42]Ideas
+Apr 1, 2022 7:00 AM
I Finally Reached Computing Nirvana. What Was It All For?
- Breakfast, it turns out. The answer is breakfast.
- illustration concept of an optimal computer system
- Illustration: Elena Lacey
+Breakfast, it turns out. The answer is breakfast.
+illustration concept of an optimal computer system
+Illustration: Elena Lacey
+Save
+Save
- (BUTTON) Save
- (BUTTON) Save
+Like many nerds before me, I spent a goodly portion of my life searching for
+the perfect [45]computing system. I wanted a single tool that would let me
+write prose or programs, that could search every email, tweet, or document in a
+few keystrokes, and that would work across all my devices. I yearned to summit
+the mythic Mt. Augment, to achieve the enlightenment of a properly orchestrated
+personal computer. Where the [46]software industry offered notifications,
+little clicks and dings, messages jumping up and down on my screen like a dog
+begging for a treat, I wanted calm textuality. Seeking it, I tweaked. I
+configured.
- Like many nerds before me, I spent a goodly portion of my life
- searching for the perfect [41]computing system. I wanted a single tool
- that would let me write prose or programs, that could search every
- email, tweet, or document in a few keystrokes, and that would work
- across all my devices. I yearned to summit the mythic Mt. Augment, to
- achieve the enlightenment of a properly orchestrated personal computer.
- Where the [42]software industry offered notifications, little clicks
- and dings, messages jumping up and down on my screen like a dog begging
- for a treat, I wanted calm textuality. Seeking it, I tweaked. I
- configured.
+The purpose of configuration is to make a thing work with some other thing—to
+make the to-do list work with the email client, say, or the calendar work with
+the other calendar. It's an interdisciplinary study. Configuration can be as
+complex as programming or as simple as checking a box. Everyone talks about it,
+but it's not taken that seriously, because there's not much profit in it. And
+unfortunately, configuration is indistinguishable from procrastination. A
+little is fine but too much is embarrassing.
- The purpose of configuration is to make a thing work with some other
- thing—to make the to-do list work with the email client, say, or the
- calendar work with the other calendar. It's an interdisciplinary study.
- Configuration can be as complex as programming or as simple as checking
- a box. Everyone talks about it, but it's not taken that seriously,
- because there's not much profit in it. And unfortunately, configuration
- is indistinguishable from procrastination. A little is fine but too
- much is embarrassing.
+[47]The Best Way to Learn Online? Be a Lurker
+Sneakbrowsing
+[48]
+The Best Way to Learn Online? Be a Lurker
- [43]The Best Way to Learn Online? Be a Lurker
- Sneakbrowsing
- The Best Way to Learn Online? Be a Lurker
+Paul Ford
- Paul Ford
- [44]Coders’ Primal Urge to Kill Inefficiency&-Everywhere
- Coders
- Coders’ Primal Urge to Kill Inefficiency—Everywhere
+[49]Coders’ Primal Urge to Kill Inefficiency&-Everywhere
+Coders
+[50]
+Coders’ Primal Urge to Kill Inefficiency—Everywhere
- Clive Thompson
- [45]Forget To-Do Lists. You Really Need a ‘Got Done’ List
- work smart
- Forget To-Do Lists. You Really Need a ‘Got Done’ List
+Clive Thompson
- Stacy S. Kim
+[51]Forget To-Do Lists. You Really Need a ‘Got Done’ List
+work smart
+[52]
+Forget To-Do Lists. You Really Need a ‘Got Done’ List
- I spent almost three decades configuring my text editor, amassing 20 or
- so dotfiles that would make one acronym or nonsense word concordant
- with another. (For me: i3wm + emacs + org-mode + notmuch + tmux, bound
- together with ssh + git + Syncthing + Tailscale.) I'd start down a
- path, but then there'd be some blocker—some bug I didn't understand,
- some page of errors I didn't have time to deal with—and I'd give up.
+Stacy S. Kim
- A big problem I had was where to put my stuff. I tried different
- databases, folder structures, private websites, cloud drives, and
- desktop search tools. The key, finally, was to turn nearly everything
- in my life into emails. All my calendar entries, essay drafts, tweets—I
- wrote programs that turned them into gigs and gigs of emails. Emails
- are horrible, messy, swollen, decrepit forms of data, but they are
- understood by everything everywhere. You can lard them with
- attachments. You can tag them. You can add any amount of metadata to
- them and synchronize them with servers. They suck, but they work. No
- higher praise.
+I spent almost three decades configuring my text editor, amassing 20 or so
+dotfiles that would make one acronym or nonsense word concordant with another.
+(For me: i3wm + emacs + org-mode + notmuch + tmux, bound together with ssh +
+git + Syncthing + Tailscale.) I'd start down a path, but then there'd be some
+blocker—some bug I didn't understand, some page of errors I didn't have time to
+deal with—and I'd give up.
- It took years to get all these emails into place, tag them, filter them
- just so. Little by little I could see more of the shape of my own data.
- And as I did this, software got better and computers got faster. Not
- only that, other people started sharing their config files on GitHub.
+A big problem I had was where to put my stuff. I tried different databases,
+folder structures, private websites, cloud drives, and desktop search tools.
+The key, finally, was to turn nearly everything in my life into emails. All my
+calendar entries, essay drafts, tweets—I wrote programs that turned them into
+gigs and gigs of emails. Emails are horrible, messy, swollen, decrepit forms of
+data, but they are understood by everything everywhere. You can lard them with
+attachments. You can tag them. You can add any amount of metadata to them and
+synchronize them with servers. They suck, but they work. No higher praise.
- Then, one cold day—January 31, 2022—something bizarre happened. I was
- at home, writing a little glue function to make my emails searchable
- from anywhere inside my text editor. I evaluated that tiny program and
- ran it. It worked. Somewhere in my brain, I felt a distinct click. I
- was done. No longer configuring, but configured. The world had
- conspired to give me what I wanted. I stood up from the computer,
- suffused with a sort of European-classical-composer level of emotion,
- and went for a walk. Was this happiness? Freedom? Or would I find
- myself back tomorrow, with a whole new set of requirements?
- Most Popular
- * [46]Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video
- Games
- Culture
- Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video
- Games
- Megan Farokhmanesh
- * [47]The Emmys Proved Streaming Changed TV for the Better
- Culture
- The Emmys Proved Streaming Changed TV for the Better
- Angela Watercutter
- * [48]A Flaw in Millions of Apple, AMD, and Qualcomm GPUs Could
- Expose AI Data
- Security
- A Flaw in Millions of Apple, AMD, and Qualcomm GPUs Could Expose AI
- Data
- Lily Hay Newman
- * [49]Even After a Landslide Victory, Trump Supporters Claim Iowa
- Caucus Was Rigged
- Politics
- Even After a Landslide Victory, Trump Supporters Claim Iowa Caucus
- Was Rigged
- David Gilbert
- *
+It took years to get all these emails into place, tag them, filter them just
+so. Little by little I could see more of the shape of my own data. And as I did
+this, software got better and computers got faster. Not only that, other people
+started sharing their config files on GitHub.
- The more “professional” a piece of software is intended to be, the more
- likely it is to be scriptable. CAD tools or 3D programs will provide
- whole languages just for configuration. But the huge consumer products,
- the operating systems themselves, are more and more locked down. The
- reasons are multiple—money, security, simplicity. A lot of our
- computing is done on someone else's terms. We describe it with carceral
- words. To assert control over your device, you “jailbreak” out.
+Then, one cold day—January 31, 2022—something bizarre happened. I was at home,
+writing a little glue function to make my emails searchable from anywhere
+inside my text editor. I evaluated that tiny program and ran it. It worked.
+Somewhere in my brain, I felt a distinct click. I was done. No longer
+configuring, but configured. The world had conspired to give me what I wanted.
+I stood up from the computer, suffused with a sort of
+European-classical-composer level of emotion, and went for a walk. Was this
+happiness? Freedom? Or would I find myself back tomorrow, with a whole new set
+of requirements?
- I wonder if this is one of the reasons people get into [50]crypto—they
- dream of a new world that can be customized like software. Programmable
- money, self-executing contracts, little scripts that rearrange reality.
- In DAOs (decentralized autonomous organizations), people use code to
- make social rules, then buy or do things with their consolidated
- digital might.
+Most Popular
- A lot of my friends hate all this stuff (perhaps [51]NFTs more than
- DAOs) with great passion; they see it as a closing off, a betrayal of
- the open, trust-driven nature of the early web. Others love it, seeing
- it as a continuation of the community-building, empowering nature of
- the early web. What I see is a generation of configurers coming into
- their own. Older web folks expected to create the new digital economy;
- these younger ones are trying to create the new economy economy. Their
- dream is a more perfect union where humans will, because of computers,
- stop acting in the ways we've been acting since we came out of the
- trees. Then again, $200 million in NFTs were stolen the day I drafted
- this column.
+ • [53]
+ Big Tech Won’t Let You Leave. Here's a Way Out
+ Ideas
+ [54]
+ Big Tech Won’t Let You Leave. Here's a Way Out
- When in history have we been able to schedule folly? Sometimes the only
- way to end the vacation is to drive the RV off a cliff.
+ Cory Doctorow
- Perhaps by the time you read this the NFTs will have been returned.
- That would be a good reconfiguration. But the likely outcome of the
- boom is that some people will cash out at the right time and become
- convinced that they hold the keys to the universe and will lecture us
- for the rest of our lives, and most people (like those who had their
- NFTs stolen) will be humbled, or at best break even. When in history
- have we been able to schedule folly? Sometimes the only way to end the
- vacation is to drive the RV off a cliff.
+ • [55]
+ How a 27-Year-Old Codebreaker Busted the Myth of Bitcoin’s Anonymity
+ Backchannel
+ [56]
+ How a 27-Year-Old Codebreaker Busted the Myth of Bitcoin’s Anonymity
- While the youth reconfigure society, I'm done configuring. A month has
- gone by since the click, and the urge to tweak is gone. My system looks
- like something from the '80s (a lot of it is from the '80s), but I
- finally got my room just the way I like it.
+ Andy Greenberg
- Here's what I mean. Say I search for the word “database”; 7,222 emails
- pop up. Most are from marketers and industry mailing lists proclaiming
- some technological triumph, but nestled among them are messages from
- me, or to me, about learning to use databases—XML databases, SQL
- databases, and so forth. When I read these old messages, I am always
- surprised at how little I've changed, how consistent my obsessions are.
- There's something valuable to me in just seeing that, in seeing how the
- world keeps trumpeting the new while the self stays the same. You'd
- think there'd be at least five new me's by now, given how often I've
- vowed to become better. But no. I've been writing about configuring my
- text editor since 1996. I've been running my mouth about databases at
- least that long. They say you can't dip your hand in the same river
- twice, but they rarely mention that it's the same hand doing the
- dipping.
- Most Popular
- * [52]Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video
- Games
- Culture
- Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video
- Games
- Megan Farokhmanesh
- * [53]The Emmys Proved Streaming Changed TV for the Better
- Culture
- The Emmys Proved Streaming Changed TV for the Better
- Angela Watercutter
- * [54]A Flaw in Millions of Apple, AMD, and Qualcomm GPUs Could
- Expose AI Data
- Security
- A Flaw in Millions of Apple, AMD, and Qualcomm GPUs Could Expose AI
- Data
- Lily Hay Newman
- * [55]Even After a Landslide Victory, Trump Supporters Claim Iowa
- Caucus Was Rigged
- Politics
- Even After a Landslide Victory, Trump Supporters Claim Iowa Caucus
- Was Rigged
- David Gilbert
- *
+ • [57]
+ Scabies Is Making a Comeback
+ Science
+ [58]
+ Scabies Is Making a Comeback
- Since the emails are, well, just emails, sometimes I hit Reply (by
- typing “r”). On a thread that went dormant a decade ago. I don't always
- offer context. Sometimes I just write, “Curious … how did this turn
- out?” I used to feel I was intruding, to just drop in like that. But
- what the hell. It's been a long pandemic. No one has to write back.
+ David Cox
- Out go the emails. Most get no reply; some get a bounce-back. But often
- enough, people respond at length. Some left the city and came back.
- Some are up for coffee. A surprising number are now cyborgs
- (pacemakers, hearing aids). Some are rich, some are broke, some are
- divorced. One is considering being frozen after death, some are
- considering getting into crypto, and one has moved to Miami. None of us
- understand our children.
+ • [59]
+ Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video Games
+ Culture
+ [60]
+ Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video Games
- I'm thinking of starting a Sunday morning waffle breakfast for
- [56]vaccinated people to come stare at each other. It's one thing to
- email after 10 years, but everyone appreciates an invitation to
- breakfast. Maybe I'll set up some sort of internet-connected LED
- scrolly screen, like they put on food carts, so out-of-towners can
- leave messages. I gotta have something to configure.
+ Megan Farokhmanesh
- If you'd asked me, back when I was still configuring, not yet
- configured, exactly why I was nurturing these dozens of dotfiles, I'd
- have had a hard time telling you. I would have said: I want a pure and
- sleek experience. I want the computer working for me, augmenting my
- dumb brain with its immense arithmetical speed. I want access to my
- whole digital self. So I am very surprised that the terminal result of
- my efforts is not some sort of ecstatic communion with the internet, or
- even with my own computer. The function of my whole big orchestrated,
- tagged, integrated system was merely to rekindle old ties. What was all
- that configuration for? It was, in all sincerity, for waffles.
- __________________________________________________________________
+ •
- This article appears in the April 2022 issue. [57]Subscribe now.
- __________________________________________________________________
+The more “professional” a piece of software is intended to be, the more likely
+it is to be scriptable. CAD tools or 3D programs will provide whole languages
+just for configuration. But the huge consumer products, the operating systems
+themselves, are more and more locked down. The reasons are multiple—money,
+security, simplicity. A lot of our computing is done on someone else's terms.
+We describe it with carceral words. To assert control over your device, you
+“jailbreak” out.
- More Great WIRED Stories
- * 📩 The latest on tech, science, and more: [58]Get our newsletters!
- * [59]Jacques Vallée still doesn’t know what UFOs are
- * When should you [60]test yourself for Covid-19?
- * [61]How to leave your photos to someone when you die
- * TV struggles to put [62]Silicon Valley on the screen
- * [63]YouTube's captions insert explicit language in kids' videos
- * 👁️ Explore AI like never before with [64]our new database
- * 🎧 Things not sounding right? Check out our favorite [65]wireless
- headphones, [66]soundbars, and [67]Bluetooth speakers
+I wonder if this is one of the reasons people get into [61]crypto—they dream of
+a new world that can be customized like software. Programmable money,
+self-executing contracts, little scripts that rearrange reality. In DAOs
+(decentralized autonomous organizations), people use code to make social rules,
+then buy or do things with their consolidated digital might.
- [68]Paul Ford is a writer, programmer, and software entrepreneur. He
- lives in Brooklyn.
- Contributor
- *
+A lot of my friends hate all this stuff (perhaps [62]NFTs more than DAOs) with
+great passion; they see it as a closing off, a betrayal of the open,
+trust-driven nature of the early web. Others love it, seeing it as a
+continuation of the community-building, empowering nature of the early web.
+What I see is a generation of configurers coming into their own. Older web
+folks expected to create the new digital economy; these younger ones are trying
+to create the new economy economy. Their dream is a more perfect union where
+humans will, because of computers, stop acting in the ways we've been acting
+since we came out of the trees. Then again, $200 million in NFTs were stolen
+the day I drafted this column.
- Topics[69]magazine-30.04[70]crypto[71]NFTs[72]software[73]Web3
+When in history have we been able to schedule folly? Sometimes the only way to
+end the vacation is to drive the RV off a cliff.
- More from WIRED
- [74]
- A Key to Detecting Brain Disease Earlier Than Ever
- A Key to Detecting Brain Disease Earlier Than Ever
- Treatment of Parkinson’s, Huntington’s, ALS, and other brain diseases
- depends on reliable detection—especially in those who don’t even know
- they’re at risk. An innovative scratch-and-sniff test can help.
+Perhaps by the time you read this the NFTs will have been returned. That would
+be a good reconfiguration. But the likely outcome of the boom is that some
+people will cash out at the right time and become convinced that they hold the
+keys to the universe and will lecture us for the rest of our lives, and most
+people (like those who had their NFTs stolen) will be humbled, or at best break
+even. When in history have we been able to schedule folly? Sometimes the only
+way to end the vacation is to drive the RV off a cliff.
- Michael J. Fox
- [75]The Danger of Digitizing Everything
- The Danger of Digitizing Everything
- The creep of conducting our day-to-day interactions over screens has
- reached a breaking point—and it threatens to push out everyone but
- those with the “right” access.
+While the youth reconfigure society, I'm done configuring. A month has gone by
+since the click, and the urge to tweak is gone. My system looks like something
+from the '80s (a lot of it is from the '80s), but I finally got my room just
+the way I like it.
- Naomi Alderman
- [76]Regulators Are Finally Catching Up With Big Tech
- Regulators Are Finally Catching Up With Big Tech
- The lawless, Wild West era of AI and technology is almost at an end, as
- data protection authorities use new and existing legislation to get
- tough.
+Here's what I mean. Say I search for the word “database”; 7,222 emails pop up.
+Most are from marketers and industry mailing lists proclaiming some
+technological triumph, but nestled among them are messages from me, or to me,
+about learning to use databases—XML databases, SQL databases, and so forth.
+When I read these old messages, I am always surprised at how little I've
+changed, how consistent my obsessions are. There's something valuable to me in
+just seeing that, in seeing how the world keeps trumpeting the new while the
+self stays the same. You'd think there'd be at least five new me's by now,
+given how often I've vowed to become better. But no. I've been writing about
+configuring my text editor since 1996. I've been running my mouth about
+databases at least that long. They say you can't dip your hand in the same
+river twice, but they rarely mention that it's the same hand doing the dipping.
- Susie Alegre
- [77]Get Ready for the Great AI Disappointment
- Get Ready for the Great AI Disappointment
- Rose-tinted predictions for artificial intelligence’s grand
- achievements will be swept aside by underwhelming performance and
- dangerous results.
+Most Popular
- Daron Acemoglu
- [78]The Ocean’s Mysteries&-and Marvels&-Are About to Reach New Depths
- The Ocean’s Mysteries—and Marvels—Are About to Reach New Depths
- Advancements in science will bring unprecedented lens into the
- complexities of the ocean, and a renewed call for humans to protect it.
+ • [63]
+ Big Tech Won’t Let You Leave. Here's a Way Out
+ Ideas
+ [64]
+ Big Tech Won’t Let You Leave. Here's a Way Out
- Helen Czerski
- [79]AI Needs to Be Both Trusted and Trustworthy
- AI Needs to Be Both Trusted and Trustworthy
- Through sensors, actuators, and IoT devices, AI is going to be
- interacting with the physical plane on a massive scale. The question
- is, how does one build trust in its actions?
+ Cory Doctorow
- Bruce Schneier
- [80]The End of One-Size-Fits-All Health Care
- The End of One-Size-Fits-All Health Care
- Medicines need to be safe for all, but also effective for the
- individual. Embracing our differences will lead to better health care
- for everyone.
+ • [65]
+ How a 27-Year-Old Codebreaker Busted the Myth of Bitcoin’s Anonymity
+ Backchannel
+ [66]
+ How a 27-Year-Old Codebreaker Busted the Myth of Bitcoin’s Anonymity
- Angela Saini
- [81]Digitization Beats Deforestation
- Digitization Beats Deforestation
- Geolocation, supply-chain tracking, and digital payments are the tools
- that will enable farmers and consumers to make better choices.
+ Andy Greenberg
- Alloysius Attah
+ • [67]
+ Scabies Is Making a Comeback
+ Science
+ [68]
+ Scabies Is Making a Comeback
- [82]WIRED
- WIRED is where tomorrow is realized. It is the essential source of
- information and ideas that make sense of a world in constant
- transformation. The WIRED conversation illuminates how technology is
- changing every aspect of our lives—from culture to business, science to
- design. The breakthroughs and innovations that we uncover lead to new
- ways of thinking, new connections, and new industries.
+ David Cox
- (BUTTON) More From WIRED
- * [83]Subscribe
- * [84]Newsletters
- * [85]FAQ
- * [86]WIRED Staff
- * [87]Editorial Standards
- * [88]Archive
- * [89]RSS
- * [90]Accessibility Help
+ • [69]
+ Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video Games
+ Culture
+ [70]
+ Cult of the Lamb’s ‘Sex Update’ Is a Good Sign for Horny Video Games
- (BUTTON) Reviews and Guides
- * [91]Reviews
- * [92]Buying Guides
- * [93]Coupons
- * [94]Mattresses
- * [95]Electric Bikes
- * [96]Fitness Trackers
- * [97]Streaming Guides
+ Megan Farokhmanesh
- * [98]Advertise
- * [99]Contact Us
- * [100]Customer Care
- * [101]Jobs
- * [102]Press Center
- * [103]Condé Nast Store
+ •
- © 2024 Condé Nast. All rights reserved. Use of this site constitutes
- acceptance of our [104]User Agreement and [105]Privacy Policy and
- Cookie Statement and [106]Your California Privacy Rights. WIRED may
- earn a portion of sales from products that are purchased through our
- site as part of our Affiliate Partnerships with retailers. The material
- on this site may not be reproduced, distributed, transmitted, cached or
- otherwise used, except with the prior written permission of Condé Nast.
- [107]Ad Choices
+Since the emails are, well, just emails, sometimes I hit Reply (by typing “r”).
+On a thread that went dormant a decade ago. I don't always offer context.
+Sometimes I just write, “Curious … how did this turn out?” I used to feel I was
+intruding, to just drop in like that. But what the hell. It's been a long
+pandemic. No one has to write back.
+
+Out go the emails. Most get no reply; some get a bounce-back. But often enough,
+people respond at length. Some left the city and came back. Some are up for
+coffee. A surprising number are now cyborgs (pacemakers, hearing aids). Some
+are rich, some are broke, some are divorced. One is considering being frozen
+after death, some are considering getting into crypto, and one has moved to
+Miami. None of us understand our children.
+
+I'm thinking of starting a Sunday morning waffle breakfast for [71]vaccinated
+people to come stare at each other. It's one thing to email after 10 years, but
+everyone appreciates an invitation to breakfast. Maybe I'll set up some sort of
+internet-connected LED scrolly screen, like they put on food carts, so
+out-of-towners can leave messages. I gotta have something to configure.
+
+If you'd asked me, back when I was still configuring, not yet configured,
+exactly why I was nurturing these dozens of dotfiles, I'd have had a hard time
+telling you. I would have said: I want a pure and sleek experience. I want the
+computer working for me, augmenting my dumb brain with its immense arithmetical
+speed. I want access to my whole digital self. So I am very surprised that the
+terminal result of my efforts is not some sort of ecstatic communion with the
+internet, or even with my own computer. The function of my whole big
+orchestrated, tagged, integrated system was merely to rekindle old ties. What
+was all that configuration for? It was, in all sincerity, for waffles.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+
+This article appears in the April 2022 issue. [72]Subscribe now.
+
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+More Great WIRED Stories
+
+ • 📩 The latest on tech, science, and more: [73]Get our newsletters!
+ • [74]Jacques Vallée still doesn’t know what UFOs are
+ • When should you [75]test yourself for Covid-19?
+ • [76]How to leave your photos to someone when you die
+ • TV struggles to put [77]Silicon Valley on the screen
+ • [78]YouTube's captions insert explicit language in kids' videos
+ • 👁️ Explore AI like never before with [79]our new database
+ • 🎧 Things not sounding right? Check out our favorite [80]wireless headphones
+ , [81]soundbars, and [82]Bluetooth speakers
+
+[83]Paul Ford is a writer, programmer, and software entrepreneur. He lives in
+Brooklyn.
+Contributor
+
+ • [84]
+
+Topics[85]magazine-30.04[86]crypto[87]NFTs[88]software[89]Web3
+More from WIRED
+[90]
+A Key to Detecting Brain Disease Earlier Than Ever
+[91]
+A Key to Detecting Brain Disease Earlier Than Ever
+Treatment of Parkinson’s, Huntington’s, ALS, and other brain diseases depends
+on reliable detection—especially in those who don’t even know they’re at risk.
+An innovative scratch-and-sniff test can help.
+
+Michael J. Fox
+
+[92]
+The Danger of Digitizing Everything
+[93]
+The Danger of Digitizing Everything
+The creep of conducting our day-to-day interactions over screens has reached a
+breaking point—and it threatens to push out everyone but those with the “right”
+access.
+
+Naomi Alderman
+
+[94]
+Forget Growth. Optimize for Resilience
+[95]
+Forget Growth. Optimize for Resilience
+The tech economy is all about getting those next 10,000 users. What if it
+maximized something else for a change?
+
+Paul Ford
+
+[96]
+AI Needs to Be Both Trusted and Trustworthy
+[97]
+AI Needs to Be Both Trusted and Trustworthy
+Through sensors, actuators, and IoT devices, AI is going to be interacting with
+the physical plane on a massive scale. The question is, how does one build
+trust in its actions?
+
+Bruce Schneier
+
+[98]
+To Own the Future, Read Shakespeare
+[99]
+To Own the Future, Read Shakespeare
+Tech and the liberal arts have always been at war. Don’t assume Silicon Valley
+will win.
+
+Paul Ford
+
+[100]
+Gene Editing Needs to Be for Everyone
+[101]
+Gene Editing Needs to Be for Everyone
+Crispr recently marked a major milestone in medicine. But it's not time for a
+victory lap—the race is just beginning.
+
+Jennifer Doudna
+
+[102]
+Big Tech Won’t Let You Leave. Here's a Way Out
+[103]
+Big Tech Won’t Let You Leave. Here's a Way Out
+The year 2023 saw the “enshittification” of platforms from Facebook to Google
+Search. A new exit strategy means platforms will have to play nicely with your
+data, even if you leave for a rival.
+
+Cory Doctorow
+
+[104]
+The Creative’s Toolbox Gets an AI Upgrade
+[105]
+The Creative’s Toolbox Gets an AI Upgrade
+It’s easy to accuse algorithms of stifling creativity, but designers of every
+stripe should be embracing their multidisciplinary abilities.
+
+Suhair Khan
+
+[106]WIRED
+WIRED is where tomorrow is realized. It is the essential source of information
+and ideas that make sense of a world in constant transformation. The WIRED
+conversation illuminates how technology is changing every aspect of our
+lives—from culture to business, science to design. The breakthroughs and
+innovations that we uncover lead to new ways of thinking, new connections, and
+new industries.
+
+More From WIRED
+
+ • [108]Subscribe
+ • [109]Newsletters
+ • [110]FAQ
+ • [111]WIRED Staff
+ • [112]Editorial Standards
+ • [113]Archive
+ • [114]RSS
+ • [115]Accessibility Help
+
+Reviews and Guides
+
+ • [117]Reviews
+ • [118]Buying Guides
+ • [119]Coupons
+ • [120]Mattresses
+ • [121]Electric Bikes
+ • [122]Fitness Trackers
+ • [123]Streaming Guides
+
+ • [124]Advertise
+ • [125]Contact Us
+ • [126]Customer Care
+ • [127]Jobs
+ • [128]Press Center
+ • [129]Condé Nast Store
+
+© 2024 Condé Nast. All rights reserved. Use of this site constitutes acceptance
+of our [130]User Agreement and [131]Privacy Policy and Cookie Statement and
+[132]Your California Privacy Rights. WIRED may earn a portion of sales from
+products that are purchased through our site as part of our Affiliate
+Partnerships with retailers. The material on this site may not be reproduced,
+distributed, transmitted, cached or otherwise used, except with the prior
+written permission of Condé Nast. [133]Ad Choices
Select international site
- (BUTTON) United States
- * [108]UK
- * [109]Italia
- * [110]Japón
- * [111]Czech Republic & Slovakia
+United States
- *
- *
- *
- *
- *
- *
+ • [135]UK
+ • [136]Italia
+ • [137]Japón
+ • [138]Czech Republic & Slovakia
- (BUTTON) Do Not Sell My Personal Info
+ • [139]
+ • [140]
+ • [141]
+ • [142]
+ • [143]
+ • [144]
-References
+Do Not Sell My Personal Info
- Visible links:
- 1. https://www.wired.com/feed/rss
- 2. https://www.googletagmanager.com/ns.html?id=GTM-5HBJC2K
- 3. https://www.wired.com/story/i-finally-reached-computing-nirvana-what-was-it-all-for/#main-content
- 4. https://www.wired.com/account/saved
- 5. https://www.wired.com/
- 6. https://www.wired.com/category/backchannel/
- 7. https://www.wired.com/category/business/
- 8. https://www.wired.com/category/culture/
- 9. https://www.wired.com/category/gear/
- 10. https://www.wired.com/category/ideas/
- 11. https://www.wired.com/category/politics/
- 12. https://www.wired.com/category/science/
- 13. https://www.wired.com/category/security/
- 14. https://shop.wired.com/
- 15. https://www.wired.com/account/saved
- 16. https://www.wired.com/auth/initiate?redirectURL=/story/i-finally-reached-computing-nirvana-what-was-it-all-for/&source=VERSO_NAVIGATION
- 17. https://www.wired.com/search/
- 18. https://www.wired.com/category/backchannel/
- 19. https://www.wired.com/category/business/
- 20. https://www.wired.com/category/culture/
- 21. https://www.wired.com/category/gear/
- 22. https://www.wired.com/category/ideas/
- 23. https://www.wired.com/category/politics/
- 24. https://www.wired.com/category/science/
- 25. https://www.wired.com/category/security/
- 26. https://shop.wired.com/
- 27. https://www.wired.com/podcasts/
- 28. https://www.wired.com/video/
- 29. https://www.wired.com/wired-world/
- 30. https://www.wired.com/category/artificial-intelligence/
- 31. https://www.wired.com/category/science/environment-climate-change/
- 32. https://www.wired.com/tag/video-games/
- 33. https://www.wired.com/newsletter
- 34. https://www.wired.com/magazine
- 35. https://events.wired.com/livewired
- 36. https://www.wired.com/category/wiredinsider/
- 37. https://jobs.wired.com/?source=navbar
- 38. https://www.wired.com/coupons
- 39. https://www.wired.com/author/paul-ford
- 40. https://www.wired.com/category/ideas
- 41. https://www.wired.com/tag/computers/
- 42. https://www.wired.com/tag/software/
- 43. https://www.wired.com/story/best-way-learn-online-be-lurker/
- 44. https://www.wired.com/story/coders-efficiency-is-beautiful/
- 45. https://www.wired.com/story/productivity-got-done-list/
- 46. https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 47. https://www.wired.com/story/emmys-streaming-succession-the-bear-hbo-hulu/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 48. https://www.wired.com/story/leftoverlocals-gpu-vulnerability-generative-ai/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 49. https://www.wired.com/story/trump-iowa-conspiracies/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 50. https://www.wired.com/tag/cryptocurrency/
- 51. https://www.wired.com/tag/nfts/
- 52. https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 53. https://www.wired.com/story/emmys-streaming-succession-the-bear-hbo-hulu/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 54. https://www.wired.com/story/leftoverlocals-gpu-vulnerability-generative-ai/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 55. https://www.wired.com/story/trump-iowa-conspiracies/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 56. https://www.wired.com/tag/vaccines/
- 57. https://subscribe.wired.com/subscribe/splits/wired/WIR_Edit_Hardcoded?source=ArticleEnd_CMlink
- 58. https://www.wired.com/newsletter?sourceCode=BottomStories
- 59. https://www.wired.com/story/jacques-vallee-still-doesnt-know-what-ufos-are/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 60. https://www.wired.com/story/when-to-test-for-covid-vaccinated/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 61. https://www.wired.com/story/how-to-leave-photos-behind-when-you-die/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 62. https://www.wired.com/story/wecrashed-tv-silicon-valley/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 63. https://www.wired.com/story/youtubes-captions-insert-explicit-language-kids-videos/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 64. https://www.wired.com/category/artificial-intelligence/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 65. https://www.wired.com/gallery/best-wireless-headphones/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 66. https://www.wired.com/gallery/best-soundbars/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 67. https://www.wired.com/gallery/best-bluetooth-speakers/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
- 68. https://www.wired.com/author/paul-ford
- 69. https://www.wired.com/tag/magazine-3004/
- 70. https://www.wired.com/tag/crypto/
- 71. https://www.wired.com/tag/nfts/
- 72. https://www.wired.com/tag/software/
- 73. https://www.wired.com/tag/web3/
- 74. https://www.wired.com/story/a-key-to-detecting-brain-disease-earlier-than-ever/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 75. https://www.wired.com/story/the-danger-of-digitizing-everything/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 76. https://www.wired.com/story/regulators-are-finally-catching-up-with-big-tech/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 77. https://www.wired.com/story/get-ready-for-the-great-ai-disappointment/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 78. https://www.wired.com/story/the-oceans-mysteries-and-marvels-are-about-to-reach-new-depths/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 79. https://www.wired.com/story/ai-needs-to-be-both-trusted-and-trustworthy/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 80. https://www.wired.com/story/the-end-of-one-size-fits-all-health-care/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 81. https://www.wired.com/story/digitization-beats-deforestation/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 82. https://www.wired.com/
- 83. https://www.wired.com/subscribe/
- 84. https://www.wired.com/newsletter?sourceCode=HeaderAndFooter
- 85. https://www.wired.com/about/faq/
- 86. https://www.wired.com/wired-staff/
- 87. https://www.wired.com/about/wired-on-background-policy/
- 88. https://archive.wired.com/t/storefront/storefront
- 89. https://www.wired.com/about/rss-feeds/
- 90. https://www.wired.com/about/accessibility-help/
- 91. https://www.wired.com/category/gear/reviews/
- 92. https://www.wired.com/category/gear/buying-guides/
- 93. https://www.wired.com/coupons
- 94. https://www.wired.com/gallery/best-mattresses/
- 95. https://www.wired.com/gallery/best-electric-bikes/
- 96. https://www.wired.com/gallery/best-fitness-tracker/
- 97. https://www.wired.com/tag/culture-guides/
- 98. https://www.condenast.com/brands/wired
- 99. https://www.wired.com/about/feedback/
- 100. https://subscriptions.wired.com/pubs/N3/WIR/Register.jsp?cds_page_id=175371&cds_mag_code=WIR&id=1423757547774&lsid=50431012277019467&vid=1
- 101. https://www.wired.com/about/wired-jobs/
- 102. https://www.wired.com/about/press/
- 103. https://www.condenaststore.com/
- 104. https://www.condenast.com/user-agreement/
- 105. http://www.condenast.com/privacy-policy#privacypolicy
- 106. http://www.condenast.com/privacy-policy#privacypolicy-california
- 107. http://www.condenast.com/privacy-policy#privacypolicy-optout
- 108. https://www.wired.co.uk/
- 109. https://www.wired.it/
- 110. https://wired.jp/
- 111. https://www.wired.cz/
+References:
- Hidden links:
- 113. https://www.wired.com/story/best-way-learn-online-be-lurker/
- 114. https://www.wired.com/story/coders-efficiency-is-beautiful/
- 115. https://www.wired.com/story/productivity-got-done-list/
- 116. https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 117. https://www.wired.com/story/emmys-streaming-succession-the-bear-hbo-hulu/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 118. https://www.wired.com/story/leftoverlocals-gpu-vulnerability-generative-ai/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 119. https://www.wired.com/story/trump-iowa-conspiracies/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 120. https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 121. https://www.wired.com/story/emmys-streaming-succession-the-bear-hbo-hulu/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 122. https://www.wired.com/story/leftoverlocals-gpu-vulnerability-generative-ai/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 123. https://www.wired.com/story/trump-iowa-conspiracies/#intcid=_wired-right-rail_74dfed7c-3bc1-442e-a3a4-9ff009852b0c_popular4-1-reranked-by-vidi_fallback_cral-top2-2
- 124. https://www.twitter.com/https://twitter.com/ftrain
- 125. https://www.wired.com/story/a-key-to-detecting-brain-disease-earlier-than-ever/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 126. https://www.wired.com/story/the-danger-of-digitizing-everything/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 127. https://www.wired.com/story/regulators-are-finally-catching-up-with-big-tech/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 128. https://www.wired.com/story/get-ready-for-the-great-ai-disappointment/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 129. https://www.wired.com/story/the-oceans-mysteries-and-marvels-are-about-to-reach-new-depths/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 130. https://www.wired.com/story/ai-needs-to-be-both-trusted-and-trustworthy/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 131. https://www.wired.com/story/the-end-of-one-size-fits-all-health-care/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 132. https://www.wired.com/story/digitization-beats-deforestation/#intcid=_wired-bottom-recirc-v2_f8b4e84f-1fac-4055-939a-7c08f87ffd72_text2vec1-reranked-by-vidi_fallback_cral-top2-2
- 133. https://www.facebook.com/wired/
- 134. https://twitter.com/wired/
- 135. https://pinterest.com/wired/
- 136. https://www.youtube.com/user/wired/
- 137. https://instagram.com/wired/
- 138. https://www.tiktok.com/@wired?lang=en
+[1] https://www.wired.com/story/i-finally-reached-computing-nirvana-what-was-it-all-for/#main-content
+[3] https://www.wired.com/account/saved
+[5] https://www.wired.com/
+[6] https://www.wired.com/category/backchannel/
+[7] https://www.wired.com/category/business/
+[8] https://www.wired.com/category/culture/
+[9] https://www.wired.com/category/gear/
+[10] https://www.wired.com/category/ideas/
+[11] https://www.wired.com/category/politics/
+[12] https://www.wired.com/category/science/
+[13] https://www.wired.com/category/security/
+[14] https://shop.wired.com/
+[16] https://www.wired.com/account/saved
+[18] https://www.wired.com/auth/initiate?redirectURL=%2Fstory%2Fi-finally-reached-computing-nirvana-what-was-it-all-for%2F&source=VERSO_NAVIGATION
+[19] https://www.wired.com/search/
+[20] https://www.wired.com/category/backchannel/
+[21] https://www.wired.com/category/business/
+[22] https://www.wired.com/category/culture/
+[23] https://www.wired.com/category/gear/
+[24] https://www.wired.com/category/ideas/
+[25] https://www.wired.com/category/politics/
+[26] https://www.wired.com/category/science/
+[27] https://www.wired.com/category/security/
+[28] https://shop.wired.com/
+[29] https://www.wired.com/podcasts/
+[30] https://www.wired.com/video/
+[31] https://www.wired.com/wired-world/
+[32] https://www.wired.com/category/artificial-intelligence/
+[33] https://www.wired.com/category/science/environment-climate-change/
+[34] https://www.wired.com/tag/video-games/
+[35] https://www.wired.com/newsletter
+[36] https://www.wired.com/magazine
+[37] https://events.wired.com/livewired
+[38] https://www.wired.com/category/wiredinsider/
+[39] https://jobs.wired.com/?source=navbar
+[40] https://www.wired.com/coupons
+[41] https://www.wired.com/author/paul-ford
+[42] https://www.wired.com/category/ideas
+[45] https://www.wired.com/tag/computers/
+[46] https://www.wired.com/tag/software/
+[47] https://www.wired.com/story/best-way-learn-online-be-lurker/
+[48] https://www.wired.com/story/best-way-learn-online-be-lurker/
+[49] https://www.wired.com/story/coders-efficiency-is-beautiful/
+[50] https://www.wired.com/story/coders-efficiency-is-beautiful/
+[51] https://www.wired.com/story/productivity-got-done-list/
+[52] https://www.wired.com/story/productivity-got-done-list/
+[53] https://www.wired.com/story/big-tech-wont-let-you-leave-heres-a-way-out/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[54] https://www.wired.com/story/big-tech-wont-let-you-leave-heres-a-way-out/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[55] https://www.wired.com/story/27-year-old-codebreaker-busted-myth-bitcoins-anonymity/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[56] https://www.wired.com/story/27-year-old-codebreaker-busted-myth-bitcoins-anonymity/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[57] https://www.wired.com/story/scabies-outbreak-uk-europe-treatment-shortages-drug-resistance-permethrin-ivermectin/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[58] https://www.wired.com/story/scabies-outbreak-uk-europe-treatment-shortages-drug-resistance-permethrin-ivermectin/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[59] https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[60] https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[61] https://www.wired.com/tag/cryptocurrency/
+[62] https://www.wired.com/tag/nfts/
+[63] https://www.wired.com/story/big-tech-wont-let-you-leave-heres-a-way-out/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[64] https://www.wired.com/story/big-tech-wont-let-you-leave-heres-a-way-out/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[65] https://www.wired.com/story/27-year-old-codebreaker-busted-myth-bitcoins-anonymity/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[66] https://www.wired.com/story/27-year-old-codebreaker-busted-myth-bitcoins-anonymity/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[67] https://www.wired.com/story/scabies-outbreak-uk-europe-treatment-shortages-drug-resistance-permethrin-ivermectin/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[68] https://www.wired.com/story/scabies-outbreak-uk-europe-treatment-shortages-drug-resistance-permethrin-ivermectin/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[69] https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[70] https://www.wired.com/story/cult-of-the-lamb-sins-of-the-flesh-sex-update-horny-games/#intcid=_wired-right-rail_7824e7f5-690c-4792-a1a6-f9f6a2517e3a_popular4-1-reranked-by-vidi_fallback_cral-top2-2
+[71] https://www.wired.com/tag/vaccines/
+[72] https://subscribe.wired.com/subscribe/splits/wired/WIR_Edit_Hardcoded?source=ArticleEnd_CMlink
+[73] https://www.wired.com/newsletter?sourceCode=BottomStories
+[74] https://www.wired.com/story/jacques-vallee-still-doesnt-know-what-ufos-are/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[75] https://www.wired.com/story/when-to-test-for-covid-vaccinated/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[76] https://www.wired.com/story/how-to-leave-photos-behind-when-you-die/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[77] https://www.wired.com/story/wecrashed-tv-silicon-valley/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[78] https://www.wired.com/story/youtubes-captions-insert-explicit-language-kids-videos/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[79] https://www.wired.com/category/artificial-intelligence/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[80] https://www.wired.com/gallery/best-wireless-headphones/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[81] https://www.wired.com/gallery/best-soundbars/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[82] https://www.wired.com/gallery/best-bluetooth-speakers/?itm_campaign=BottomRelatedStories&itm_content=footer-recirc
+[83] https://www.wired.com/author/paul-ford
+[84] https://www.twitter.com/https://twitter.com/ftrain
+[85] https://www.wired.com/tag/magazine-3004/
+[86] https://www.wired.com/tag/crypto/
+[87] https://www.wired.com/tag/nfts/
+[88] https://www.wired.com/tag/software/
+[89] https://www.wired.com/tag/web3/
+[90] https://www.wired.com/story/a-key-to-detecting-brain-disease-earlier-than-ever/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[91] https://www.wired.com/story/a-key-to-detecting-brain-disease-earlier-than-ever/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[92] https://www.wired.com/story/the-danger-of-digitizing-everything/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[93] https://www.wired.com/story/the-danger-of-digitizing-everything/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[94] https://www.wired.com/story/forget-growth-optimize-resilience/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[95] https://www.wired.com/story/forget-growth-optimize-resilience/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[96] https://www.wired.com/story/ai-needs-to-be-both-trusted-and-trustworthy/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[97] https://www.wired.com/story/ai-needs-to-be-both-trusted-and-trustworthy/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[98] https://www.wired.com/story/own-future-artificial-intelligence-read-shakespeare/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[99] https://www.wired.com/story/own-future-artificial-intelligence-read-shakespeare/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[100] https://www.wired.com/story/gene-editing-needs-to-be-for-everyone/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[101] https://www.wired.com/story/gene-editing-needs-to-be-for-everyone/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[102] https://www.wired.com/story/big-tech-wont-let-you-leave-heres-a-way-out/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[103] https://www.wired.com/story/big-tech-wont-let-you-leave-heres-a-way-out/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[104] https://www.wired.com/story/the-creatives-toolbox-gets-an-ai-upgrade/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[105] https://www.wired.com/story/the-creatives-toolbox-gets-an-ai-upgrade/#intcid=_wired-bottom-recirc-version3_6b0d90ba-adca-4eee-a0a5-d5b31ddc96aa_roberta-similarity2-1-with-time-decay
+[106] https://www.wired.com/
+[108] https://www.wired.com/subscribe/
+[109] https://www.wired.com/newsletter?sourceCode=HeaderAndFooter
+[110] https://www.wired.com/about/faq/
+[111] https://www.wired.com/wired-staff/
+[112] https://www.wired.com/about/wired-on-background-policy/
+[113] https://archive.wired.com/t/storefront/storefront
+[114] https://www.wired.com/about/rss-feeds/
+[115] https://www.wired.com/about/accessibility-help/
+[117] https://www.wired.com/category/gear/reviews/
+[118] https://www.wired.com/category/gear/buying-guides/
+[119] https://www.wired.com/coupons
+[120] https://www.wired.com/gallery/best-mattresses/
+[121] https://www.wired.com/gallery/best-electric-bikes/
+[122] https://www.wired.com/gallery/best-fitness-tracker/
+[123] https://www.wired.com/tag/culture-guides/
+[124] https://www.condenast.com/brands/wired
+[125] https://www.wired.com/about/feedback/
+[126] https://subscriptions.wired.com/pubs/N3/WIR/Register.jsp?cds_page_id=175371&cds_mag_code=WIR&id=1423757547774&lsid=50431012277019467&vid=1
+[127] https://www.wired.com/about/wired-jobs/
+[128] https://www.wired.com/about/press/
+[129] https://www.condenaststore.com/
+[130] https://www.condenast.com/user-agreement/
+[131] http://www.condenast.com/privacy-policy#privacypolicy
+[132] http://www.condenast.com/privacy-policy#privacypolicy-california
+[133] http://www.condenast.com/privacy-policy#privacypolicy-optout
+[135] https://www.wired.co.uk/
+[136] https://www.wired.it/
+[137] https://wired.jp/
+[138] https://www.wired.cz/
+[139] https://www.facebook.com/wired/
+[140] https://twitter.com/wired/
+[141] https://pinterest.com/wired/
+[142] https://www.youtube.com/user/wired/
+[143] https://instagram.com/wired/
+[144] https://www.tiktok.com/@wired?lang=en
diff --git a/static/archive/www-wunc-org-fstofo.txt b/static/archive/www-wunc-org-fstofo.txt
index 99e3511..cc8abf4 100644
--- a/static/archive/www-wunc-org-fstofo.txt
+++ b/static/archive/www-wunc-org-fstofo.txt
@@ -1,1138 +1,1121 @@
- IFRAME: [1]https://www.googletagmanager.com/ns.html?id=GTM-N39QFDR
+[1] [svg]
+[3][ ]Search Query Show Search
+ • News
+ □ [6]North Carolina News
+ □ [7]NPR News
+ □ [8]Politics
+ □ [9]Arts & Culture
+ □ [10]Race & Demographics
+ □ [11]Business & Economy
+ □ [12]Education
+ □ [13]Environment
+ □ [14]Health
+ □ [15]Science & Technology
+ □ [16]Military
+ □ [17]Sports
+ □ [18]Weather
+ □ [19]Ethics
+ □ [20]Corrections & Clarifications
+ □ [21]North Carolina News
+ □ [22]NPR News
+ □ [23]Politics
+ □ [24]Arts & Culture
+ □ [25]Race & Demographics
+ □ [26]Business & Economy
+ □ [27]Education
+ □ [28]Environment
+ □ [29]Health
+ □ [30]Science & Technology
+ □ [31]Military
+ □ [32]Sports
+ □ [33]Weather
+ □ [34]Ethics
+ □ [35]Corrections & Clarifications
+ • Regions
+ □ [37]Triangle News
+ □ [38]Triad News
+ □ [39]Fayetteville Area News
+ □ [40]Eastern NC News
+ □ [41]Southeastern NC News
+ □ [42]Charlotte Area News
+ □ [43]Western NC News
+ □ [44]Triangle News
+ □ [45]Triad News
+ □ [46]Fayetteville Area News
+ □ [47]Eastern NC News
+ □ [48]Southeastern NC News
+ □ [49]Charlotte Area News
+ □ [50]Western NC News
+ • Special Coverage
+ □ [52]Main Street NC
+ □ [53]2023 UNC-Chapel Hill Shooting
+ □ [54]2022 Raleigh Shooting
+ □ [55]A Teacher in Every Class
+ □ [56]Behind The Lines
+ □ [57]Tested: Beyond The Pod
+ □ [58]The Lives Lost
+ □ [59]The Killing of Andrew Brown Jr.
+ □ [60]Calling for Change
+ □ [61]Lumberton Undeterred
+ □ [62]Southern Witness
+ □ [63]Coronavirus Coverage
+ □ [64]The Cost of Summer
+ □ [65]A State Divided: HB2 And Transgender Rights
+ □ [66]Main Street NC
+ □ [67]2023 UNC-Chapel Hill Shooting
+ □ [68]2022 Raleigh Shooting
+ □ [69]A Teacher in Every Class
+ □ [70]Behind The Lines
+ □ [71]Tested: Beyond The Pod
+ □ [72]The Lives Lost
+ □ [73]The Killing of Andrew Brown Jr.
+ □ [74]Calling for Change
+ □ [75]Lumberton Undeterred
+ □ [76]Southern Witness
+ □ [77]Coronavirus Coverage
+ □ [78]The Cost of Summer
+ □ [79]A State Divided: HB2 And Transgender Rights
+ • Due South
+ □ [81]About Due South
+ □ [82]Shows
+ □ [83]Contact Due South
+ □ [84]About Due South
+ □ [85]Shows
+ □ [86]Contact Due South
+ • Programs
+ □ [88]WUNC Radio Schedule
+ □ [89]Programs A-Z
+ □ [90]Due South
+ □ [91]All Things Considered
+ □ [92]Morning Edition
+ □ [93]Back Porch Music
+ □ [94]Embodied Radio Show
+ □ [95]Sound Opinions
+ □ [96]The Thistle and Shamrock
+ □ [97]Youth Reporting Institute
+ □ [98]The People's Pharmacy
+ □ [99]American Homefront Project
+ □ [100]Fresh Air
+ □ [101]The Poetry Café
+ □ [102]NPR Music & Concerts
+ □ [103]WUNC Radio Schedule
+ □ [104]Programs A-Z
+ □ [105]Due South
+ □ [106]All Things Considered
+ □ [107]Morning Edition
+ □ [108]Back Porch Music
+ □ [109]Embodied Radio Show
+ □ [110]Sound Opinions
+ □ [111]The Thistle and Shamrock
+ □ [112]Youth Reporting Institute
+ □ [113]The People's Pharmacy
+ □ [114]American Homefront Project
+ □ [115]Fresh Air
+ □ [116]The Poetry Café
+ □ [117]NPR Music & Concerts
+ • Podcasts
+ □ [119]Podcasts From WUNC
+ □ [120]The Broadside
+ □ [121]Embodied Podcast
+ □ [122]WUNC Politics
+ □ [123]Me & My Muslim Friends
+ □ [124]Podcasts From WUNC
+ □ [125]The Broadside
+ □ [126]Embodied Podcast
+ □ [127]WUNC Politics
+ □ [128]Me & My Muslim Friends
+ • About
+ □ [130]About WUNC
+ □ [131]Ways To Listen To WUNC Online
+ □ [132]About HD Radio
+ □ [133]Station Policies & Financial Documents
+ □ [134]Committee on Inclusion Diversity Equity Accountability
+ □ [135]WUNC Public Radio, LLC Board of Directors
+ □ [136]People
+ □ [137]Ways to Connect
+ □ [138]WUNC Jobs
+ □ [139]WUNC Community Discussion Rules
+ □ [140]Telling Public Radio’s Story
+ □ [141]Ethics
+ □ [142]Contact Us
+ □ [143]About WUNC
+ □ [144]Ways To Listen To WUNC Online
+ □ [145]About HD Radio
+ □ [146]Station Policies & Financial Documents
+ □ [147]Committee on Inclusion Diversity Equity Accountability
+ □ [148]WUNC Public Radio, LLC Board of Directors
+ □ [149]People
+ □ [150]Ways to Connect
+ □ [151]WUNC Jobs
+ □ [152]WUNC Community Discussion Rules
+ □ [153]Telling Public Radio’s Story
+ □ [154]Ethics
+ □ [155]Contact Us
+ • Support
+ □ [157]Year-End Giving Deadlines to Know
+ □ [158]Ways to Give to WUNC
+ □ [159]WUNC Thank You Gifts
+ □ [160]Drawing Rules & Entry Form
+ □ [161]WUNC Sustainer Program
+ □ [162]Update Sustainer Information
+ □ [163]Increase Sustainer Gift
+ □ [164]Join WUNC's Leadership Circle
+ □ [165]Donate Your Vehicle to WUNC
+ □ [166]Be a WUNC Volunteer
+ □ [167]Include WUNC in Your Will
+ □ [168]Business Sponsors & Underwriting
+ □ [169]Community Sponsor Circle
+ □ [170]Other Ways To Give
+ □ [171]Year-End Giving Deadlines to Know
+ □ [172]Ways to Give to WUNC
+ □ [173]WUNC Thank You Gifts
+ □ [174]Drawing Rules & Entry Form
+ □ [175]WUNC Sustainer Program
+ □ [176]Update Sustainer Information
+ □ [177]Increase Sustainer Gift
+ □ [178]Join WUNC's Leadership Circle
+ □ [179]Donate Your Vehicle to WUNC
+ □ [180]Be a WUNC Volunteer
+ □ [181]Include WUNC in Your Will
+ □ [182]Business Sponsors & Underwriting
+ □ [183]Community Sponsor Circle
+ □ [184]Other Ways To Give
+ • [185]WUNC Music
+ • [186]Search
- (BUTTON)
- ____________________Search Query (BUTTON) Show Search
- * News
- (BUTTON)
- + [2]North Carolina News
- + [3]NPR News
- + [4]Politics
- + [5]Arts & Culture
- + [6]Race & Demographics
- + [7]Business & Economy
- + [8]Education
- + [9]Environment
- + [10]Health
- + [11]Science & Technology
- + [12]Military
- + [13]Sports
- + [14]Weather
- + [15]Ethics
- + [16]Corrections & Clarifications
- + [17]North Carolina News
- + [18]NPR News
- + [19]Politics
- + [20]Arts & Culture
- + [21]Race & Demographics
- + [22]Business & Economy
- + [23]Education
- + [24]Environment
- + [25]Health
- + [26]Science & Technology
- + [27]Military
- + [28]Sports
- + [29]Weather
- + [30]Ethics
- + [31]Corrections & Clarifications
- * Regions
- (BUTTON)
- + [32]Triangle News
- + [33]Triad News
- + [34]Fayetteville Area News
- + [35]Eastern NC News
- + [36]Southeastern NC News
- + [37]Charlotte Area News
- + [38]Western NC News
- + [39]Triangle News
- + [40]Triad News
- + [41]Fayetteville Area News
- + [42]Eastern NC News
- + [43]Southeastern NC News
- + [44]Charlotte Area News
- + [45]Western NC News
- * Special Coverage
- (BUTTON)
- + [46]Main Street NC
- + [47]2023 UNC-Chapel Hill Shooting
- + [48]2022 Raleigh Shooting
- + [49]A Teacher in Every Class
- + [50]Behind The Lines
- + [51]Tested: Beyond The Pod
- + [52]The Lives Lost
- + [53]The Killing of Andrew Brown Jr.
- + [54]Calling for Change
- + [55]Lumberton Undeterred
- + [56]Southern Witness
- + [57]Coronavirus Coverage
- + [58]The Cost of Summer
- + [59]A State Divided: HB2 And Transgender Rights
- + [60]Main Street NC
- + [61]2023 UNC-Chapel Hill Shooting
- + [62]2022 Raleigh Shooting
- + [63]A Teacher in Every Class
- + [64]Behind The Lines
- + [65]Tested: Beyond The Pod
- + [66]The Lives Lost
- + [67]The Killing of Andrew Brown Jr.
- + [68]Calling for Change
- + [69]Lumberton Undeterred
- + [70]Southern Witness
- + [71]Coronavirus Coverage
- + [72]The Cost of Summer
- + [73]A State Divided: HB2 And Transgender Rights
- * Due South
- (BUTTON)
- + [74]About Due South
- + [75]Shows
- + [76]Contact Due South
- + [77]About Due South
- + [78]Shows
- + [79]Contact Due South
- * Programs
- (BUTTON)
- + [80]WUNC Radio Schedule
- + [81]Programs A-Z
- + [82]Due South
- + [83]All Things Considered
- + [84]Morning Edition
- + [85]Back Porch Music
- + [86]Embodied Radio Show
- + [87]Sound Opinions
- + [88]The Thistle and Shamrock
- + [89]Youth Reporting Institute
- + [90]The People's Pharmacy
- + [91]American Homefront Project
- + [92]Fresh Air
- + [93]The Poetry Café
- + [94]NPR Music & Concerts
- + [95]WUNC Radio Schedule
- + [96]Programs A-Z
- + [97]Due South
- + [98]All Things Considered
- + [99]Morning Edition
- + [100]Back Porch Music
- + [101]Embodied Radio Show
- + [102]Sound Opinions
- + [103]The Thistle and Shamrock
- + [104]Youth Reporting Institute
- + [105]The People's Pharmacy
- + [106]American Homefront Project
- + [107]Fresh Air
- + [108]The Poetry Café
- + [109]NPR Music & Concerts
- * Podcasts
- (BUTTON)
- + [110]Podcasts From WUNC
- + [111]The Broadside
- + [112]Embodied Podcast
- + [113]WUNC Politics
- + [114]Me & My Muslim Friends
- + [115]Podcasts From WUNC
- + [116]The Broadside
- + [117]Embodied Podcast
- + [118]WUNC Politics
- + [119]Me & My Muslim Friends
- * About
- (BUTTON)
- + [120]About WUNC
- + [121]Ways To Listen To WUNC Online
- + [122]About HD Radio
- + [123]Station Policies & Financial Documents
- + [124]Committee on Inclusion Diversity Equity Accountability
- + [125]WUNC Public Radio, LLC Board of Directors
- + [126]People
- + [127]Ways to Connect
- + [128]WUNC Jobs
- + [129]WUNC Community Discussion Rules
- + [130]Telling Public Radio’s Story
- + [131]Ethics
- + [132]Contact Us
- + [133]About WUNC
- + [134]Ways To Listen To WUNC Online
- + [135]About HD Radio
- + [136]Station Policies & Financial Documents
- + [137]Committee on Inclusion Diversity Equity Accountability
- + [138]WUNC Public Radio, LLC Board of Directors
- + [139]People
- + [140]Ways to Connect
- + [141]WUNC Jobs
- + [142]WUNC Community Discussion Rules
- + [143]Telling Public Radio’s Story
- + [144]Ethics
- + [145]Contact Us
- * Support
- (BUTTON)
- + [146]Year-End Giving Deadlines to Know
- + [147]Ways to Give to WUNC
- + [148]WUNC Thank You Gifts
- + [149]Drawing Rules & Entry Form
- + [150]WUNC Sustainer Program
- + [151]Update Sustainer Information
- + [152]Increase Sustainer Gift
- + [153]Join WUNC's Leadership Circle
- + [154]Donate Your Vehicle to WUNC
- + [155]Be a WUNC Volunteer
- + [156]Include WUNC in Your Will
- + [157]Business Sponsors & Underwriting
- + [158]Community Sponsor Circle
- + [159]Other Ways To Give
- + [160]Year-End Giving Deadlines to Know
- + [161]Ways to Give to WUNC
- + [162]WUNC Thank You Gifts
- + [163]Drawing Rules & Entry Form
- + [164]WUNC Sustainer Program
- + [165]Update Sustainer Information
- + [166]Increase Sustainer Gift
- + [167]Join WUNC's Leadership Circle
- + [168]Donate Your Vehicle to WUNC
- + [169]Be a WUNC Volunteer
- + [170]Include WUNC in Your Will
- + [171]Business Sponsors & Underwriting
- + [172]Community Sponsor Circle
- + [173]Other Ways To Give
- * [174]WUNC Music
- * [175]Search
+Bringing The World Home To You
- Bringing The World Home To You
- © 2024 WUNC North Carolina Public Radio
- 120 Friday Center Dr
- Chapel Hill, NC 27517
- 919.445.9150 | 800.962.9862
+© 2024 WUNC North Carolina Public Radio
+120 Friday Center Dr
+Chapel Hill, NC 27517
+919.445.9150 | 800.962.9862
+Menu
+[188] [svg]
+91.5 Chapel Hill 88.9 Manteo 90.9 Rocky Mount 91.1 Welcome 91.9 Fayetteville
+90.5 Buxton 94.1 Lumberton 99.9 Southern Pines 89.9 Chadbourn
+Show Search
+[190][ ]Search Query
+[192]Donate
+Play Live Radio
+Next Up:
+0:00
+0:00
+0:00 0:00
+Available On Air Stations
- (BUTTON) Menu
- 91.5 Chapel Hill 88.9 Manteo 90.9 Rocky Mount 91.1 Welcome 91.9
- Fayetteville 90.5 Buxton 94.1 Lumberton 99.9 Southern Pines 89.9
- Chadbourn
- (BUTTON) Show Search
- ____________________Search Query (BUTTON)
- [176]Donate
+ • On Air Now Playing WUNC
+ • On Air Now Playing WUNC Music
- (BUTTON) (BUTTON)
- (BUTTON)
- Play Live Radio
- Next Up:
- 0:00
- 0:00
- 0:00 0:00
- (BUTTON) (BUTTON)
- Available On Air Stations
- * (BUTTON) On Air Now Playing WUNC
- * (BUTTON) On Air Now Playing WUNC Music
+All Streams
- (BUTTON)
- (BUTTON) All Streams
+ • News
+ □ [203]North Carolina News
+ □ [204]NPR News
+ □ [205]Politics
+ □ [206]Arts & Culture
+ □ [207]Race & Demographics
+ □ [208]Business & Economy
+ □ [209]Education
+ □ [210]Environment
+ □ [211]Health
+ □ [212]Science & Technology
+ □ [213]Military
+ □ [214]Sports
+ □ [215]Weather
+ □ [216]Ethics
+ □ [217]Corrections & Clarifications
+ □ [218]North Carolina News
+ □ [219]NPR News
+ □ [220]Politics
+ □ [221]Arts & Culture
+ □ [222]Race & Demographics
+ □ [223]Business & Economy
+ □ [224]Education
+ □ [225]Environment
+ □ [226]Health
+ □ [227]Science & Technology
+ □ [228]Military
+ □ [229]Sports
+ □ [230]Weather
+ □ [231]Ethics
+ □ [232]Corrections & Clarifications
+ • Regions
+ □ [234]Triangle News
+ □ [235]Triad News
+ □ [236]Fayetteville Area News
+ □ [237]Eastern NC News
+ □ [238]Southeastern NC News
+ □ [239]Charlotte Area News
+ □ [240]Western NC News
+ □ [241]Triangle News
+ □ [242]Triad News
+ □ [243]Fayetteville Area News
+ □ [244]Eastern NC News
+ □ [245]Southeastern NC News
+ □ [246]Charlotte Area News
+ □ [247]Western NC News
+ • Special Coverage
+ □ [249]Main Street NC
+ □ [250]2023 UNC-Chapel Hill Shooting
+ □ [251]2022 Raleigh Shooting
+ □ [252]A Teacher in Every Class
+ □ [253]Behind The Lines
+ □ [254]Tested: Beyond The Pod
+ □ [255]The Lives Lost
+ □ [256]The Killing of Andrew Brown Jr.
+ □ [257]Calling for Change
+ □ [258]Lumberton Undeterred
+ □ [259]Southern Witness
+ □ [260]Coronavirus Coverage
+ □ [261]The Cost of Summer
+ □ [262]A State Divided: HB2 And Transgender Rights
+ □ [263]Main Street NC
+ □ [264]2023 UNC-Chapel Hill Shooting
+ □ [265]2022 Raleigh Shooting
+ □ [266]A Teacher in Every Class
+ □ [267]Behind The Lines
+ □ [268]Tested: Beyond The Pod
+ □ [269]The Lives Lost
+ □ [270]The Killing of Andrew Brown Jr.
+ □ [271]Calling for Change
+ □ [272]Lumberton Undeterred
+ □ [273]Southern Witness
+ □ [274]Coronavirus Coverage
+ □ [275]The Cost of Summer
+ □ [276]A State Divided: HB2 And Transgender Rights
+ • Due South
+ □ [278]About Due South
+ □ [279]Shows
+ □ [280]Contact Due South
+ □ [281]About Due South
+ □ [282]Shows
+ □ [283]Contact Due South
+ • Programs
+ □ [285]WUNC Radio Schedule
+ □ [286]Programs A-Z
+ □ [287]Due South
+ □ [288]All Things Considered
+ □ [289]Morning Edition
+ □ [290]Back Porch Music
+ □ [291]Embodied Radio Show
+ □ [292]Sound Opinions
+ □ [293]The Thistle and Shamrock
+ □ [294]Youth Reporting Institute
+ □ [295]The People's Pharmacy
+ □ [296]American Homefront Project
+ □ [297]Fresh Air
+ □ [298]The Poetry Café
+ □ [299]NPR Music & Concerts
+ □ [300]WUNC Radio Schedule
+ □ [301]Programs A-Z
+ □ [302]Due South
+ □ [303]All Things Considered
+ □ [304]Morning Edition
+ □ [305]Back Porch Music
+ □ [306]Embodied Radio Show
+ □ [307]Sound Opinions
+ □ [308]The Thistle and Shamrock
+ □ [309]Youth Reporting Institute
+ □ [310]The People's Pharmacy
+ □ [311]American Homefront Project
+ □ [312]Fresh Air
+ □ [313]The Poetry Café
+ □ [314]NPR Music & Concerts
+ • Podcasts
+ □ [316]Podcasts From WUNC
+ □ [317]The Broadside
+ □ [318]Embodied Podcast
+ □ [319]WUNC Politics
+ □ [320]Me & My Muslim Friends
+ □ [321]Podcasts From WUNC
+ □ [322]The Broadside
+ □ [323]Embodied Podcast
+ □ [324]WUNC Politics
+ □ [325]Me & My Muslim Friends
+ • About
+ □ [327]About WUNC
+ □ [328]Ways To Listen To WUNC Online
+ □ [329]About HD Radio
+ □ [330]Station Policies & Financial Documents
+ □ [331]Committee on Inclusion Diversity Equity Accountability
+ □ [332]WUNC Public Radio, LLC Board of Directors
+ □ [333]People
+ □ [334]Ways to Connect
+ □ [335]WUNC Jobs
+ □ [336]WUNC Community Discussion Rules
+ □ [337]Telling Public Radio’s Story
+ □ [338]Ethics
+ □ [339]Contact Us
+ □ [340]About WUNC
+ □ [341]Ways To Listen To WUNC Online
+ □ [342]About HD Radio
+ □ [343]Station Policies & Financial Documents
+ □ [344]Committee on Inclusion Diversity Equity Accountability
+ □ [345]WUNC Public Radio, LLC Board of Directors
+ □ [346]People
+ □ [347]Ways to Connect
+ □ [348]WUNC Jobs
+ □ [349]WUNC Community Discussion Rules
+ □ [350]Telling Public Radio’s Story
+ □ [351]Ethics
+ □ [352]Contact Us
+ • Support
+ □ [354]Year-End Giving Deadlines to Know
+ □ [355]Ways to Give to WUNC
+ □ [356]WUNC Thank You Gifts
+ □ [357]Drawing Rules & Entry Form
+ □ [358]WUNC Sustainer Program
+ □ [359]Update Sustainer Information
+ □ [360]Increase Sustainer Gift
+ □ [361]Join WUNC's Leadership Circle
+ □ [362]Donate Your Vehicle to WUNC
+ □ [363]Be a WUNC Volunteer
+ □ [364]Include WUNC in Your Will
+ □ [365]Business Sponsors & Underwriting
+ □ [366]Community Sponsor Circle
+ □ [367]Other Ways To Give
+ □ [368]Year-End Giving Deadlines to Know
+ □ [369]Ways to Give to WUNC
+ □ [370]WUNC Thank You Gifts
+ □ [371]Drawing Rules & Entry Form
+ □ [372]WUNC Sustainer Program
+ □ [373]Update Sustainer Information
+ □ [374]Increase Sustainer Gift
+ □ [375]Join WUNC's Leadership Circle
+ □ [376]Donate Your Vehicle to WUNC
+ □ [377]Be a WUNC Volunteer
+ □ [378]Include WUNC in Your Will
+ □ [379]Business Sponsors & Underwriting
+ □ [380]Community Sponsor Circle
+ □ [381]Other Ways To Give
+ • [382]WUNC Music
+ • [383]Search
- * News
- (BUTTON)
- + [177]North Carolina News
- + [178]NPR News
- + [179]Politics
- + [180]Arts & Culture
- + [181]Race & Demographics
- + [182]Business & Economy
- + [183]Education
- + [184]Environment
- + [185]Health
- + [186]Science & Technology
- + [187]Military
- + [188]Sports
- + [189]Weather
- + [190]Ethics
- + [191]Corrections & Clarifications
- + [192]North Carolina News
- + [193]NPR News
- + [194]Politics
- + [195]Arts & Culture
- + [196]Race & Demographics
- + [197]Business & Economy
- + [198]Education
- + [199]Environment
- + [200]Health
- + [201]Science & Technology
- + [202]Military
- + [203]Sports
- + [204]Weather
- + [205]Ethics
- + [206]Corrections & Clarifications
- * Regions
- (BUTTON)
- + [207]Triangle News
- + [208]Triad News
- + [209]Fayetteville Area News
- + [210]Eastern NC News
- + [211]Southeastern NC News
- + [212]Charlotte Area News
- + [213]Western NC News
- + [214]Triangle News
- + [215]Triad News
- + [216]Fayetteville Area News
- + [217]Eastern NC News
- + [218]Southeastern NC News
- + [219]Charlotte Area News
- + [220]Western NC News
- * Special Coverage
- (BUTTON)
- + [221]Main Street NC
- + [222]2023 UNC-Chapel Hill Shooting
- + [223]2022 Raleigh Shooting
- + [224]A Teacher in Every Class
- + [225]Behind The Lines
- + [226]Tested: Beyond The Pod
- + [227]The Lives Lost
- + [228]The Killing of Andrew Brown Jr.
- + [229]Calling for Change
- + [230]Lumberton Undeterred
- + [231]Southern Witness
- + [232]Coronavirus Coverage
- + [233]The Cost of Summer
- + [234]A State Divided: HB2 And Transgender Rights
- + [235]Main Street NC
- + [236]2023 UNC-Chapel Hill Shooting
- + [237]2022 Raleigh Shooting
- + [238]A Teacher in Every Class
- + [239]Behind The Lines
- + [240]Tested: Beyond The Pod
- + [241]The Lives Lost
- + [242]The Killing of Andrew Brown Jr.
- + [243]Calling for Change
- + [244]Lumberton Undeterred
- + [245]Southern Witness
- + [246]Coronavirus Coverage
- + [247]The Cost of Summer
- + [248]A State Divided: HB2 And Transgender Rights
- * Due South
- (BUTTON)
- + [249]About Due South
- + [250]Shows
- + [251]Contact Due South
- + [252]About Due South
- + [253]Shows
- + [254]Contact Due South
- * Programs
- (BUTTON)
- + [255]WUNC Radio Schedule
- + [256]Programs A-Z
- + [257]Due South
- + [258]All Things Considered
- + [259]Morning Edition
- + [260]Back Porch Music
- + [261]Embodied Radio Show
- + [262]Sound Opinions
- + [263]The Thistle and Shamrock
- + [264]Youth Reporting Institute
- + [265]The People's Pharmacy
- + [266]American Homefront Project
- + [267]Fresh Air
- + [268]The Poetry Café
- + [269]NPR Music & Concerts
- + [270]WUNC Radio Schedule
- + [271]Programs A-Z
- + [272]Due South
- + [273]All Things Considered
- + [274]Morning Edition
- + [275]Back Porch Music
- + [276]Embodied Radio Show
- + [277]Sound Opinions
- + [278]The Thistle and Shamrock
- + [279]Youth Reporting Institute
- + [280]The People's Pharmacy
- + [281]American Homefront Project
- + [282]Fresh Air
- + [283]The Poetry Café
- + [284]NPR Music & Concerts
- * Podcasts
- (BUTTON)
- + [285]Podcasts From WUNC
- + [286]The Broadside
- + [287]Embodied Podcast
- + [288]WUNC Politics
- + [289]Me & My Muslim Friends
- + [290]Podcasts From WUNC
- + [291]The Broadside
- + [292]Embodied Podcast
- + [293]WUNC Politics
- + [294]Me & My Muslim Friends
- * About
- (BUTTON)
- + [295]About WUNC
- + [296]Ways To Listen To WUNC Online
- + [297]About HD Radio
- + [298]Station Policies & Financial Documents
- + [299]Committee on Inclusion Diversity Equity Accountability
- + [300]WUNC Public Radio, LLC Board of Directors
- + [301]People
- + [302]Ways to Connect
- + [303]WUNC Jobs
- + [304]WUNC Community Discussion Rules
- + [305]Telling Public Radio’s Story
- + [306]Ethics
- + [307]Contact Us
- + [308]About WUNC
- + [309]Ways To Listen To WUNC Online
- + [310]About HD Radio
- + [311]Station Policies & Financial Documents
- + [312]Committee on Inclusion Diversity Equity Accountability
- + [313]WUNC Public Radio, LLC Board of Directors
- + [314]People
- + [315]Ways to Connect
- + [316]WUNC Jobs
- + [317]WUNC Community Discussion Rules
- + [318]Telling Public Radio’s Story
- + [319]Ethics
- + [320]Contact Us
- * Support
- (BUTTON)
- + [321]Year-End Giving Deadlines to Know
- + [322]Ways to Give to WUNC
- + [323]WUNC Thank You Gifts
- + [324]Drawing Rules & Entry Form
- + [325]WUNC Sustainer Program
- + [326]Update Sustainer Information
- + [327]Increase Sustainer Gift
- + [328]Join WUNC's Leadership Circle
- + [329]Donate Your Vehicle to WUNC
- + [330]Be a WUNC Volunteer
- + [331]Include WUNC in Your Will
- + [332]Business Sponsors & Underwriting
- + [333]Community Sponsor Circle
- + [334]Other Ways To Give
- + [335]Year-End Giving Deadlines to Know
- + [336]Ways to Give to WUNC
- + [337]WUNC Thank You Gifts
- + [338]Drawing Rules & Entry Form
- + [339]WUNC Sustainer Program
- + [340]Update Sustainer Information
- + [341]Increase Sustainer Gift
- + [342]Join WUNC's Leadership Circle
- + [343]Donate Your Vehicle to WUNC
- + [344]Be a WUNC Volunteer
- + [345]Include WUNC in Your Will
- + [346]Business Sponsors & Underwriting
- + [347]Community Sponsor Circle
- + [348]Other Ways To Give
- * [349]WUNC Music
- * [350]Search
-
- [351]News
+[384]News
Storm leaves trail of damage across central NC; Thousands still without power
Wednesday
- WUNC | By [352]Mitchell Northam,
- [353]Bradley George, [354]Will Michaels
- Published August 16, 2023 at 11:39 AM EDT
- * [355]Facebook
- * [356]Twitter
- * [357]LinkedIn
- * [358]Email
+WUNC | By [385]Mitchell Northam,
+[386]Bradley George, [387]Will Michaels
+Published August 16, 2023 at 11:39 AM EDT
- This photo from the City of Durham Fire Department shows a fallen tree
- laying on a power line on Aug. 15, 2023 after severe thunderstorms in
- Durham and central North Carolina.
- City of Durham Fire Department
- /
- Twitter
- This photo from the City of Durham Fire Department shows a fallen tree
- laying on a power line on Aug. 15, 2023 after severe thunderstorms in
- Durham and central North Carolina.
+ • [388] Facebook
+ • [389] Twitter
+ • [390] LinkedIn
+ • [391] Email
- Updated Aug. 16 at 5:50 p.m.
+This photo from the City of Durham Fire Department shows a fallen tree laying
+on a power line on Aug. 15, 2023 after severe thunderstorms in Durham and
+central North Carolina.
+City of Durham Fire Department
+/
+Twitter
+This photo from the City of Durham Fire Department shows a fallen tree laying
+on a power line on Aug. 15, 2023 after severe thunderstorms in Durham and
+central North Carolina.
- Tuesday's severe thunderstorms left a trail of damage across central
- North Carolina.
+Updated Aug. 16 at 5:50 p.m.
- As of 5:50 p.m. Wednesday, more than 35,000 Duke Energy customers near
- Greensboro and Durham were still without power.
+Tuesday's severe thunderstorms left a trail of damage across central North
+Carolina.
- Dozens of roads remain closed and some do not have working traffic
- lights.
+As of 5:50 p.m. Wednesday, more than 35,000 Duke Energy customers near
+Greensboro and Durham were still without power.
- RIGHT NOW: This is Morehead Ave. & Cranford Rd. in Durham this
- morning after yesterday's storms. We're hearing of quite a few other
- problem areas so be careful on the roads this morning!
- [359]@AnissaLopezTV has more on [360]@SpecNews1RDU (Drone footage:
- Chief Photog Mark Barger) [361]pic.twitter.com/Yuphqoo3TG
- — Kyleigh Panetta (@KyleighPanetta) [362]August 16, 2023
+Dozens of roads remain closed and some do not have working traffic lights.
- Severe weather also led to a 32-vehicle accident on westbound
- Interstate 40 near the Southpoint Mall around 4:45 p.m. Tuesday,
- forcing a closure between exits 274 and 276. According [363]to WRAL, no
- one was seriously injured in the crash.
+ RIGHT NOW: This is Morehead Ave. & Cranford Rd. in Durham this morning
+ after yesterday's storms. We're hearing of quite a few other problem areas
+ so be careful on the roads this morning! [392]@AnissaLopezTV has more on
+ [393]@SpecNews1RDU (Drone footage: Chief Photog Mark Barger) [394]
+ pic.twitter.com/Yuphqoo3TG
- Durham Police say a 78-year-old woman was killed Tuesday when a tree
- fell on her car.
+ — Kyleigh Panetta (@KyleighPanetta) [395]August 16, 2023
- Durham officials have [364]opened multiple cooling centers, mainly
- public libraries, to help residents beat the heat as they wait for
- power to be restored. The Durham County Main Library, the only cooling
- center with phone and internet access, was temporarily closed Wednesday
- evening due to a generator outage.
+Severe weather also led to a 32-vehicle accident on westbound Interstate 40
+near the Southpoint Mall around 4:45 p.m. Tuesday, forcing a closure between
+exits 274 and 276. According [396]to WRAL, no one was seriously injured in the
+crash.
- The view from this afternoon at American Tobacco 👀
- A heavy thunderstorm swept over WUNC's Durham studios, launching
- metal chairs into the artificial river and sending umbrellas flying.
- What's the storm scene near you? Stay safe out there!
- 📷 by Paul Hunton/ WUNC [365]pic.twitter.com/F5OiDz2EvF
- — WUNC (@wunc) [366]August 15, 2023
+Durham Police say a 78-year-old woman was killed Tuesday when a tree fell on
+her car.
- County officials did not expect straight-line winds of up to 80 miles
- per hour based on Tuesday’s severe weather forecast, said Elizabeth
- Schroeder, chief of emergency management for the county and city of
- Durham.
+Durham officials have [397]opened multiple cooling centers, mainly public
+libraries, to help residents beat the heat as they wait for power to be
+restored. The Durham County Main Library, the only cooling center with phone
+and internet access, was temporarily closed Wednesday evening due to a
+generator outage.
- “This one did catch a lot of us by surprise because there was just a
- low risk, which is pretty common throughout the summer months. We don’t
- typically see winds like that with, I guess I’ll say, our more regular
- summer thunderstorms,” Schroeder said.
+ The view from this afternoon at American Tobacco 👀
- According to the North Carolina Department of Public Safety, there were
- also reports of hail on Tuesday across the Triad region and northern
- Piedmont. And an EF-1 tornado occurred near Beech Mountain in Avery
- County on Tuesday as well, according to the National Weather Service.
- A tree fell in front of a house near the intersection of Fawn Ave. and
- Dartmouth Dr. in Durham on Aug. 16, 2023, the day after severe
- thunderstorms swept through central North Carolina.
- 1 of 7 — IMG_9275.JPEG
- A tree fell in front of a house near the intersection of Fawn Ave. and
- Dartmouth Dr. in Durham on Aug. 16, 2023, the day after severe
- thunderstorms swept through central North Carolina.
- Russ Henry / WUNC
- Utility trucks are parked along on Hillsborough Road in Durham between
- Hale and Carolina streets on Aug. 16, 2023. Severe thunderstorms swept
- through central North Carolina on Aug. 15, leaving a trail of damage.
- 2 of 7 — IMG_6078.jpg
- Utility trucks are parked along on Hillsborough Road in Durham between
- Hale and Carolina streets on Aug. 16, 2023. Severe thunderstorms swept
- through central North Carolina on Aug. 15, leaving a trail of damage.
- Paige Miranda / WUNC
- Utility trucks are parked along on Hillsborough Road in Durham between
- Hale and Carolina streets on Aug. 16, 2023. Severe thunderstorms swept
- through central North Carolina on Aug. 15, leaving a trail of damage.
- 3 of 7 — IMG_6079.jpg
- Utility trucks are parked along on Hillsborough Road in Durham between
- Hale and Carolina streets on Aug. 16, 2023. Severe thunderstorms swept
- through central North Carolina on Aug. 15, leaving a trail of damage.
- Paige Miranda / WUNC
- After a storm, a tree fell in front of this house on Vickers Ave. in
- Durham on Aug. 16, 2023. Severe thunderstorms swept through central
- North Carolina on Aug. 15, leaving a trail of damage.
- 4 of 7 — IMG_7263.jpg
- After a storm, a tree fell in front of this house on Vickers Ave. in
- Durham on Aug. 16, 2023. Severe thunderstorms swept through central
- North Carolina on Aug. 15, leaving a trail of damage.
- Charlie Shelton-Ormond / WUNC
- A red Jeep is partially in a ditch near the intersection of Hillandale
- Road and Indian Trail in Durham on Aug. 16, 2023, the day after severe
- thunderstorms swept through central North Carolina.
- 5 of 7 — IMG_9286.JPEG
- A red Jeep is partially in a ditch near the intersection of Hillandale
- Road and Indian Trail in Durham on Aug. 16, 2023, the day after severe
- thunderstorms swept through central North Carolina.
- Russ Henry / WUNC
- Trees and powerlines are down near the intersection of Hillandale Road
- and Indian Trail in Durham on Aug. 16, 2023, the day after severe
- thunderstorms swept through central North Carolina.
- 6 of 7 — IMG_9287.JPEG
- Trees and powerlines are down near the intersection of Hillandale Road
- and Indian Trail in Durham on Aug. 16, 2023, the day after severe
- thunderstorms swept through central North Carolina.
- Russ Henry / WUNC
- A large tree is uprooted near the Hillandale Golf Club on Aug. 16,
- 2023, the day after severe thunderstorms swept through central North
- Carolina.
- 7 of 7 — IMG_9284.JPEG
- A large tree is uprooted near the Hillandale Golf Club on Aug. 16,
- 2023, the day after severe thunderstorms swept through central North
- Carolina.
- Russ Henry / WUNC
+ A heavy thunderstorm swept over WUNC's Durham studios, launching metal
+ chairs into the artificial river and sending umbrellas flying.
- Due to power outages and road closures, Durham County Public Schools
- were closed Wednesday. Chapel Hill-Carrboro City Schools still had
- power and remained open.
+ What's the storm scene near you? Stay safe out there!
- In Chapel Hill, Martin Luther King Jr. Blvd. reopened to traffic around
- 9 a.m. Wednesday morning. It had been blocked between Estes Dr. and
- Homestead Rd. due to downed power lines.
+ 📷 by Paul Hunton/ WUNC [398]pic.twitter.com/F5OiDz2EvF
- The town of Chapel Hill's weekly food distribution at the Eubanks Park
- and Ride Lot was canceled due to food supply disruption from the storm.
+ — WUNC (@wunc) [399]August 15, 2023
- Chapel Hill Transit is also experiencing delays.
+County officials did not expect straight-line winds of up to 80 miles per hour
+based on Tuesday’s severe weather forecast, said Elizabeth Schroeder, chief of
+emergency management for the county and city of Durham.
- WUNC's Sascha Cordner, Eli Chen and Laura Pellicer contributed to this
- report.
- Tags
- [367]News [368]Durham County[369]Thunderstorms[370]School
- closure[371]Weather
- * [372]Facebook
- * [373]Twitter
- * [374]LinkedIn
- * [375]Email
+“This one did catch a lot of us by surprise because there was just a low risk,
+which is pretty common throughout the summer months. We don’t typically see
+winds like that with, I guess I’ll say, our more regular summer thunderstorms,”
+Schroeder said.
- [376]Mitchell Northam
- Mitchell Northam is a Digital Producer for WUNC. His past work has been
- featured at the Atlanta Journal-Constitution, SB Nation, the Orlando
- Sentinel and the Associated Press. He is a graduate of Salisbury
- University and is also a voter in the AP Top 25 poll for women's
- college basketball.
- [377]See stories by Mitchell Northam
- [378]Bradley George
- Bradley George is WUNC's AM reporter. A North Carolina native, his
- public radio career has taken him to Atlanta, Birmingham, Nashville and
- most recently WUSF in Tampa. While there, he reported on the COVID-19
- pandemic and was part of the station's Murrow award winning coverage of
- the 2020 election. Along the way, he has reported for NPR, Marketplace,
- The Takeaway, and the BBC World Service. Bradley is a graduate of
- Guilford College, where he majored in Theatre and German.
- [379]See stories by Bradley George
- [380]Will Michaels
- Will Michaels is WUNC's Weekend Host and Reporter.
- [381]See stories by Will Michaels
+According to the North Carolina Department of Public Safety, there were also
+reports of hail on Tuesday across the Triad region and northern Piedmont. And
+an EF-1 tornado occurred near Beech Mountain in Avery County on Tuesday as
+well, according to the National Weather Service.
- LATEST STORIES
- 1. [382]The U.S. military continues strikes in attempts to deter
- Houthi fighters in Yemen
- 2. [383]Helping veterans cope with life after a bipolar diagnosis
- 3. [384]Why flight attendants have a lot of time in their day that is
- unpaid
- 4. [385]The fight across the nation for the 'right to repair'
- 5. [386]The economic impact from the Red Sea tensions
- 6. [387]Presidential hopefuls pivot their efforts to New Hampshire
+A tree fell in front of a house near the intersection of Fawn Ave. and
+Dartmouth Dr. in Durham on Aug. 16, 2023, the day after severe thunderstorms
+swept through central North Carolina.
+1 of 7 — IMG_9275.JPEG
+A tree fell in front of a house near the intersection of Fawn Ave. and
+Dartmouth Dr. in Durham on Aug. 16, 2023, the day after severe thunderstorms
+swept through central North Carolina.
+Russ Henry / WUNC
+Utility trucks are parked along on Hillsborough Road in Durham between Hale and
+Carolina streets on Aug. 16, 2023. Severe thunderstorms swept through central
+North Carolina on Aug. 15, leaving a trail of damage.
+2 of 7 — IMG_6078.jpg
+Utility trucks are parked along on Hillsborough Road in Durham between Hale and
+Carolina streets on Aug. 16, 2023. Severe thunderstorms swept through central
+North Carolina on Aug. 15, leaving a trail of damage.
+Paige Miranda / WUNC
+Utility trucks are parked along on Hillsborough Road in Durham between Hale and
+Carolina streets on Aug. 16, 2023. Severe thunderstorms swept through central
+North Carolina on Aug. 15, leaving a trail of damage.
+3 of 7 — IMG_6079.jpg
+Utility trucks are parked along on Hillsborough Road in Durham between Hale and
+Carolina streets on Aug. 16, 2023. Severe thunderstorms swept through central
+North Carolina on Aug. 15, leaving a trail of damage.
+Paige Miranda / WUNC
+After a storm, a tree fell in front of this house on Vickers Ave. in Durham on
+Aug. 16, 2023. Severe thunderstorms swept through central North Carolina on
+Aug. 15, leaving a trail of damage.
+4 of 7 — IMG_7263.jpg
+After a storm, a tree fell in front of this house on Vickers Ave. in Durham on
+Aug. 16, 2023. Severe thunderstorms swept through central North Carolina on
+Aug. 15, leaving a trail of damage.
+Charlie Shelton-Ormond / WUNC
+A red Jeep is partially in a ditch near the intersection of Hillandale Road and
+Indian Trail in Durham on Aug. 16, 2023, the day after severe thunderstorms
+swept through central North Carolina.
+5 of 7 — IMG_9286.JPEG
+A red Jeep is partially in a ditch near the intersection of Hillandale Road and
+Indian Trail in Durham on Aug. 16, 2023, the day after severe thunderstorms
+swept through central North Carolina.
+Russ Henry / WUNC
+Trees and powerlines are down near the intersection of Hillandale Road and
+Indian Trail in Durham on Aug. 16, 2023, the day after severe thunderstorms
+swept through central North Carolina.
+6 of 7 — IMG_9287.JPEG
+Trees and powerlines are down near the intersection of Hillandale Road and
+Indian Trail in Durham on Aug. 16, 2023, the day after severe thunderstorms
+swept through central North Carolina.
+Russ Henry / WUNC
+A large tree is uprooted near the Hillandale Golf Club on Aug. 16, 2023, the
+day after severe thunderstorms swept through central North Carolina.
+7 of 7 — IMG_9284.JPEG
+A large tree is uprooted near the Hillandale Golf Club on Aug. 16, 2023, the
+day after severe thunderstorms swept through central North Carolina.
+Russ Henry / WUNC
- Discuss North Carolina politics. Analyze how and why you love the way
- you do. Quiz yourself on Black history. Hear poetry from NC's poet
- laureate. Meet NPR hosts and reporters. You never know where WUNC's
- events will take you. Join us for this ride! See our upcoming events
- and sign up to attend.
- [388]SEE OUR EVENTS
+Due to power outages and road closures, Durham County Public Schools were
+closed Wednesday. Chapel Hill-Carrboro City Schools still had power and
+remained open.
- More Stories
- * [389]Minerva, Goddess of Wisdom stands outside the Elliott
- University Center in the center of UNC Greensboro's campus
- [390]Education
- [391]UNC Greensboro announces program cut recommendations
- [392]Brianna Atkinson
- The department dean’s recommendations include 19 programs, majors
- and minors total — affecting about 194 students.
- * [393]A civil suit, filed by New Hanover County against numerous
- PFAS manufacturers on Friday, January 12, 2024, in New Hanover
- County Superior Court.
- [394]New Hanover County sues over a dozen PFAS manufacturers,
- sellers
- [395]Kelly Kenoyer
- New Hanover County has filed a lawsuit against more than a dozen
- PFAS manufacturers, ranging from legacy chemical companies to
- smaller, firefighting foam companies.
- (BUTTON) Listen • 1:24
- * [396]Pembroke, North Carolina - Main Street - 12-23
- [397]Sports
- [398]Q&A: UNC Pembroke AD Dick Christy on how sports betting will
- impact smaller NC colleges
- [399]Mitchell Northam
- While it comes with its critics and concerns, sports betting could
- benefit 10 UNC System schools, including UNC Pembroke, in a big
- way. Once betting begins, those schools – the 10 with the smallest
- athletic department budgets – will split 20% of the yearly tax
- revenue from legal gambling in North Carolina.
- * [400]Buncombe County living wage increases to $22.10 an hour,
- nonprofit says
- [401]Felicia Sonmez
- Just Economics WNC said the increase is being driven by the soaring
- cost of housing.
- * [402]High Point University officials participate in the dental
- school groundbreaking.
- [403]Education
- [404]High Point University’s new dental school will welcome its
- first cohort of students in the fall
- [405]Sharryse Piggott
- The Workman School of Dental Medicine is only one of three dental
- schools in North Carolina.
+In Chapel Hill, Martin Luther King Jr. Blvd. reopened to traffic around 9 a.m.
+Wednesday morning. It had been blocked between Estes Dr. and Homestead Rd. due
+to downed power lines.
- Stay Connected
- * [406]twitter
- * [407]instagram
- * [408]youtube
- * [409]facebook
- * [410]linkedin
+The town of Chapel Hill's weekly food distribution at the Eubanks Park and Ride
+Lot was canceled due to food supply disruption from the storm.
- Bringing The World Home To You
- © 2024 WUNC North Carolina Public Radio
- 120 Friday Center Dr
- Chapel Hill, NC 27517
- 919.445.9150 | 800.962.9862
- * [411]Listen Live
- * [412]Podcasts From WUNC
- * [413]Events
- * [414]About
- * [415]Contact Us
- * [416]Employment
- * [417]Privacy
- * [418]FCC Applications
- * [419]WUNC FCC Public File
- * [420]WBUX FCC Public File
- * [421]WFSS FCC Public File
- * [422]WRQM FCC Public File
- * [423]WUND-FM FCC Public File
- * [424]WURI FCC Public File
- * [425]WUNW FCC Public File
- * [426]WZCO FCC Public File
- * [427]WUNC Drawing Rules
+Chapel Hill Transit is also experiencing delays.
- * [428]NPR
- *
- *
- *
- *
+WUNC's Sascha Cordner, Eli Chen and Laura Pellicer contributed to this report.
-References
+Tags
+[400]News [401]Durham County[402]Thunderstorms[403]School closure[404]Weather
- Visible links:
- 1. https://www.googletagmanager.com/ns.html?id=GTM-N39QFDR
- 2. https://www.wunc.org/nc-news
- 3. https://www.wunc.org/tags/npr-news
- 4. https://www.wunc.org/politics
- 5. https://www.wunc.org/arts-culture
- 6. https://www.wunc.org/race-demographics
- 7. https://www.wunc.org/business-economy
- 8. https://www.wunc.org/education
- 9. https://www.wunc.org/environment
- 10. https://www.wunc.org/health
- 11. https://www.wunc.org/science-technology
- 12. https://www.wunc.org/military
- 13. https://www.wunc.org/sports
- 14. https://www.wunc.org/tags/weather
- 15. https://www.wunc.org/ethics
- 16. https://www.wunc.org/tags/corrections-clarifications
- 17. https://www.wunc.org/nc-news
- 18. https://www.wunc.org/tags/npr-news
- 19. https://www.wunc.org/politics
- 20. https://www.wunc.org/arts-culture
- 21. https://www.wunc.org/race-demographics
- 22. https://www.wunc.org/business-economy
- 23. https://www.wunc.org/education
- 24. https://www.wunc.org/environment
- 25. https://www.wunc.org/health
- 26. https://www.wunc.org/science-technology
- 27. https://www.wunc.org/military
- 28. https://www.wunc.org/sports
- 29. https://www.wunc.org/tags/weather
- 30. https://www.wunc.org/ethics
- 31. https://www.wunc.org/tags/corrections-clarifications
- 32. https://www.wunc.org/triangle-news
- 33. https://www.wunc.org/triad-news
- 34. https://www.wunc.org/fayetteville-area-news
- 35. https://www.wunc.org/eastern-nc-news
- 36. https://www.wunc.org/southeastern-nc-news
- 37. https://www.wunc.org/charlotte-area-news
- 38. https://www.wunc.org/western-nc-news
- 39. https://www.wunc.org/triangle-news
- 40. https://www.wunc.org/triad-news
- 41. https://www.wunc.org/fayetteville-area-news
- 42. https://www.wunc.org/eastern-nc-news
- 43. https://www.wunc.org/southeastern-nc-news
- 44. https://www.wunc.org/charlotte-area-news
- 45. https://www.wunc.org/western-nc-news
- 46. https://www.wunc.org/tags/main-street-nc
- 47. https://www.wunc.org/unc-chapel-hill-shooting
- 48. https://www.wunc.org/raleigh-shooting
- 49. https://www.wunc.org/tags/a-teacher-in-every-class
- 50. https://www.wunc.org/behind-the-lines
- 51. https://www.wunc.org/tested-beyond-the-pod
- 52. https://www.wunc.org/the-lives-lost
- 53. https://www.wunc.org/andrew-brown-jr
- 54. https://www.wunc.org/calling-for-change
- 55. https://www.wunc.org/lumberton-undeterred
- 56. https://www.wunc.org/southern-witness
- 57. https://www.wunc.org/tags/nc-coronavirus-updates
- 58. https://www.wunc.org/education/2021-12-14/the-cost-of-summer
- 59. https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
- 60. https://www.wunc.org/tags/main-street-nc
- 61. https://www.wunc.org/unc-chapel-hill-shooting
- 62. https://www.wunc.org/raleigh-shooting
- 63. https://www.wunc.org/tags/a-teacher-in-every-class
- 64. https://www.wunc.org/behind-the-lines
- 65. https://www.wunc.org/tested-beyond-the-pod
- 66. https://www.wunc.org/the-lives-lost
- 67. https://www.wunc.org/andrew-brown-jr
- 68. https://www.wunc.org/calling-for-change
- 69. https://www.wunc.org/lumberton-undeterred
- 70. https://www.wunc.org/southern-witness
- 71. https://www.wunc.org/tags/nc-coronavirus-updates
- 72. https://www.wunc.org/education/2021-12-14/the-cost-of-summer
- 73. https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
- 74. https://www.wunc.org/about-due-south
- 75. https://www.wunc.org/show/due-south
- 76. https://www.wunc.org/contact-due-south
- 77. https://www.wunc.org/about-due-south
- 78. https://www.wunc.org/show/due-south
- 79. https://www.wunc.org/contact-due-south
- 80. https://www.wunc.org/wunc-radio-schedule
- 81. https://www.wunc.org/all-shows
- 82. https://www.wunc.org/show/due-south
- 83. https://www.wunc.org/show/all-things-considered
- 84. https://www.wunc.org/show/morning-edition
- 85. https://www.wunc.org/back-porch-music
- 86. https://www.wunc.org/show/embodied-radio-show
- 87. https://www.wunc.org/show/sound-opinions
- 88. https://www.wunc.org/show/thistle-and-shamrock
- 89. https://www.wunc.org/youth-radio/youth-reporting-institute
- 90. https://www.wunc.org/show/the-peoples-pharmacy
- 91. https://americanhomefront.wunc.org/
- 92. https://www.wunc.org/show/fresh-air
- 93. https://www.wunc.org/show/the-poetry-cafe
- 94. https://www.wunc.org/npr-music-concerts
- 95. https://www.wunc.org/wunc-radio-schedule
- 96. https://www.wunc.org/all-shows
- 97. https://www.wunc.org/show/due-south
- 98. https://www.wunc.org/show/all-things-considered
- 99. https://www.wunc.org/show/morning-edition
- 100. https://www.wunc.org/back-porch-music
- 101. https://www.wunc.org/show/embodied-radio-show
- 102. https://www.wunc.org/show/sound-opinions
- 103. https://www.wunc.org/show/thistle-and-shamrock
- 104. https://www.wunc.org/youth-radio/youth-reporting-institute
- 105. https://www.wunc.org/show/the-peoples-pharmacy
- 106. https://americanhomefront.wunc.org/
- 107. https://www.wunc.org/show/fresh-air
- 108. https://www.wunc.org/show/the-poetry-cafe
- 109. https://www.wunc.org/npr-music-concerts
- 110. https://www.wunc.org/podcasts-from-wunc
- 111. https://www.wunc.org/podcast/the-broadside
- 112. https://www.wunc.org/podcast/embodied-podcast
- 113. https://www.wunc.org/podcast/podcast-wuncpolitics
- 114. https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
- 115. https://www.wunc.org/podcasts-from-wunc
- 116. https://www.wunc.org/podcast/the-broadside
- 117. https://www.wunc.org/podcast/embodied-podcast
- 118. https://www.wunc.org/podcast/podcast-wuncpolitics
- 119. https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
- 120. https://www.wunc.org/about-wunc
- 121. https://www.wunc.org/ways-to-listen-to-wunc-online
- 122. https://www.wunc.org/about-hd-radio
- 123. https://www.wunc.org/station-policies-financial-documents
- 124. https://www.wunc.org/i-d-e-a
- 125. https://www.wunc.org/wunc-public-radio-llc-board-of-directors
- 126. https://www.wunc.org/people
- 127. https://www.wunc.org/ways-to-connect
- 128. https://www.wunc.org/wunc-jobs
- 129. https://www.wunc.org/wunc-community-discussion-rules
- 130. https://www.wunc.org/telling-public-radios-story
- 131. https://www.wunc.org/ethics
- 132. https://www.wunc.org/contact-us
- 133. https://www.wunc.org/about-wunc
- 134. https://www.wunc.org/ways-to-listen-to-wunc-online
- 135. https://www.wunc.org/about-hd-radio
- 136. https://www.wunc.org/station-policies-financial-documents
- 137. https://www.wunc.org/i-d-e-a
- 138. https://www.wunc.org/wunc-public-radio-llc-board-of-directors
- 139. https://www.wunc.org/people
- 140. https://www.wunc.org/ways-to-connect
- 141. https://www.wunc.org/wunc-jobs
- 142. https://www.wunc.org/wunc-community-discussion-rules
- 143. https://www.wunc.org/telling-public-radios-story
- 144. https://www.wunc.org/ethics
- 145. https://www.wunc.org/contact-us
- 146. https://www.wunc.org/year-end-giving-deadlines-to-know
- 147. https://www.wunc.org/ways-to-give-to-wunc
- 148. https://www.wunc.org/thank-you-gifts
- 149. https://www.wunc.org/drawing-rules-entry-form
- 150. https://www.wunc.org/wunc-sustainers
- 151. https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
- 152. https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
- 153. https://www.wunc.org/join-the-leadership-circle
- 154. https://wunc.careasy.org/home
- 155. https://www.wunc.org/volunteer-opportunities
- 156. https://www.wunc.org/wuncs-legacy-society
- 157. https://www.wunc.org/sponsorships
- 158. https://www.wunc.org/community-sponsor-circle
- 159. https://www.wunc.org/other-ways-to-give
- 160. https://www.wunc.org/year-end-giving-deadlines-to-know
- 161. https://www.wunc.org/ways-to-give-to-wunc
- 162. https://www.wunc.org/thank-you-gifts
- 163. https://www.wunc.org/drawing-rules-entry-form
- 164. https://www.wunc.org/wunc-sustainers
- 165. https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
- 166. https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
- 167. https://www.wunc.org/join-the-leadership-circle
- 168. https://wunc.careasy.org/home
- 169. https://www.wunc.org/volunteer-opportunities
- 170. https://www.wunc.org/wuncs-legacy-society
- 171. https://www.wunc.org/sponsorships
- 172. https://www.wunc.org/community-sponsor-circle
- 173. https://www.wunc.org/other-ways-to-give
- 174. https://www.wunc.org/wunc-music
- 175. https://www.wunc.org/search
- 176. https://support.wunc.org/site/Donation2?2885.donation=form1&df_id=2885&mfc_pref=T
- 177. https://www.wunc.org/nc-news
- 178. https://www.wunc.org/tags/npr-news
- 179. https://www.wunc.org/politics
- 180. https://www.wunc.org/arts-culture
- 181. https://www.wunc.org/race-demographics
- 182. https://www.wunc.org/business-economy
- 183. https://www.wunc.org/education
- 184. https://www.wunc.org/environment
- 185. https://www.wunc.org/health
- 186. https://www.wunc.org/science-technology
- 187. https://www.wunc.org/military
- 188. https://www.wunc.org/sports
- 189. https://www.wunc.org/tags/weather
- 190. https://www.wunc.org/ethics
- 191. https://www.wunc.org/tags/corrections-clarifications
- 192. https://www.wunc.org/nc-news
- 193. https://www.wunc.org/tags/npr-news
- 194. https://www.wunc.org/politics
- 195. https://www.wunc.org/arts-culture
- 196. https://www.wunc.org/race-demographics
- 197. https://www.wunc.org/business-economy
- 198. https://www.wunc.org/education
- 199. https://www.wunc.org/environment
- 200. https://www.wunc.org/health
- 201. https://www.wunc.org/science-technology
- 202. https://www.wunc.org/military
- 203. https://www.wunc.org/sports
- 204. https://www.wunc.org/tags/weather
- 205. https://www.wunc.org/ethics
- 206. https://www.wunc.org/tags/corrections-clarifications
- 207. https://www.wunc.org/triangle-news
- 208. https://www.wunc.org/triad-news
- 209. https://www.wunc.org/fayetteville-area-news
- 210. https://www.wunc.org/eastern-nc-news
- 211. https://www.wunc.org/southeastern-nc-news
- 212. https://www.wunc.org/charlotte-area-news
- 213. https://www.wunc.org/western-nc-news
- 214. https://www.wunc.org/triangle-news
- 215. https://www.wunc.org/triad-news
- 216. https://www.wunc.org/fayetteville-area-news
- 217. https://www.wunc.org/eastern-nc-news
- 218. https://www.wunc.org/southeastern-nc-news
- 219. https://www.wunc.org/charlotte-area-news
- 220. https://www.wunc.org/western-nc-news
- 221. https://www.wunc.org/tags/main-street-nc
- 222. https://www.wunc.org/unc-chapel-hill-shooting
- 223. https://www.wunc.org/raleigh-shooting
- 224. https://www.wunc.org/tags/a-teacher-in-every-class
- 225. https://www.wunc.org/behind-the-lines
- 226. https://www.wunc.org/tested-beyond-the-pod
- 227. https://www.wunc.org/the-lives-lost
- 228. https://www.wunc.org/andrew-brown-jr
- 229. https://www.wunc.org/calling-for-change
- 230. https://www.wunc.org/lumberton-undeterred
- 231. https://www.wunc.org/southern-witness
- 232. https://www.wunc.org/tags/nc-coronavirus-updates
- 233. https://www.wunc.org/education/2021-12-14/the-cost-of-summer
- 234. https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
- 235. https://www.wunc.org/tags/main-street-nc
- 236. https://www.wunc.org/unc-chapel-hill-shooting
- 237. https://www.wunc.org/raleigh-shooting
- 238. https://www.wunc.org/tags/a-teacher-in-every-class
- 239. https://www.wunc.org/behind-the-lines
- 240. https://www.wunc.org/tested-beyond-the-pod
- 241. https://www.wunc.org/the-lives-lost
- 242. https://www.wunc.org/andrew-brown-jr
- 243. https://www.wunc.org/calling-for-change
- 244. https://www.wunc.org/lumberton-undeterred
- 245. https://www.wunc.org/southern-witness
- 246. https://www.wunc.org/tags/nc-coronavirus-updates
- 247. https://www.wunc.org/education/2021-12-14/the-cost-of-summer
- 248. https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
- 249. https://www.wunc.org/about-due-south
- 250. https://www.wunc.org/show/due-south
- 251. https://www.wunc.org/contact-due-south
- 252. https://www.wunc.org/about-due-south
- 253. https://www.wunc.org/show/due-south
- 254. https://www.wunc.org/contact-due-south
- 255. https://www.wunc.org/wunc-radio-schedule
- 256. https://www.wunc.org/all-shows
- 257. https://www.wunc.org/show/due-south
- 258. https://www.wunc.org/show/all-things-considered
- 259. https://www.wunc.org/show/morning-edition
- 260. https://www.wunc.org/back-porch-music
- 261. https://www.wunc.org/show/embodied-radio-show
- 262. https://www.wunc.org/show/sound-opinions
- 263. https://www.wunc.org/show/thistle-and-shamrock
- 264. https://www.wunc.org/youth-radio/youth-reporting-institute
- 265. https://www.wunc.org/show/the-peoples-pharmacy
- 266. https://americanhomefront.wunc.org/
- 267. https://www.wunc.org/show/fresh-air
- 268. https://www.wunc.org/show/the-poetry-cafe
- 269. https://www.wunc.org/npr-music-concerts
- 270. https://www.wunc.org/wunc-radio-schedule
- 271. https://www.wunc.org/all-shows
- 272. https://www.wunc.org/show/due-south
- 273. https://www.wunc.org/show/all-things-considered
- 274. https://www.wunc.org/show/morning-edition
- 275. https://www.wunc.org/back-porch-music
- 276. https://www.wunc.org/show/embodied-radio-show
- 277. https://www.wunc.org/show/sound-opinions
- 278. https://www.wunc.org/show/thistle-and-shamrock
- 279. https://www.wunc.org/youth-radio/youth-reporting-institute
- 280. https://www.wunc.org/show/the-peoples-pharmacy
- 281. https://americanhomefront.wunc.org/
- 282. https://www.wunc.org/show/fresh-air
- 283. https://www.wunc.org/show/the-poetry-cafe
- 284. https://www.wunc.org/npr-music-concerts
- 285. https://www.wunc.org/podcasts-from-wunc
- 286. https://www.wunc.org/podcast/the-broadside
- 287. https://www.wunc.org/podcast/embodied-podcast
- 288. https://www.wunc.org/podcast/podcast-wuncpolitics
- 289. https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
- 290. https://www.wunc.org/podcasts-from-wunc
- 291. https://www.wunc.org/podcast/the-broadside
- 292. https://www.wunc.org/podcast/embodied-podcast
- 293. https://www.wunc.org/podcast/podcast-wuncpolitics
- 294. https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
- 295. https://www.wunc.org/about-wunc
- 296. https://www.wunc.org/ways-to-listen-to-wunc-online
- 297. https://www.wunc.org/about-hd-radio
- 298. https://www.wunc.org/station-policies-financial-documents
- 299. https://www.wunc.org/i-d-e-a
- 300. https://www.wunc.org/wunc-public-radio-llc-board-of-directors
- 301. https://www.wunc.org/people
- 302. https://www.wunc.org/ways-to-connect
- 303. https://www.wunc.org/wunc-jobs
- 304. https://www.wunc.org/wunc-community-discussion-rules
- 305. https://www.wunc.org/telling-public-radios-story
- 306. https://www.wunc.org/ethics
- 307. https://www.wunc.org/contact-us
- 308. https://www.wunc.org/about-wunc
- 309. https://www.wunc.org/ways-to-listen-to-wunc-online
- 310. https://www.wunc.org/about-hd-radio
- 311. https://www.wunc.org/station-policies-financial-documents
- 312. https://www.wunc.org/i-d-e-a
- 313. https://www.wunc.org/wunc-public-radio-llc-board-of-directors
- 314. https://www.wunc.org/people
- 315. https://www.wunc.org/ways-to-connect
- 316. https://www.wunc.org/wunc-jobs
- 317. https://www.wunc.org/wunc-community-discussion-rules
- 318. https://www.wunc.org/telling-public-radios-story
- 319. https://www.wunc.org/ethics
- 320. https://www.wunc.org/contact-us
- 321. https://www.wunc.org/year-end-giving-deadlines-to-know
- 322. https://www.wunc.org/ways-to-give-to-wunc
- 323. https://www.wunc.org/thank-you-gifts
- 324. https://www.wunc.org/drawing-rules-entry-form
- 325. https://www.wunc.org/wunc-sustainers
- 326. https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
- 327. https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
- 328. https://www.wunc.org/join-the-leadership-circle
- 329. https://wunc.careasy.org/home
- 330. https://www.wunc.org/volunteer-opportunities
- 331. https://www.wunc.org/wuncs-legacy-society
- 332. https://www.wunc.org/sponsorships
- 333. https://www.wunc.org/community-sponsor-circle
- 334. https://www.wunc.org/other-ways-to-give
- 335. https://www.wunc.org/year-end-giving-deadlines-to-know
- 336. https://www.wunc.org/ways-to-give-to-wunc
- 337. https://www.wunc.org/thank-you-gifts
- 338. https://www.wunc.org/drawing-rules-entry-form
- 339. https://www.wunc.org/wunc-sustainers
- 340. https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
- 341. https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
- 342. https://www.wunc.org/join-the-leadership-circle
- 343. https://wunc.careasy.org/home
- 344. https://www.wunc.org/volunteer-opportunities
- 345. https://www.wunc.org/wuncs-legacy-society
- 346. https://www.wunc.org/sponsorships
- 347. https://www.wunc.org/community-sponsor-circle
- 348. https://www.wunc.org/other-ways-to-give
- 349. https://www.wunc.org/wunc-music
- 350. https://www.wunc.org/search
- 351. https://www.wunc.org/news
- 352. https://www.wunc.org/people/mitchell-northam
- 353. https://www.wunc.org/people/bradley-george
- 354. https://www.wunc.org/people/will-michaels
- 355. https://www.facebook.com/dialog/share?app_id=3927319740668442&display=popup&href=https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816
- 356. https://twitter.com/intent/tweet?url=https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816&text=Storm leaves trail of damage across central NC; Thousands still without power Wednesday
- 357. https://www.linkedin.com/shareArticle?url=https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816&mini=true&title=Storm leaves trail of damage across central NC; Thousands still without power Wednesday&summary=Tuesday's severe thunderstorms caused damages, outages, car accidents, and road closures. One 78-year-old Durham woman died after a tree fell on her car.&source=WUNC
- 358. mailto:?body=Storm leaves trail of damage across central NC; Thousands still without power Wednesday
+ • [405] Facebook
+ • [406] Twitter
+ • [407] LinkedIn
+ • [408] Email
-https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816
+[409] []
+[410]Mitchell Northam
+Mitchell Northam is a Digital Producer for WUNC. His past work has been
+featured at the Atlanta Journal-Constitution, SB Nation, the Orlando Sentinel
+and the Associated Press. He is a graduate of Salisbury University and is also
+a voter in the AP Top 25 poll for women's college basketball.
+[411] See stories by Mitchell Northam
+[412] []
+[413]Bradley George
+Bradley George is WUNC's AM reporter. A North Carolina native, his public radio
+career has taken him to Atlanta, Birmingham, Nashville and most recently WUSF
+in Tampa. While there, he reported on the COVID-19 pandemic and was part of the
+station's Murrow award winning coverage of the 2020 election. Along the way, he
+has reported for NPR, Marketplace, The Takeaway, and the BBC World Service.
+Bradley is a graduate of Guilford College, where he majored in Theatre and
+German.
+[414] See stories by Bradley George
+[415] []
+[416]Will Michaels
+Will Michaels is WUNC's Weekend Host and Reporter.
+[417] See stories by Will Michaels
+LATEST STORIES
-Tuesday's severe thunderstorms caused damages, outages, car accidents, and road closures. One 78-year-old Durham woman died after a tree fell on her car.
- 359. https://twitter.com/AnissaLopezTV?ref_src=twsrc^tfw
- 360. https://twitter.com/SpecNews1RDU?ref_src=twsrc^tfw
- 361. https://t.co/Yuphqoo3TG
- 362. https://twitter.com/KyleighPanetta/status/1691778846532509716?ref_src=twsrc^tfw
- 363. https://www.wral.com/story/i-40-west-in-durham-reopens-after-crash-involving-32-vehicles-during-severe-storms/21001866/
- 364. https://www.dconc.gov/Home/Components/News/News/9711/31
- 365. https://t.co/F5OiDz2EvF
- 366. https://twitter.com/wunc/status/1691574282189516878?ref_src=twsrc^tfw
- 367. https://www.wunc.org/news
- 368. https://www.wunc.org/tags/durham-county
- 369. https://www.wunc.org/tags/thunderstorms
- 370. https://www.wunc.org/tags/school-closure
- 371. https://www.wunc.org/tags/weather
- 372. https://www.facebook.com/dialog/share?app_id=3927319740668442&display=popup&href=https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816
- 373. https://twitter.com/intent/tweet?url=https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816&text=Storm leaves trail of damage across central NC; Thousands still without power Wednesday
- 374. https://www.linkedin.com/shareArticle?url=https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816&mini=true&title=Storm leaves trail of damage across central NC; Thousands still without power Wednesday&summary=Tuesday's severe thunderstorms caused damages, outages, car accidents, and road closures. One 78-year-old Durham woman died after a tree fell on her car.&source=WUNC
- 375. mailto:?body=Storm leaves trail of damage across central NC; Thousands still without power Wednesday
+ 1. [418]Sobbed: Podcast Transcript (Revisited)
+ 2. [419]'You Only Call When You're in Trouble' is a witty novel to get you
+ through the winter
+ 3. [420]Princess of Wales undergoes abdominal surgery; King Charles to have
+ prostate procedure
+ 4. [421]Higher insurance rates in Buncombe County? Inflation and climate
+ change may be to blame.
+ 5. [422]30 years ago, a magnitude 6.7 earthquake struck Northridge in Southern
+ California
+ 6. [423]Iowa's results show Trump is off to a good start to be the GOP
+ presidential nominee
-https://www.wunc.org/news/2023-08-16/storm-damage-durham-power-outage-closures-north-carolina-816
+Discuss North Carolina politics. Analyze how and why you love the way you do.
+Quiz yourself on Black history. Hear poetry from NC's poet laureate. Meet NPR
+hosts and reporters. You never know where WUNC's events will take you. Join us
+for this ride! See our upcoming events and sign up to attend.
+[424]SEE OUR EVENTS
+More Stories
-Tuesday's severe thunderstorms caused damages, outages, car accidents, and road closures. One 78-year-old Durham woman died after a tree fell on her car.
- 376. https://www.wunc.org/people/mitchell-northam
- 377. https://www.wunc.org/people/mitchell-northam
- 378. https://www.wunc.org/people/bradley-george
- 379. https://www.wunc.org/people/bradley-george
- 380. https://www.wunc.org/people/will-michaels
- 381. https://www.wunc.org/people/will-michaels
- 382. https://www.wunc.org/2024-01-16/the-u-s-military-continues-strikes-in-attempts-to-deter-houthi-fighters-in-yemen
- 383. https://www.wunc.org/2024-01-16/helping-veterans-cope-with-life-after-a-bipolar-diagnosis
- 384. https://www.wunc.org/2024-01-16/why-flight-attendants-have-a-lot-of-time-in-their-day-that-is-unpaid
- 385. https://www.wunc.org/2024-01-16/the-fight-across-the-nation-for-the-right-to-repair
- 386. https://www.wunc.org/2024-01-16/the-economic-impact-from-the-red-sea-tensions
- 387. https://www.wunc.org/2024-01-16/presidential-hopefuls-pivot-their-efforts-to-new-hampshire
- 388. https://www.wunc.org/events-calendar
- 389. https://www.wunc.org/education/2024-01-16/unc-greensboro-announces-program-cut-recommendations
- 390. https://www.wunc.org/education
- 391. https://www.wunc.org/education/2024-01-16/unc-greensboro-announces-program-cut-recommendations
- 392. https://www.wunc.org/people/brianna-atkinson
- 393. https://www.wunc.org/2024-01-16/new-hanover-county-sues-over-a-dozen-pfas-manufacturers-sellers
- 394. https://www.wunc.org/2024-01-16/new-hanover-county-sues-over-a-dozen-pfas-manufacturers-sellers
- 395. https://www.whqr.org/people/kelly-kenoyer-2
- 396. https://www.wunc.org/sports/2024-01-16/unc-pembroke-dick-christy-gambling-betting-impact-small-colleges
- 397. https://www.wunc.org/sports
- 398. https://www.wunc.org/sports/2024-01-16/unc-pembroke-dick-christy-gambling-betting-impact-small-colleges
- 399. https://www.wunc.org/people/mitchell-northam
- 400. https://www.wunc.org/2024-01-15/buncombe-county-living-wage-increases-to-22-10-an-hour-nonprofit-says
- 401. https://www.bpr.org/people/felicia-sonmez
- 402. https://www.wunc.org/education/2024-01-15/high-point-dental-school-workman-students-fall
- 403. https://www.wunc.org/education
- 404. https://www.wunc.org/education/2024-01-15/high-point-dental-school-workman-students-fall
- 405. https://www.wunc.org/people/sharryse-piggott
- 406. https://twitter.com/wunc
- 407. https://www.instagram.com/915wunc/
- 408. https://www.youtube.com/wuncfm
- 409. https://www.facebook.com/915wunc
- 410. https://www.linkedin.com/company/wunc-fm-91.5fm-north-carolina-public-radio
- 411. https://www.wunc.org/ways-to-listen-to-wunc-online
- 412. https://www.wunc.org/podcasts-from-wunc
- 413. https://www.wunc.org/events-calendar
- 414. https://www.wunc.org/about-wunc
- 415. https://www.wunc.org/contact-us
- 416. https://www.wunc.org/wunc-jobs
- 417. https://www.wunc.org/privacy
- 418. https://www.wunc.org/fcc-applications
- 419. https://publicfiles.fcc.gov/fm-profile/WUNC
- 420. https://publicfiles.fcc.gov/fm-profile/WBUX
- 421. https://publicfiles.fcc.gov/fm-profile/WFSS
- 422. https://publicfiles.fcc.gov/fm-profile/WRQM
- 423. https://publicfiles.fcc.gov/fm-profile/WUND-FM
- 424. https://publicfiles.fcc.gov/fm-profile/WURI
- 425. https://publicfiles.fcc.gov/fm-profile/WUNW-FM
- 426. https://publicfiles.fcc.gov/fm-profile/WZCO
- 427. https://docs.google.com/document/u/1/d/e/2PACX-1vSqllkRbwiZZtXGXNeRNC8bs8yd4syzFuPDZUAc5XQqadIJ91cqQCujTD_rN2-vmIT-vYeAYA693exg/pub
- 428. http://www.npr.org/
+ • [425] Salisbury attorney Bill Graham has launched two TV ads criticizing
+ Lt. Gov. Mark Robinson over his Facebook posts about the Holocaust
+ [426]GOP governor primary heats up as Graham airs TV ads criticizing
+ Robinson over Holocaust posts
+ [427]Steve Harrison
+ Salisbury attorney Bill Graham is spending $5 million of his own money to
+ win the March Republican primary for N.C. governor. He's airing ads
+ critical of Lt. Gov. Mark Robinson's previous comments on the Holocaust.
+ • [428] A municipal drinking water plant. Unlike at a private well, water is
+ treated at a central location, then pumped through pipes to residents.
+ [429]Local leaders deny any connection between state infrastructure grants
+ and proposed casinos
+ [430]Marshall Terry
+ North Carolina is set to give grants for major upgrades to water and sewage
+ infrastructure to four communities that happen to be near sites where new
+ casinos could be built. But leaders in most of those communities are
+ denying there’s any connection between the infrastructure projects and the
+ possible casinos. Mehr Sher wrote about it for Carolina Public Press and
+ joined us on Morning Edition.
+ Listen • 6:55
+ • [432] Minerva, Goddess of Wisdom stands outside the Elliott University
+ Center in the center of UNC Greensboro's campus
+ [433]Education
+ [434]UNC Greensboro announces program cut recommendations
+ [435]Brianna Atkinson
+ The department dean’s recommendations include 19 programs, majors and
+ minors total — affecting about 194 students.
+ • [436] A civil suit, filed by New Hanover County against numerous PFAS
+ manufacturers on Friday, January 12, 2024, in New Hanover County Superior
+ Court.
+ [437]New Hanover County sues over a dozen PFAS manufacturers, sellers
+ [438]Kelly Kenoyer
+ New Hanover County has filed a lawsuit against more than a dozen PFAS
+ manufacturers, ranging from legacy chemical companies to smaller,
+ firefighting foam companies.
+ Listen • 1:24
+ • [440] Pembroke, North Carolina - Main Street - 12-23
+ [441]Sports
+ [442]Q&A: UNC Pembroke AD Dick Christy on how sports betting will impact
+ smaller NC colleges
+ [443]Mitchell Northam
+ While it comes with its critics and concerns, sports betting could benefit
+ 10 UNC System schools, including UNC Pembroke, in a big way. Once betting
+ begins, those schools – the 10 with the smallest athletic department
+ budgets – will split 20% of the yearly tax revenue from legal gambling in
+ North Carolina.
- Hidden links:
- 430. https://www.wunc.org/
- 431. https://www.wunc.org/
- 432. https://www.wunc.org/people/mitchell-northam
- 433. https://www.wunc.org/people/bradley-george
- 434. https://www.wunc.org/people/will-michaels
- 435. https://www.wunc.org/2024-01-15/buncombe-county-living-wage-increases-to-22-10-an-hour-nonprofit-says
- 436. https://www.wunc.org/
- 437. http://prx.org/
- 438. https://www.pri.org/
- 439. https://www.americanpublicmedia.org/
- 440. http://bbc.com/
+[444] [svg]
+Stay Connected
+
+ • [445]twitter
+ • [446]instagram
+ • [447]youtube
+ • [448]facebook
+ • [449]linkedin
+
+Bringing The World Home To You
+
+© 2024 WUNC North Carolina Public Radio
+120 Friday Center Dr
+Chapel Hill, NC 27517
+919.445.9150 | 800.962.9862
+
+ • [450]Listen Live
+ • [451]Podcasts From WUNC
+ • [452]Events
+ • [453]About
+ • [454]Contact Us
+ • [455]Employment
+ • [456]Privacy
+ • [457]FCC Applications
+ • [458]WUNC FCC Public File
+ • [459]WBUX FCC Public File
+ • [460]WFSS FCC Public File
+ • [461]WRQM FCC Public File
+ • [462]WUND-FM FCC Public File
+ • [463]WURI FCC Public File
+ • [464]WUNW FCC Public File
+ • [465]WZCO FCC Public File
+ • [466]WUNC Drawing Rules
+
+ • [467] NPR
+ • [468] [svg]
+ • [469] [svg]
+ • [470] [svg]
+ • [471] [svg]
+
+
+References:
+
+[1] https://www.wunc.org/
+[6] https://www.wunc.org/nc-news
+[7] https://www.wunc.org/tags/npr-news
+[8] https://www.wunc.org/politics
+[9] https://www.wunc.org/arts-culture
+[10] https://www.wunc.org/race-demographics
+[11] https://www.wunc.org/business-economy
+[12] https://www.wunc.org/education
+[13] https://www.wunc.org/environment
+[14] https://www.wunc.org/health
+[15] https://www.wunc.org/science-technology
+[16] https://www.wunc.org/military
+[17] https://www.wunc.org/sports
+[18] https://www.wunc.org/tags/weather
+[19] https://www.wunc.org/ethics
+[20] https://www.wunc.org/tags/corrections-clarifications
+[21] https://www.wunc.org/nc-news
+[22] https://www.wunc.org/tags/npr-news
+[23] https://www.wunc.org/politics
+[24] https://www.wunc.org/arts-culture
+[25] https://www.wunc.org/race-demographics
+[26] https://www.wunc.org/business-economy
+[27] https://www.wunc.org/education
+[28] https://www.wunc.org/environment
+[29] https://www.wunc.org/health
+[30] https://www.wunc.org/science-technology
+[31] https://www.wunc.org/military
+[32] https://www.wunc.org/sports
+[33] https://www.wunc.org/tags/weather
+[34] https://www.wunc.org/ethics
+[35] https://www.wunc.org/tags/corrections-clarifications
+[37] https://www.wunc.org/triangle-news
+[38] https://www.wunc.org/triad-news
+[39] https://www.wunc.org/fayetteville-area-news
+[40] https://www.wunc.org/eastern-nc-news
+[41] https://www.wunc.org/southeastern-nc-news
+[42] https://www.wunc.org/charlotte-area-news
+[43] https://www.wunc.org/western-nc-news
+[44] https://www.wunc.org/triangle-news
+[45] https://www.wunc.org/triad-news
+[46] https://www.wunc.org/fayetteville-area-news
+[47] https://www.wunc.org/eastern-nc-news
+[48] https://www.wunc.org/southeastern-nc-news
+[49] https://www.wunc.org/charlotte-area-news
+[50] https://www.wunc.org/western-nc-news
+[52] https://www.wunc.org/tags/main-street-nc
+[53] https://www.wunc.org/unc-chapel-hill-shooting
+[54] https://www.wunc.org/raleigh-shooting
+[55] https://www.wunc.org/tags/a-teacher-in-every-class
+[56] https://www.wunc.org/behind-the-lines
+[57] https://www.wunc.org/tested-beyond-the-pod
+[58] https://www.wunc.org/the-lives-lost
+[59] https://www.wunc.org/andrew-brown-jr
+[60] https://www.wunc.org/calling-for-change
+[61] https://www.wunc.org/lumberton-undeterred
+[62] https://www.wunc.org/southern-witness
+[63] https://www.wunc.org/tags/nc-coronavirus-updates
+[64] https://www.wunc.org/education/2021-12-14/the-cost-of-summer
+[65] https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
+[66] https://www.wunc.org/tags/main-street-nc
+[67] https://www.wunc.org/unc-chapel-hill-shooting
+[68] https://www.wunc.org/raleigh-shooting
+[69] https://www.wunc.org/tags/a-teacher-in-every-class
+[70] https://www.wunc.org/behind-the-lines
+[71] https://www.wunc.org/tested-beyond-the-pod
+[72] https://www.wunc.org/the-lives-lost
+[73] https://www.wunc.org/andrew-brown-jr
+[74] https://www.wunc.org/calling-for-change
+[75] https://www.wunc.org/lumberton-undeterred
+[76] https://www.wunc.org/southern-witness
+[77] https://www.wunc.org/tags/nc-coronavirus-updates
+[78] https://www.wunc.org/education/2021-12-14/the-cost-of-summer
+[79] https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
+[81] https://www.wunc.org/about-due-south
+[82] https://www.wunc.org/show/due-south
+[83] https://www.wunc.org/contact-due-south
+[84] https://www.wunc.org/about-due-south
+[85] https://www.wunc.org/show/due-south
+[86] https://www.wunc.org/contact-due-south
+[88] https://www.wunc.org/wunc-radio-schedule
+[89] https://www.wunc.org/all-shows
+[90] https://www.wunc.org/show/due-south
+[91] https://www.wunc.org/show/all-things-considered
+[92] https://www.wunc.org/show/morning-edition
+[93] https://www.wunc.org/back-porch-music
+[94] https://www.wunc.org/show/embodied-radio-show
+[95] https://www.wunc.org/show/sound-opinions
+[96] https://www.wunc.org/show/thistle-and-shamrock
+[97] https://www.wunc.org/youth-radio/youth-reporting-institute
+[98] https://www.wunc.org/show/the-peoples-pharmacy
+[99] https://americanhomefront.wunc.org/
+[100] https://www.wunc.org/show/fresh-air
+[101] https://www.wunc.org/show/the-poetry-cafe
+[102] https://www.wunc.org/npr-music-concerts
+[103] https://www.wunc.org/wunc-radio-schedule
+[104] https://www.wunc.org/all-shows
+[105] https://www.wunc.org/show/due-south
+[106] https://www.wunc.org/show/all-things-considered
+[107] https://www.wunc.org/show/morning-edition
+[108] https://www.wunc.org/back-porch-music
+[109] https://www.wunc.org/show/embodied-radio-show
+[110] https://www.wunc.org/show/sound-opinions
+[111] https://www.wunc.org/show/thistle-and-shamrock
+[112] https://www.wunc.org/youth-radio/youth-reporting-institute
+[113] https://www.wunc.org/show/the-peoples-pharmacy
+[114] https://americanhomefront.wunc.org/
+[115] https://www.wunc.org/show/fresh-air
+[116] https://www.wunc.org/show/the-poetry-cafe
+[117] https://www.wunc.org/npr-music-concerts
+[119] https://www.wunc.org/podcasts-from-wunc
+[120] https://www.wunc.org/podcast/the-broadside
+[121] https://www.wunc.org/podcast/embodied-podcast
+[122] https://www.wunc.org/podcast/podcast-wuncpolitics
+[123] https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
+[124] https://www.wunc.org/podcasts-from-wunc
+[125] https://www.wunc.org/podcast/the-broadside
+[126] https://www.wunc.org/podcast/embodied-podcast
+[127] https://www.wunc.org/podcast/podcast-wuncpolitics
+[128] https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
+[130] https://www.wunc.org/about-wunc
+[131] https://www.wunc.org/ways-to-listen-to-wunc-online
+[132] https://www.wunc.org/about-hd-radio
+[133] https://www.wunc.org/station-policies-financial-documents
+[134] https://www.wunc.org/i-d-e-a
+[135] https://www.wunc.org/wunc-public-radio-llc-board-of-directors
+[136] https://www.wunc.org/people
+[137] https://www.wunc.org/ways-to-connect
+[138] https://www.wunc.org/wunc-jobs
+[139] https://www.wunc.org/wunc-community-discussion-rules
+[140] https://www.wunc.org/telling-public-radios-story
+[141] https://www.wunc.org/ethics
+[142] https://www.wunc.org/contact-us
+[143] https://www.wunc.org/about-wunc
+[144] https://www.wunc.org/ways-to-listen-to-wunc-online
+[145] https://www.wunc.org/about-hd-radio
+[146] https://www.wunc.org/station-policies-financial-documents
+[147] https://www.wunc.org/i-d-e-a
+[148] https://www.wunc.org/wunc-public-radio-llc-board-of-directors
+[149] https://www.wunc.org/people
+[150] https://www.wunc.org/ways-to-connect
+[151] https://www.wunc.org/wunc-jobs
+[152] https://www.wunc.org/wunc-community-discussion-rules
+[153] https://www.wunc.org/telling-public-radios-story
+[154] https://www.wunc.org/ethics
+[155] https://www.wunc.org/contact-us
+[157] https://www.wunc.org/year-end-giving-deadlines-to-know
+[158] https://www.wunc.org/ways-to-give-to-wunc
+[159] https://www.wunc.org/thank-you-gifts
+[160] https://www.wunc.org/drawing-rules-entry-form
+[161] https://www.wunc.org/wunc-sustainers
+[162] https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
+[163] https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
+[164] https://www.wunc.org/join-the-leadership-circle
+[165] https://wunc.careasy.org/home
+[166] https://www.wunc.org/volunteer-opportunities
+[167] https://www.wunc.org/wuncs-legacy-society
+[168] https://www.wunc.org/sponsorships
+[169] https://www.wunc.org/community-sponsor-circle
+[170] https://www.wunc.org/other-ways-to-give
+[171] https://www.wunc.org/year-end-giving-deadlines-to-know
+[172] https://www.wunc.org/ways-to-give-to-wunc
+[173] https://www.wunc.org/thank-you-gifts
+[174] https://www.wunc.org/drawing-rules-entry-form
+[175] https://www.wunc.org/wunc-sustainers
+[176] https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
+[177] https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
+[178] https://www.wunc.org/join-the-leadership-circle
+[179] https://wunc.careasy.org/home
+[180] https://www.wunc.org/volunteer-opportunities
+[181] https://www.wunc.org/wuncs-legacy-society
+[182] https://www.wunc.org/sponsorships
+[183] https://www.wunc.org/community-sponsor-circle
+[184] https://www.wunc.org/other-ways-to-give
+[185] https://www.wunc.org/wunc-music
+[186] https://www.wunc.org/search
+[188] https://www.wunc.org/
+[192] https://support.wunc.org/site/Donation2?2885.donation=form1&df_id=2885&mfc_pref=T
+[203] https://www.wunc.org/nc-news
+[204] https://www.wunc.org/tags/npr-news
+[205] https://www.wunc.org/politics
+[206] https://www.wunc.org/arts-culture
+[207] https://www.wunc.org/race-demographics
+[208] https://www.wunc.org/business-economy
+[209] https://www.wunc.org/education
+[210] https://www.wunc.org/environment
+[211] https://www.wunc.org/health
+[212] https://www.wunc.org/science-technology
+[213] https://www.wunc.org/military
+[214] https://www.wunc.org/sports
+[215] https://www.wunc.org/tags/weather
+[216] https://www.wunc.org/ethics
+[217] https://www.wunc.org/tags/corrections-clarifications
+[218] https://www.wunc.org/nc-news
+[219] https://www.wunc.org/tags/npr-news
+[220] https://www.wunc.org/politics
+[221] https://www.wunc.org/arts-culture
+[222] https://www.wunc.org/race-demographics
+[223] https://www.wunc.org/business-economy
+[224] https://www.wunc.org/education
+[225] https://www.wunc.org/environment
+[226] https://www.wunc.org/health
+[227] https://www.wunc.org/science-technology
+[228] https://www.wunc.org/military
+[229] https://www.wunc.org/sports
+[230] https://www.wunc.org/tags/weather
+[231] https://www.wunc.org/ethics
+[232] https://www.wunc.org/tags/corrections-clarifications
+[234] https://www.wunc.org/triangle-news
+[235] https://www.wunc.org/triad-news
+[236] https://www.wunc.org/fayetteville-area-news
+[237] https://www.wunc.org/eastern-nc-news
+[238] https://www.wunc.org/southeastern-nc-news
+[239] https://www.wunc.org/charlotte-area-news
+[240] https://www.wunc.org/western-nc-news
+[241] https://www.wunc.org/triangle-news
+[242] https://www.wunc.org/triad-news
+[243] https://www.wunc.org/fayetteville-area-news
+[244] https://www.wunc.org/eastern-nc-news
+[245] https://www.wunc.org/southeastern-nc-news
+[246] https://www.wunc.org/charlotte-area-news
+[247] https://www.wunc.org/western-nc-news
+[249] https://www.wunc.org/tags/main-street-nc
+[250] https://www.wunc.org/unc-chapel-hill-shooting
+[251] https://www.wunc.org/raleigh-shooting
+[252] https://www.wunc.org/tags/a-teacher-in-every-class
+[253] https://www.wunc.org/behind-the-lines
+[254] https://www.wunc.org/tested-beyond-the-pod
+[255] https://www.wunc.org/the-lives-lost
+[256] https://www.wunc.org/andrew-brown-jr
+[257] https://www.wunc.org/calling-for-change
+[258] https://www.wunc.org/lumberton-undeterred
+[259] https://www.wunc.org/southern-witness
+[260] https://www.wunc.org/tags/nc-coronavirus-updates
+[261] https://www.wunc.org/education/2021-12-14/the-cost-of-summer
+[262] https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
+[263] https://www.wunc.org/tags/main-street-nc
+[264] https://www.wunc.org/unc-chapel-hill-shooting
+[265] https://www.wunc.org/raleigh-shooting
+[266] https://www.wunc.org/tags/a-teacher-in-every-class
+[267] https://www.wunc.org/behind-the-lines
+[268] https://www.wunc.org/tested-beyond-the-pod
+[269] https://www.wunc.org/the-lives-lost
+[270] https://www.wunc.org/andrew-brown-jr
+[271] https://www.wunc.org/calling-for-change
+[272] https://www.wunc.org/lumberton-undeterred
+[273] https://www.wunc.org/southern-witness
+[274] https://www.wunc.org/tags/nc-coronavirus-updates
+[275] https://www.wunc.org/education/2021-12-14/the-cost-of-summer
+[276] https://www.wunc.org/a-state-divided-hb2-and-transgender-rights
+[278] https://www.wunc.org/about-due-south
+[279] https://www.wunc.org/show/due-south
+[280] https://www.wunc.org/contact-due-south
+[281] https://www.wunc.org/about-due-south
+[282] https://www.wunc.org/show/due-south
+[283] https://www.wunc.org/contact-due-south
+[285] https://www.wunc.org/wunc-radio-schedule
+[286] https://www.wunc.org/all-shows
+[287] https://www.wunc.org/show/due-south
+[288] https://www.wunc.org/show/all-things-considered
+[289] https://www.wunc.org/show/morning-edition
+[290] https://www.wunc.org/back-porch-music
+[291] https://www.wunc.org/show/embodied-radio-show
+[292] https://www.wunc.org/show/sound-opinions
+[293] https://www.wunc.org/show/thistle-and-shamrock
+[294] https://www.wunc.org/youth-radio/youth-reporting-institute
+[295] https://www.wunc.org/show/the-peoples-pharmacy
+[296] https://americanhomefront.wunc.org/
+[297] https://www.wunc.org/show/fresh-air
+[298] https://www.wunc.org/show/the-poetry-cafe
+[299] https://www.wunc.org/npr-music-concerts
+[300] https://www.wunc.org/wunc-radio-schedule
+[301] https://www.wunc.org/all-shows
+[302] https://www.wunc.org/show/due-south
+[303] https://www.wunc.org/show/all-things-considered
+[304] https://www.wunc.org/show/morning-edition
+[305] https://www.wunc.org/back-porch-music
+[306] https://www.wunc.org/show/embodied-radio-show
+[307] https://www.wunc.org/show/sound-opinions
+[308] https://www.wunc.org/show/thistle-and-shamrock
+[309] https://www.wunc.org/youth-radio/youth-reporting-institute
+[310] https://www.wunc.org/show/the-peoples-pharmacy
+[311] https://americanhomefront.wunc.org/
+[312] https://www.wunc.org/show/fresh-air
+[313] https://www.wunc.org/show/the-poetry-cafe
+[314] https://www.wunc.org/npr-music-concerts
+[316] https://www.wunc.org/podcasts-from-wunc
+[317] https://www.wunc.org/podcast/the-broadside
+[318] https://www.wunc.org/podcast/embodied-podcast
+[319] https://www.wunc.org/podcast/podcast-wuncpolitics
+[320] https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
+[321] https://www.wunc.org/podcasts-from-wunc
+[322] https://www.wunc.org/podcast/the-broadside
+[323] https://www.wunc.org/podcast/embodied-podcast
+[324] https://www.wunc.org/podcast/podcast-wuncpolitics
+[325] https://www.wunc.org/podcast/me-and-my-muslim-friends-podcast
+[327] https://www.wunc.org/about-wunc
+[328] https://www.wunc.org/ways-to-listen-to-wunc-online
+[329] https://www.wunc.org/about-hd-radio
+[330] https://www.wunc.org/station-policies-financial-documents
+[331] https://www.wunc.org/i-d-e-a
+[332] https://www.wunc.org/wunc-public-radio-llc-board-of-directors
+[333] https://www.wunc.org/people
+[334] https://www.wunc.org/ways-to-connect
+[335] https://www.wunc.org/wunc-jobs
+[336] https://www.wunc.org/wunc-community-discussion-rules
+[337] https://www.wunc.org/telling-public-radios-story
+[338] https://www.wunc.org/ethics
+[339] https://www.wunc.org/contact-us
+[340] https://www.wunc.org/about-wunc
+[341] https://www.wunc.org/ways-to-listen-to-wunc-online
+[342] https://www.wunc.org/about-hd-radio
+[343] https://www.wunc.org/station-policies-financial-documents
+[344] https://www.wunc.org/i-d-e-a
+[345] https://www.wunc.org/wunc-public-radio-llc-board-of-directors
+[346] https://www.wunc.org/people
+[347] https://www.wunc.org/ways-to-connect
+[348] https://www.wunc.org/wunc-jobs
+[349] https://www.wunc.org/wunc-community-discussion-rules
+[350] https://www.wunc.org/telling-public-radios-story
+[351] https://www.wunc.org/ethics
+[352] https://www.wunc.org/contact-us
+[354] https://www.wunc.org/year-end-giving-deadlines-to-know
+[355] https://www.wunc.org/ways-to-give-to-wunc
+[356] https://www.wunc.org/thank-you-gifts
+[357] https://www.wunc.org/drawing-rules-entry-form
+[358] https://www.wunc.org/wunc-sustainers
+[359] https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
+[360] https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
+[361] https://www.wunc.org/join-the-leadership-circle
+[362] https://wunc.careasy.org/home
+[363] https://www.wunc.org/volunteer-opportunities
+[364] https://www.wunc.org/wuncs-legacy-society
+[365] https://www.wunc.org/sponsorships
+[366] https://www.wunc.org/community-sponsor-circle
+[367] https://www.wunc.org/other-ways-to-give
+[368] https://www.wunc.org/year-end-giving-deadlines-to-know
+[369] https://www.wunc.org/ways-to-give-to-wunc
+[370] https://www.wunc.org/thank-you-gifts
+[371] https://www.wunc.org/drawing-rules-entry-form
+[372] https://www.wunc.org/wunc-sustainers
+[373] https://support.wunc.org/site/Donation2;jsessionid=00000000.app30114a?idb=877548436&DONATION_LEVEL_ID_SELECTED=1&df_id=2033&mfc_pref=T&2033.donation=form1&NONCE_TOKEN=64CF2D8289923341669CC5D4BFB6EF54&idb=0
+[374] https://support.wunc.org/site/Donation2?df_id=2140&mfc_pref=T&2140.donation=form1
+[375] https://www.wunc.org/join-the-leadership-circle
+[376] https://wunc.careasy.org/home
+[377] https://www.wunc.org/volunteer-opportunities
+[378] https://www.wunc.org/wuncs-legacy-society
+[379] https://www.wunc.org/sponsorships
+[380] https://www.wunc.org/community-sponsor-circle
+[381] https://www.wunc.org/other-ways-to-give
+[382] https://www.wunc.org/wunc-music
+[383] https://www.wunc.org/search
+[384] https://www.wunc.org/news
+[385] https://www.wunc.org/people/mitchell-northam
+[386] https://www.wunc.org/people/bradley-george
+[387] https://www.wunc.org/people/will-michaels
+[388] https://www.facebook.com/dialog/share?app_id=3927319740668442&display=popup&href=https%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816
+[389] https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816&text=Storm%20leaves%20trail%20of%20damage%20across%20central%20NC%3B%20Thousands%20still%20without%20power%20Wednesday
+[390] https://www.linkedin.com/shareArticle?url=https%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816&mini=true&title=Storm%20leaves%20trail%20of%20damage%20across%20central%20NC%3B%20Thousands%20still%20without%20power%20Wednesday&summary=Tuesday%27s%20severe%20thunderstorms%20caused%20damages%2C%20outages%2C%20car%20accidents%2C%20and%20road%20closures.%20One%2078-year-old%20Durham%20woman%20died%20after%20a%20tree%20fell%20on%20her%20car.&source=WUNC
+[391] mailto:?body=Storm%20leaves%20trail%20of%20damage%20across%20central%20NC%3B%20Thousands%20still%20without%20power%20Wednesday%0A%0Ahttps%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816%0A%0ATuesday%27s%20severe%20thunderstorms%20caused%20damages%2C%20outages%2C%20car%20accidents%2C%20and%20road%20closures.%20One%2078-year-old%20Durham%20woman%20died%20after%20a%20tree%20fell%20on%20her%20car.
+[392] https://twitter.com/AnissaLopezTV?ref_src=twsrc%5Etfw
+[393] https://twitter.com/SpecNews1RDU?ref_src=twsrc%5Etfw
+[394] https://t.co/Yuphqoo3TG
+[395] https://twitter.com/KyleighPanetta/status/1691778846532509716?ref_src=twsrc%5Etfw
+[396] https://www.wral.com/story/i-40-west-in-durham-reopens-after-crash-involving-32-vehicles-during-severe-storms/21001866/
+[397] https://www.dconc.gov/Home/Components/News/News/9711/31
+[398] https://t.co/F5OiDz2EvF
+[399] https://twitter.com/wunc/status/1691574282189516878?ref_src=twsrc%5Etfw
+[400] https://www.wunc.org/news
+[401] https://www.wunc.org/tags/durham-county
+[402] https://www.wunc.org/tags/thunderstorms
+[403] https://www.wunc.org/tags/school-closure
+[404] https://www.wunc.org/tags/weather
+[405] https://www.facebook.com/dialog/share?app_id=3927319740668442&display=popup&href=https%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816
+[406] https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816&text=Storm%20leaves%20trail%20of%20damage%20across%20central%20NC%3B%20Thousands%20still%20without%20power%20Wednesday
+[407] https://www.linkedin.com/shareArticle?url=https%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816&mini=true&title=Storm%20leaves%20trail%20of%20damage%20across%20central%20NC%3B%20Thousands%20still%20without%20power%20Wednesday&summary=Tuesday%27s%20severe%20thunderstorms%20caused%20damages%2C%20outages%2C%20car%20accidents%2C%20and%20road%20closures.%20One%2078-year-old%20Durham%20woman%20died%20after%20a%20tree%20fell%20on%20her%20car.&source=WUNC
+[408] mailto:?body=Storm%20leaves%20trail%20of%20damage%20across%20central%20NC%3B%20Thousands%20still%20without%20power%20Wednesday%0A%0Ahttps%3A%2F%2Fwww.wunc.org%2Fnews%2F2023-08-16%2Fstorm-damage-durham-power-outage-closures-north-carolina-816%0A%0ATuesday%27s%20severe%20thunderstorms%20caused%20damages%2C%20outages%2C%20car%20accidents%2C%20and%20road%20closures.%20One%2078-year-old%20Durham%20woman%20died%20after%20a%20tree%20fell%20on%20her%20car.
+[409] https://www.wunc.org/people/mitchell-northam
+[410] https://www.wunc.org/people/mitchell-northam
+[411] https://www.wunc.org/people/mitchell-northam
+[412] https://www.wunc.org/people/bradley-george
+[413] https://www.wunc.org/people/bradley-george
+[414] https://www.wunc.org/people/bradley-george
+[415] https://www.wunc.org/people/will-michaels
+[416] https://www.wunc.org/people/will-michaels
+[417] https://www.wunc.org/people/will-michaels
+[418] https://www.wunc.org/2024-01-17/sobbed-podcast-transcript
+[419] https://www.wunc.org/2024-01-17/you-only-call-when-youre-in-trouble-is-a-witty-novel-to-get-you-through-the-winter
+[420] https://www.wunc.org/2024-01-17/princess-of-wales-undergoes-abdominal-surgery-king-charles-to-have-prostate-procedure
+[421] https://www.wunc.org/2024-01-17/higher-insurance-rates-in-buncombe-county-inflation-and-climate-change-may-be-to-blame
+[422] https://www.wunc.org/2024-01-17/30-years-ago-a-magnitude-6-7-earthquake-struck-northridge-in-southern-california
+[423] https://www.wunc.org/2024-01-17/iowas-results-show-trump-is-off-to-a-good-start-to-be-the-gop-presidential-nominee
+[424] https://www.wunc.org/events-calendar
+[425] https://www.wunc.org/2024-01-17/gop-governor-primary-heats-up-as-graham-airs-tv-ads-criticizing-robinson-over-holocaust-posts
+[426] https://www.wunc.org/2024-01-17/gop-governor-primary-heats-up-as-graham-airs-tv-ads-criticizing-robinson-over-holocaust-posts
+[427] https://www.wfae.org/people/steve-harrison
+[428] https://www.wunc.org/2024-01-17/local-leaders-deny-any-connection-between-state-infrastructure-grants-and-proposed-casinos
+[429] https://www.wunc.org/2024-01-17/local-leaders-deny-any-connection-between-state-infrastructure-grants-and-proposed-casinos
+[430] https://www.wfae.org/people/marshall-terry
+[432] https://www.wunc.org/education/2024-01-16/unc-greensboro-announces-program-cut-recommendations
+[433] https://www.wunc.org/education
+[434] https://www.wunc.org/education/2024-01-16/unc-greensboro-announces-program-cut-recommendations
+[435] https://www.wunc.org/people/brianna-atkinson
+[436] https://www.wunc.org/2024-01-16/new-hanover-county-sues-over-a-dozen-pfas-manufacturers-sellers
+[437] https://www.wunc.org/2024-01-16/new-hanover-county-sues-over-a-dozen-pfas-manufacturers-sellers
+[438] https://www.whqr.org/people/kelly-kenoyer-2
+[440] https://www.wunc.org/sports/2024-01-16/unc-pembroke-dick-christy-gambling-betting-impact-small-colleges
+[441] https://www.wunc.org/sports
+[442] https://www.wunc.org/sports/2024-01-16/unc-pembroke-dick-christy-gambling-betting-impact-small-colleges
+[443] https://www.wunc.org/people/mitchell-northam
+[444] https://www.wunc.org/
+[445] https://twitter.com/wunc
+[446] https://www.instagram.com/915wunc/
+[447] https://www.youtube.com/wuncfm
+[448] https://www.facebook.com/915wunc
+[449] https://www.linkedin.com/company/wunc-fm-91.5fm-north-carolina-public-radio
+[450] https://www.wunc.org/ways-to-listen-to-wunc-online
+[451] https://www.wunc.org/podcasts-from-wunc
+[452] https://www.wunc.org/events-calendar
+[453] https://www.wunc.org/about-wunc
+[454] https://www.wunc.org/contact-us
+[455] https://www.wunc.org/wunc-jobs
+[456] https://www.wunc.org/privacy
+[457] https://www.wunc.org/fcc-applications
+[458] https://publicfiles.fcc.gov/fm-profile/WUNC
+[459] https://publicfiles.fcc.gov/fm-profile/WBUX
+[460] https://publicfiles.fcc.gov/fm-profile/WFSS
+[461] https://publicfiles.fcc.gov/fm-profile/WRQM
+[462] https://publicfiles.fcc.gov/fm-profile/WUND-FM
+[463] https://publicfiles.fcc.gov/fm-profile/WURI
+[464] https://publicfiles.fcc.gov/fm-profile/WUNW-FM
+[465] https://publicfiles.fcc.gov/fm-profile/WZCO
+[466] https://docs.google.com/document/u/1/d/e/2PACX-1vSqllkRbwiZZtXGXNeRNC8bs8yd4syzFuPDZUAc5XQqadIJ91cqQCujTD_rN2-vmIT-vYeAYA693exg/pub
+[467] http://www.npr.org/
+[468] http://prx.org/
+[469] https://www.pri.org/
+[470] https://www.americanpublicmedia.org/
+[471] http://bbc.com/
diff --git a/static/archive/xeiaso-net-ygnwtd.txt b/static/archive/xeiaso-net-ygnwtd.txt
index bb02faf..3bd10a2 100644
--- a/static/archive/xeiaso-net-ygnwtd.txt
+++ b/static/archive/xeiaso-net-ygnwtd.txt
@@ -1,142 +1,135 @@
- #[1]alternate [2]alternate
-
- [3]Xe
-
- [4]Blog
-
- [5]Contact
-
- [6]Resume
-
- [7]Talks
-
- [8]VODs
-
- [9]Signalboost
+[1] Xe
+[2] Blog
+[3] Contact
+[4] Resume
+[5] Talks
+[6] VODs
+[7] Signalboost
gokrazy is really cool
- Published on 09/20/2023, 3515 words, 13 minutes to read
- An image of undefined - Nikon D3300, 35mm f/1.8 DX, a red formula one
- style car speeds along a racetrack with visible tire skidmarks. Photo
- by Xe Iaso I worked for Tailscale at the time of writing this article.
- I wrote this on my own time out of my own volition.
+Published on 09/20/2023, 3515 words, 13 minutes to read
- When you deal with Linux, you end up hearing about "distributions" as
- different "flavors" of Linux combined with a bunch of other tools. This
- is mostly true, but it's slightly missing the forest for the trees.
+An image of undefined - Nikon D3300, 35mm f/1.8 DX, a red formula one style car
+speeds along a racetrack with visible tire skidmarks. Photo by Xe Iaso I worked
+for Tailscale at the time of writing this article. I wrote this on my own time
+out of my own volition.
- Consider this famous and often misunderstood quote by Richard Stallman:
+When you deal with Linux, you end up hearing about "distributions" as different
+"flavors" of Linux combined with a bunch of other tools. This is mostly true,
+but it's slightly missing the forest for the trees.
- I'd just like to interject for a moment. What you're referring to as
- Linux is in fact, GNU/Linux, or as I've recently taken to calling
- it, GNU plus Linux.Linux is not an operating system unto itself, but
- rather another free component of a fully functioning GNU system made
- useful by the GNU corelibs, shell utilities and vital system
- components comprising a full OS as defined by POSIX.
+Consider this famous and often misunderstood quote by Richard Stallman:
- Many pages of ink have been spilled over analyzing this quote, and a
- lot of them fall short of really getting at the heart of the matter.
- What this actually means is something like this:
+ I'd just like to interject for a moment. What you're referring to as Linux
+ is in fact, GNU/Linux, or as I've recently taken to calling it, GNU plus
+ Linux.Linux is not an operating system unto itself, but rather another free
+ component of a fully functioning GNU system made useful by the GNU
+ corelibs, shell utilities and vital system components comprising a full OS
+ as defined by POSIX.
- By itself, Linux is useless. It does boot the system, it does interface
- with hardware, but without a bunch of other tools, it's not very
- useful. It's like a car without a steering wheel, or a boat without a
- rudder. It does something, but it's not very useful. The real value of
- things like the GNU project, systemd, openrc and other tools in that
- vein is that they make Linux useful. They make it into a complete
- system that you can use to do things. They are the proverbial steering
- wheel and rudder in the metaphor.
- Mara is hacker
- <[10]Mara> Fun fact, if you try to boot a Linux kernel without an init
- process, it'll just panic and crash!
+Many pages of ink have been spilled over analyzing this quote, and a lot of
+them fall short of really getting at the heart of the matter. What this
+actually means is something like this:
- Most Linux systems on the face of the planet are built with GNU tools
- and utilities. In order to compile the Linux kernel, you need to use
- [11]GCC. In order to run ls to list files in the current directory, you
- need to use [12]GNU coreutils. Every dynamically linked program uses
- [13]glibc for performing basic system interactions like writing to
- files or opening network sockets. Everything is built on top of the GNU
- toolset. This is why Stallman is so adamant about calling it GNU/Linux.
- It's not that he's trying to take credit for Linux, it's that he's
- trying to give credit to the GNU project for making Linux useful.
+By itself, Linux is useless. It does boot the system, it does interface with
+hardware, but without a bunch of other tools, it's not very useful. It's like a
+car without a steering wheel, or a boat without a rudder. It does something,
+but it's not very useful. The real value of things like the GNU project,
+systemd, openrc and other tools in that vein is that they make Linux useful.
+They make it into a complete system that you can use to do things. They are the
+proverbial steering wheel and rudder in the metaphor.
- However, there's a lot of room for nuance here. For example, [14]Alpine
- Linux is a Linux distribution that uses [15]musl libc instead of
- [16]glibc and [17]busybox instead of GNU coreutils. It's still a Linux
- distribution, but it doesn't use the GNU toolset. It's still a Linux
- distribution, but it's not GNU/Linux.
- Mara is hacker
- <[18]Mara> Also, for the record you can build the Linux kernel with
- clang, but that's a whole other can of worms. For one, GCC supports
- many more targets than clang likely ever will, but in general there are
- some compromises you need to make until clang implements some
- GCC-specific compiler extensions a bit better. Google, Facebook, and a
- few other companies do run LLVM compiled kernels in production though,
- so it's probably closer to viable than you think. Especially if you use
- ChromeOS or Android.
+Mara is hacker
+<[8]Mara> Fun fact, if you try to boot a Linux kernel without an init process,
+it'll just panic and crash!
- So, what is a Linux distribution? It's a collection of tools that make
- Linux useful. It's a collection of tools that make Linux into a
- complete system. It's not a "flavor" of Linux (though this conceptually
- can exist with alternative kernels like the Zen kernel patchset), it's
- a system that just so happens to make Linux useful.
+Most Linux systems on the face of the planet are built with GNU tools and
+utilities. In order to compile the Linux kernel, you need to use [9]GCC. In
+order to run ls to list files in the current directory, you need to use [10]GNU
+coreutils. Every dynamically linked program uses [11]glibc for performing basic
+system interactions like writing to files or opening network sockets.
+Everything is built on top of the GNU toolset. This is why Stallman is so
+adamant about calling it GNU/Linux. It's not that he's trying to take credit
+for Linux, it's that he's trying to give credit to the GNU project for making
+Linux useful.
- As a counter-argument, consider the reason why Linux runs on more
- devices worldwide than there are people: [19]Android. Android does use
- the Linux kernel, but it doesn't use any GNU tools in the stack at all.
- You can't take programs that are compiled against other Linux
- distributions and run them on Android. You can't take programs that are
- compiled against Android and run them on other Linux distributions.
- Aoi is wut
- <[20]Aoi> Wait, so does this mean Android's not a Linux distribution?
- What is it then?
+However, there's a lot of room for nuance here. For example, [12]Alpine Linux
+is a Linux distribution that uses [13]musl libc instead of [14]glibc and [15]
+busybox instead of GNU coreutils. It's still a Linux distribution, but it
+doesn't use the GNU toolset. It's still a Linux distribution, but it's not GNU/
+Linux.
- I'm going to argue that Android is not a Linux distribution unto
- itself. Android is a Linux implementation. It uses the Linux kernel,
- but that's where the similarities with the rest of the ecosystem end.
- Android is its own little world where there's just enough system tools
- to get the system running, but once you get into the UI, it's a
- completely different world. It's a completely different ecosystem. It's
- a completely different operating system.
- Aoi is wut
- <[21]Aoi> So what's the difference between a Linux distribution and a
- Linux implementation?
- Cadey is enby
- <[22]Cadey> It's a bit of a fuzzy line, but I'd say that a Linux
- distribution is a collection of discrete tools that make Linux useful,
- and a Linux implementation is a cohesive collection of bespoke tools
- that make Linux into a complete system. Really, you could argue that if
- it has /bin/sh, it's a Linux distribution.
+Mara is hacker
+<[16]Mara> Also, for the record you can build the Linux kernel with clang, but
+that's a whole other can of worms. For one, GCC supports many more targets than
+clang likely ever will, but in general there are some compromises you need to
+make until clang implements some GCC-specific compiler extensions a bit better.
+Google, Facebook, and a few other companies do run LLVM compiled kernels in
+production though, so it's probably closer to viable than you think. Especially
+if you use ChromeOS or Android.
+
+So, what is a Linux distribution? It's a collection of tools that make Linux
+useful. It's a collection of tools that make Linux into a complete system. It's
+not a "flavor" of Linux (though this conceptually can exist with alternative
+kernels like the Zen kernel patchset), it's a system that just so happens to
+make Linux useful.
+
+As a counter-argument, consider the reason why Linux runs on more devices
+worldwide than there are people: [17]Android. Android does use the Linux
+kernel, but it doesn't use any GNU tools in the stack at all. You can't take
+programs that are compiled against other Linux distributions and run them on
+Android. You can't take programs that are compiled against Android and run them
+on other Linux distributions.
+
+Aoi is wut
+<[18]Aoi> Wait, so does this mean Android's not a Linux distribution? What is
+it then?
+
+I'm going to argue that Android is not a Linux distribution unto itself.
+Android is a Linux implementation. It uses the Linux kernel, but that's where
+the similarities with the rest of the ecosystem end. Android is its own little
+world where there's just enough system tools to get the system running, but
+once you get into the UI, it's a completely different world. It's a completely
+different ecosystem. It's a completely different operating system.
+
+Aoi is wut
+<[19]Aoi> So what's the difference between a Linux distribution and a Linux
+implementation?
+Cadey is enby
+<[20]Cadey> It's a bit of a fuzzy line, but I'd say that a Linux distribution
+is a collection of discrete tools that make Linux useful, and a Linux
+implementation is a cohesive collection of bespoke tools that make Linux into a
+complete system. Really, you could argue that if it has /bin/sh, it's a Linux
+distribution.
gokrazy
- [23]gokrazy is a Linux implementation that I've used off and on for a
- few years now. It's a very interesting project because everything on
- the system is written in Go save the kernel. The init process is in Go
- (and even listens over HTTP to handle updates!), every userland process
- is written in Go, and even the core system services are written in Go.
+[21]gokrazy is a Linux implementation that I've used off and on for a few years
+now. It's a very interesting project because everything on the system is
+written in Go save the kernel. The init process is in Go (and even listens over
+HTTP to handle updates!), every userland process is written in Go, and even the
+core system services are written in Go.
- Out of the box a gokrazy install comes with these basic tools:
- * The init process that is mandated to be the parent of all userland
- processes by the Linux kernel.
- * A [24]DHCP client that automatically configures the network
- interface.
- * A [25]NTP client that automatically sets the system clock.
- * A little tool to save randomness from the kernel to a file so that
- it can be used to seed the random number generator on boot (because
- the Raspberry Pi doesn't have a robust hardware random number
- generator)
+Out of the box a gokrazy install comes with these basic tools:
- That's it. Everything else from the web UI to A/B update logic is
- written in Go. It boots in literal seconds, uses an insanely small
- amount of RAM out of the box, and runs with nearly zero overhead. When
- you configure your gokrazy install to run additional software, you do
- so by adding the Go command path to a configuration file and then
- updating to trigger a reboot into the new version.
+ • The init process that is mandated to be the parent of all userland
+ processes by the Linux kernel.
+ • A [22]DHCP client that automatically configures the network interface.
+ • A [23]NTP client that automatically sets the system clock.
+ • A little tool to save randomness from the kernel to a file so that it can
+ be used to seed the random number generator on boot (because the Raspberry
+ Pi doesn't have a robust hardware random number generator)
+
+That's it. Everything else from the web UI to A/B update logic is written in
+Go. It boots in literal seconds, uses an insanely small amount of RAM out of
+the box, and runs with nearly zero overhead. When you configure your gokrazy
+install to run additional software, you do so by adding the Go command path to
+a configuration file and then updating to trigger a reboot into the new
+version.
+
+Here's an example of what my gokrazy virtual machine's file tree looks like:
- Here's an example of what my gokrazy virtual machine's file tree looks
- like:
/ # tree etc gokrazy user
etc
├── breakglass.authorized_keys
@@ -169,67 +162,69 @@ user
├── tailscaled
└── waifud-gok-agent
- That is the entire system. It's all stripped down to these few
- programs, configuration files, and one symlink for DNS resolution. This
- is a very minimal system, and it's all you need to run statically
- linked Go programs. It's very easy to deploy your own services to it
- too. It's probably the easiest platform I know of that lets you just
- deploy a Go binary and have it run as a service, automatically
- restarting when it crashes.
+That is the entire system. It's all stripped down to these few programs,
+configuration files, and one symlink for DNS resolution. This is a very minimal
+system, and it's all you need to run statically linked Go programs. It's very
+easy to deploy your own services to it too. It's probably the easiest platform
+I know of that lets you just deploy a Go binary and have it run as a service,
+automatically restarting when it crashes.
The tooling
- When I used gokrazy back in the day, you had to use a command line
- called gokr-packer that you passed a bunch of command line flags to
- with information about all the Go programs you wanted to run on the
- machine, configuration for those programs, and any other
- meta-information like where the update tool should push the image to.
- It was a bit of a pain to use, but it worked. Recently the [26]gok tool
- was added to the project, and this has been revolutionary when it comes
- to using and administrating gokrazy installs.
+When I used gokrazy back in the day, you had to use a command line called
+gokr-packer that you passed a bunch of command line flags to with information
+about all the Go programs you wanted to run on the machine, configuration for
+those programs, and any other meta-information like where the update tool
+should push the image to. It was a bit of a pain to use, but it worked.
+Recently the [24]gok tool was added to the project, and this has been
+revolutionary when it comes to using and administrating gokrazy installs.
- Essentially, gok is a wrapper around the existing gokr-packer logic
- with a JSON file to store your configuration details. It's a lot easier
- to use, understand, and automate. You don't have to remember command
- line flags or maintain unwieldy scripts. You just edit a JSON file and
- push updates with gok update. It's amazingly simple.
+Essentially, gok is a wrapper around the existing gokr-packer logic with a JSON
+file to store your configuration details. It's a lot easier to use, understand,
+and automate. You don't have to remember command line flags or maintain
+unwieldy scripts. You just edit a JSON file and push updates with gok update.
+It's amazingly simple.
Setting up a gokrazy machine
- As an example, I'm going to show you how to install a bunch of tailnet
- addons to a gokrazy machine. I'm also going to assume that you don't
- have a gokrazy install set up yet, so we'll need to install it. To do
- this, we'll need to do a few simple things:
- * Install the gok tool.
- * Create your gok configuration.
- * Install Tailscale on the machine.
- * Create your "seed" image with gok overwrite.
- * Boot it on your Raspberry Pi or VM.
- * Push any updates to the image to the machine with gok update.
+As an example, I'm going to show you how to install a bunch of tailnet addons
+to a gokrazy machine. I'm also going to assume that you don't have a gokrazy
+install set up yet, so we'll need to install it. To do this, we'll need to do a
+few simple things:
+
+ • Install the gok tool.
+ • Create your gok configuration.
+ • Install Tailscale on the machine.
+ • Create your "seed" image with gok overwrite.
+ • Boot it on your Raspberry Pi or VM.
+ • Push any updates to the image to the machine with gok update.
+
+First, let's install the gok tool. In order to do this, you need to have the
+[25]Go toolchain installed. Once you have that, you can run go install to
+install the gok tool:
- First, let's install the gok tool. In order to do this, you need to
- have the [27]Go toolchain installed. Once you have that, you can run go
- install to install the gok tool:
go install github.com/gokrazy/tools/cmd/gok@main
- Mara is hacker
- <[28]Mara> You may want to ensure that ~/go/bin is in your $PATH
- variable so that you can run it by the name gok instead of
- ~/go/bin/gok.
+Mara is hacker
+<[26]Mara> You may want to ensure that ~/go/bin is in your $PATH variable so
+that you can run it by the name gok instead of ~/go/bin/gok.
+
+Next, create a new gokrazy configuration with gok new:
- Next, create a new gokrazy configuration with gok new:
gok new -i casa
- This will create a configuration named casa (cf: Spanish for "house")
- in ~/gokrazy/casa. This is where all of your configuration files will
- live. You can edit the configuration file with gok edit:
+This will create a configuration named casa (cf: Spanish for "house") in ~/
+gokrazy/casa. This is where all of your configuration files will live. You can
+edit the configuration file with gok edit:
+
gok edit -i casa
- If you are making a virtual machine
+If you are making a virtual machine
+
+If you are making a virtual machine, you will need to override the kernel and
+firmware packages. You can do this by adding the following to your
+configuration file:
- If you are making a virtual machine, you will need to override the
- kernel and firmware packages. You can do this by adding the following
- to your configuration file:
{
// ...
"KernelPackage": "github.com/rtr7/kernel",
@@ -237,33 +232,35 @@ gok edit -i casa
// ...
}
- You will need to prefix the gok overwrite and gok update commands with
- GOARCH=amd64 to ensure that Go builds x86_64 binaries instead of ARM
- binaries:
+You will need to prefix the gok overwrite and gok update commands with GOARCH=
+amd64 to ensure that Go builds x86_64 binaries instead of ARM binaries:
+
GOARCH=amd64 gok update -i casa
- If you don't do this, you will get arm64 binaries being built. This may
- require manual recovery of your virtual machine.
+If you don't do this, you will get arm64 binaries being built. This may require
+manual recovery of your virtual machine.
- Let's make our lives easier by installing [29]Tailscale on the machine.
- By default, gokrazy will announce its hostname over DHCP, which usually
- makes most consumer routers pick it up and then lets you ping it by
- name. When you have [30]MagicDNS enabled, Tailscale can take over this
- logic and prevent you from accessing the machine by name.
+Let's make our lives easier by installing [27]Tailscale on the machine. By
+default, gokrazy will announce its hostname over DHCP, which usually makes most
+consumer routers pick it up and then lets you ping it by name. When you have
+[28]MagicDNS enabled, Tailscale can take over this logic and prevent you from
+accessing the machine by name.
+
+However, Tailscale is written in Go and doesn't require any of the services
+that most Linux distributions provide in order to function. It's a perfect fit
+for gokrazy. You can install it with gok add:
- However, Tailscale is written in Go and doesn't require any of the
- services that most Linux distributions provide in order to function.
- It's a perfect fit for gokrazy. You can install it with gok add:
gok add tailscale.com/cmd/tailscaled
gok add tailscale.com/cmd/tailscale
- And be sure to add the mkfs service to create a persistent partition on
- /perm:
+And be sure to add the mkfs service to create a persistent partition on /perm:
+
gok add github.com/gokrazy/mkfs
- Next, fetch an [31]auth key from [32]the admin console and make sure
- you check that it's reusable. Then, add the following to your
- configuration file under the PackageConfig block:
+Next, fetch an [29]auth key from [30]the admin console and make sure you check
+that it's reusable. Then, add the following to your configuration file under
+the PackageConfig block:
+
{
// ...
"PackageConfig": {
@@ -280,83 +277,84 @@ gok add github.com/gokrazy/mkfs
// ...
}
- Mara is hacker
- <[33]Mara> You can pass any other [34]tailscale up flags you want here,
- such as --advertise-exit-node if you want to use your gokrazy machine
- as an [35]exit node.
+Mara is hacker
+<[31]Mara> You can pass any other [32]tailscale up flags you want here, such as
+--advertise-exit-node if you want to use your gokrazy machine as an [33]exit
+node.
- This will make your machine automatically connect to Tailscale on boot.
+This will make your machine automatically connect to Tailscale on boot.
+
+Next, we need to create our "seed" image with gok overwrite. First, figure out
+what the device node for your SD card is. On Linux, you can do this with lsblk:
- Next, we need to create our "seed" image with gok overwrite. First,
- figure out what the device node for your SD card is. On Linux, you can
- do this with lsblk:
lsblk
- And then look for the one that has the same size as your SD card. In my
- case, it's /dev/sdd. Once you have that, you can run gok overwrite:
+And then look for the one that has the same size as your SD card. In my case,
+it's /dev/sdd. Once you have that, you can run gok overwrite:
+
gok overwrite --full /dev/sdd
- However if you want to write the image to a file (such as if you are
- doing mass distribution or making a VM image), you need to use gok
- overwrite with a file instead of a device node. This will create a 16
- GB image:
+However if you want to write the image to a file (such as if you are doing mass
+distribution or making a VM image), you need to use gok overwrite with a file
+instead of a device node. This will create a 16 GB image:
+
gok overwrite -i casa --full gokrazy.img --target_storage_bytes 17179869184
- Once you have your image, you can write it to your SD card with dd (or
- [36]balenaEtcher) or import it into your virtual machine hypervisor of
- choice.
+Once you have your image, you can write it to your SD card with dd (or [34]
+balenaEtcher) or import it into your virtual machine hypervisor of choice.
- Once you have your image written to your SD card, you can boot it on
- your Raspberry Pi or VM.
- Aoi is wut
- <[37]Aoi> Wait, so how do I log in with a shell?
- Cadey is enby
- <[38]Cadey> You don't. gokrazy doesn't have a login prompt. It's a
- single-user system. There is [39]breakglass as a tool of last resort to
- modify things, but you only have a very minimal subset of busybox to
- work with, so it should be avoided if at all possible.
+Once you have your image written to your SD card, you can boot it on your
+Raspberry Pi or VM.
- Once you have your machine booted and it responds to pings over
- Tailscale, you can open its HTTP interface in your browser. If you
- called your machine casa, you can open it at [40]http://casa. It will
- prompt you for a username and password. Your username is gokrazy, and
- the password is near the top of your config.json file. When you log in,
- you'll see a screen like this:
- [41][gokrazy-ui.jpg]
+Aoi is wut
+<[35]Aoi> Wait, so how do I log in with a shell?
+Cadey is enby
+<[36]Cadey> You don't. gokrazy doesn't have a login prompt. It's a single-user
+system. There is [37]breakglass as a tool of last resort to modify things, but
+you only have a very minimal subset of busybox to work with, so it should be
+avoided if at all possible.
- This is the gokrazy web UI. It lets you see the status of your machine
- and any logs that are being generated by your applications. You can
- also start, stop, and restart any of your applications from here. It's
- a very simple UI, but it's fantastic for debugging and monitoring.
+Once you have your machine booted and it responds to pings over Tailscale, you
+can open its HTTP interface in your browser. If you called your machine casa,
+you can open it at [38]http://casa. It will prompt you for a username and
+password. Your username is gokrazy, and the password is near the top of your
+config.json file. When you log in, you'll see a screen like this:
+
+[39][gokrazy-ui]
+
+This is the gokrazy web UI. It lets you see the status of your machine and any
+logs that are being generated by your applications. You can also start, stop,
+and restart any of your applications from here. It's a very simple UI, but it's
+fantastic for debugging and monitoring.
Tailnet addons
- Now that we have a Gokrazy system up and running, let's add some
- programs to it! I'm going to list a couple tailnet addons that give
- your tailnet superpowers. These are all written in Go, so they're a
- perfect fit for gokrazy.
+Now that we have a Gokrazy system up and running, let's add some programs to
+it! I'm going to list a couple tailnet addons that give your tailnet
+superpowers. These are all written in Go, so they're a perfect fit for gokrazy.
- Today I'm going to show you how to install these tools into your
- tailnet:
- * [42]golink - a URL shortener at http://go
- * [43]tmemes - an internal meme generator you can host at
- http://memegen
- * [44]tclip - a pastebin you can host at http://paste
+Today I'm going to show you how to install these tools into your tailnet:
- These tools help you augment your tailnet by giving you tools that will
- make you and your team's life a lot easier. A URL shortener helps you
- link to complicated Google Docs URLs. A meme generator gives you a new
- innovative way to let off steam. A pastebin lets you share text with
- your team without having to worry about the service you're using going
- offline due to no fault of your own.
+ • [40]golink - a URL shortener at http://go
+ • [41]tmemes - an internal meme generator you can host at http://memegen
+ • [42]tclip - a pastebin you can host at http://paste
+
+These tools help you augment your tailnet by giving you tools that will make
+you and your team's life a lot easier. A URL shortener helps you link to
+complicated Google Docs URLs. A meme generator gives you a new innovative way
+to let off steam. A pastebin lets you share text with your team without having
+to worry about the service you're using going offline due to no fault of your
+own.
golink
- To install golink, we need to add the golink binary to the
- configuration. You can do this with gok add:
+To install golink, we need to add the golink binary to the configuration. You
+can do this with gok add:
+
gok add github.com/tailscale/golink/cmd/golink
- Then configure it with gok edit:
+Then configure it with gok edit:
+
{
// ...
"PackageConfig": {
@@ -377,51 +375,55 @@ gok add github.com/tailscale/golink/cmd/golink
// ...
}
- And finally push it with gok update:
+And finally push it with gok update:
+
gok update -i casa
- It'll build the image, push it out over Tailscale, trigger a reboot,
- and be back up in the span of a minute. Once it's back up, you can open
- the web UI again and see the status of your golink instance at
- [45]http://casa/status?path=%2fuser%2fgolink:
- [46][golink.jpg]
+It'll build the image, push it out over Tailscale, trigger a reboot, and be
+back up in the span of a minute. Once it's back up, you can open the web UI
+again and see the status of your golink instance at [43]http://casa/status?path
+=%2fuser%2fgolink:
- And then you can start using short URLs at [47]http://go:
- [48][golink-ui.jpg]
+[44][golink]
- And that's it! You now have a super minimal VM running small programs
- that let you do useful things to you. You can add more programs to your
- configuration file and push them with gok update to add more
- functionality to your machine. You can even add your own programs to
- the configuration file and push them to your machine. It's a very
- simple system, but it's very powerful.
+And then you can start using short URLs at [45]http://go:
+
+[46][golink-ui]
+
+And that's it! You now have a super minimal VM running small programs that let
+you do useful things to you. You can add more programs to your configuration
+file and push them with gok update to add more functionality to your machine.
+You can even add your own programs to the configuration file and push them to
+your machine. It's a very simple system, but it's very powerful.
tmemes
- Google is infamous for having an internal service named [49]memegen.
- This allows Googlers to make internal-facing memes about the slings and
- arrows that impact them as highly paid programmers. This is an internal
- service inside Google that has a lot of serious investment of time and
- energy to make it the best possible experience it can be. It's to the
- point that reportedly people can keep up with how an all-hands meeting
- is going by the tone of the sarcastic memes that are being posted to
- memegen.
+Google is infamous for having an internal service named [47]memegen. This
+allows Googlers to make internal-facing memes about the slings and arrows that
+impact them as highly paid programmers. This is an internal service inside
+Google that has a lot of serious investment of time and energy to make it the
+best possible experience it can be. It's to the point that reportedly people
+can keep up with how an all-hands meeting is going by the tone of the sarcastic
+memes that are being posted to memegen.
- The main reason this is run inside Google is to avoid information
- leaking via memes. Yes, this is an actual threat model.
+The main reason this is run inside Google is to avoid information leaking via
+memes. Yes, this is an actual threat model.
- Thanks to the magic of Tailscale, you can make your own private memegen
- using [50]tmemes. tmemes is a tailnet addon that lets you post image
- macro templates and layer wisdom over it in the form of text.
+Thanks to the magic of Tailscale, you can make your own private memegen using
+[48]tmemes. tmemes is a tailnet addon that lets you post image macro templates
+and layer wisdom over it in the form of text.
- Here's an example meme:
- [51][society-if-gokrazy.jpg]
+Here's an example meme:
+
+[49][society-if]
+
+To add tmemes to your gokrazy machine, you can use gok add:
- To add tmemes to your gokrazy machine, you can use gok add:
gok add github.com/tailscale/tmemes/tmemes
- Then open your config with gok edit and add the following to your
- PackageConfig block:
+Then open your config with gok edit and add the following to your PackageConfig
+block:
+
{
// ...
"PackageConfig": {
@@ -444,30 +446,32 @@ gok add github.com/tailscale/tmemes/tmemes
// ...
}
- And then push it with gok update:
+And then push it with gok update:
+
gok update -i casa
- Then you can head to [52]http://memegen and upload a template to make
- your own dank memes.
+Then you can head to [50]http://memegen and upload a template to make your own
+dank memes.
- If you want to integrate your own tools with tmemes, you can check out
- the [53]API documentation. This should help you do whatever it is you
- want with a meme generator as a service.
+If you want to integrate your own tools with tmemes, you can check out the [51]
+API documentation. This should help you do whatever it is you want with a meme
+generator as a service.
tclip
- Sometimes you just need a place to paste text and get a URL pointing to
- it. [54]tclip is a tool that you can add to your tailnet and get
- exactly that. It's a very simple tool, but it's very useful. It's also
- written in Go, so it's a perfect fit for gokrazy. [55]Their recent
- update to remove Cgo dependencies makes it possible to run your tclip
- node on a gokrazy machine.
+Sometimes you just need a place to paste text and get a URL pointing to it.
+[52]tclip is a tool that you can add to your tailnet and get exactly that. It's
+a very simple tool, but it's very useful. It's also written in Go, so it's a
+perfect fit for gokrazy. [53]Their recent update to remove Cgo dependencies
+makes it possible to run your tclip node on a gokrazy machine.
+
+To add tclip to your gokrazy machine, you can use gok add:
- To add tclip to your gokrazy machine, you can use gok add:
gok add github.com/tailscale-dev/tclip/cmd/tclipd
- Then open your config with gok edit and add the following to your
- PackageConfig block:
+Then open your config with gok edit and add the following to your PackageConfig
+block:
+
{
// ...
"PackageConfig": {
@@ -486,115 +490,112 @@ gok add github.com/tailscale-dev/tclip/cmd/tclipd
}
}
- And then push it with gok update:
+And then push it with gok update:
+
gok update -i casa
- And then you can start using it by heading to [56]http://paste. Install
- the command-line tool on your development workstation with go install:
+And then you can start using it by heading to [54]http://paste. Install the
+command-line tool on your development workstation with go install:
+
go install github.com/tailscale-dev/tclip/cmd/tclip@latest
- Here's an example tclip link if you want to see what it looks like in
- practice: [57]interjection.c. It's a very simple tool, but it's very
- useful.
+Here's an example tclip link if you want to see what it looks like in practice:
+[55]interjection.c. It's a very simple tool, but it's very useful.
Conclusion
- gokrazy is insanely cool. It's the easiest way to deploy Go services to
- your homelab. It integrates seamlessly with Tailscale, and is something
- that I'm very excited to see grow and mature. I'm very excited to see
- what the future holds for gokrazy, and I'm very excited to see what
- people do with it.
+gokrazy is insanely cool. It's the easiest way to deploy Go services to your
+homelab. It integrates seamlessly with Tailscale, and is something that I'm
+very excited to see grow and mature. I'm very excited to see what the future
+holds for gokrazy, and I'm very excited to see what people do with it.
- I've seen signs that they're going to be adding an automatic update
- process, and that has me very excited. I'm also excited to see what
- other services people add to the gokrazy ecosystem. I'm hoping to add a
- few of my own in the future, and I'm hoping to see what other people do
- with it.
- Mara is hacker
- <[58]Mara> Spoiler alert: [59]waifud support is coming soon to a
- homelab near you.
- __________________________________________________________________
+I've seen signs that they're going to be adding an automatic update process,
+and that has me very excited. I'm also excited to see what other services
+people add to the gokrazy ecosystem. I'm hoping to add a few of my own in the
+future, and I'm hoping to see what other people do with it.
- (BUTTON) Share
+Mara is hacker
+<[56]Mara> Spoiler alert: [57]waifud support is coming soon to a homelab near
+you.
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+Share
- Facts and circumstances may have changed since publication. Please
- contact me before jumping to conclusions if something seems wrong or
- unclear.
+Facts and circumstances may have changed since publication. Please contact me
+before jumping to conclusions if something seems wrong or unclear.
- Tags: go, gokrazy, linux
+Tags: go, gokrazy, linux
- Copyright 2012-2024 Xe Iaso (Christine Dodrill). Any and all opinions
- listed here are my own and not representative of any of my employers,
- past, future, and/or present.
+Copyright 2012-2024 Xe Iaso (Christine Dodrill). Any and all opinions listed
+here are my own and not representative of any of my employers, past, future,
+and/or present.
- Like what you see? Donate on [60]Patreon like [61]these awesome people!
+Like what you see? Donate on [59]Patreon like [60]these awesome people!
- Served by xesite v4
- (/nix/store/5pbrsn0khhga62ipyl043c9z22dlah4w-xesite_v4-20231122/bin/xes
- ite) with site version [62]ae5283f7 , source code available [63]here.
+Served by xesite v4 (/nix/store/
+5pbrsn0khhga62ipyl043c9z22dlah4w-xesite_v4-20231122/bin/xesite) with site
+version [61]71d942d2 , source code available [62]here.
-References
- 1. https://xeiaso.net/blog.rss
- 2. https://xeiaso.net/blog.json
- 3. https://xeiaso.net/
- 4. https://xeiaso.net/blog
- 5. https://xeiaso.net/contact
- 6. https://xeiaso.net/resume
- 7. https://xeiaso.net/talks
- 8. https://xeiaso.net/vods
- 9. https://xeiaso.net/signalboost
- 10. https://xeiaso.net/characters#mara
- 11. https://gcc.gnu.org/
- 12. https://www.gnu.org/software/coreutils/coreutils.html
- 13. https://www.gnu.org/software/libc/
- 14. https://alpinelinux.org/
- 15. https://musl.libc.org/
- 16. https://www.gnu.org/software/libc/
- 17. https://en.wikipedia.org/wiki/BusyBox
- 18. https://xeiaso.net/characters#mara
- 19. https://en.wikipedia.org/wiki/Android_(operating_system)
- 20. https://xeiaso.net/characters#aoi
- 21. https://xeiaso.net/characters#aoi
- 22. https://xeiaso.net/characters#cadey
- 23. https://gokrazy.org/
- 24. https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
- 25. https://en.wikipedia.org/wiki/Network_Time_Protocol
- 26. https://gokrazy.org/quickstart/
- 27. https://golang.org/doc/install
- 28. https://xeiaso.net/characters#mara
- 29. https://tailscale.com/
- 30. https://tailscale.com/kb/1081/magicdns/
- 31. https://tailscale.com/kb/1085/auth-keys/
- 32. https://login.tailscale.com/admin/settings/keys
- 33. https://xeiaso.net/characters#mara
- 34. https://tailscale.com/kb/1080/cli/#up
- 35. https://tailscale.com/kb/1103/exit-nodes/?q=exit node
- 36. https://etcher.balena.io/
- 37. https://xeiaso.net/characters#aoi
- 38. https://xeiaso.net/characters#cadey
- 39. https://github.com/gokrazy/breakglass
- 40. http://casa/
- 41. https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/gokrazy-ui.jpg
- 42. https://github.com/tailscale/golink
- 43. https://github.com/tailscale/tmemes
- 44. https://github.com/tailscale-dev/tclip
- 45. http://casa/status?path=/user/golink
- 46. https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/golink.jpg
- 47. http://go/
- 48. https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/golink-ui.jpg
- 49. https://www.buzzfeednews.com/article/reyhan/inside-googles-internal-meme-generator
- 50. https://github.com/tailscale/tmemes
- 51. https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/society-if-gokrazy.jpg
- 52. http://memegen/
- 53. https://github.com/tailscale/tmemes/blob/main/docs/api.md
- 54. https://tailscale.dev/blog/tclip
- 55. https://tailscale.dev/blog/tclip-updates-092023
- 56. http://paste/
- 57. https://paste.shark-harmonic.ts.net/paste/696b9b02-90ac-4adc-a33d-d749bb6f460f
- 58. https://xeiaso.net/characters#mara
- 59. https://github.com/Xe/waifud-gok-agent
- 60. https://patreon.com/cadey
- 61. https://xeiaso.net/patrons
- 62. https://github.com/Xe/site/commit/ae5283f759ecfc72f6779f57231991d0a881a8a9
- 63. https://github.com/Xe/site
+References:
+
+[1] https://xeiaso.net/
+[2] https://xeiaso.net/blog
+[3] https://xeiaso.net/contact
+[4] https://xeiaso.net/resume
+[5] https://xeiaso.net/talks
+[6] https://xeiaso.net/vods
+[7] https://xeiaso.net/signalboost
+[8] https://xeiaso.net/characters#mara
+[9] https://gcc.gnu.org/
+[10] https://www.gnu.org/software/coreutils/coreutils.html
+[11] https://www.gnu.org/software/libc/
+[12] https://alpinelinux.org/
+[13] https://musl.libc.org/
+[14] https://www.gnu.org/software/libc/
+[15] https://en.wikipedia.org/wiki/BusyBox
+[16] https://xeiaso.net/characters#mara
+[17] https://en.wikipedia.org/wiki/Android_(operating_system)
+[18] https://xeiaso.net/characters#aoi
+[19] https://xeiaso.net/characters#aoi
+[20] https://xeiaso.net/characters#cadey
+[21] https://gokrazy.org/
+[22] https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
+[23] https://en.wikipedia.org/wiki/Network_Time_Protocol
+[24] https://gokrazy.org/quickstart/
+[25] https://golang.org/doc/install
+[26] https://xeiaso.net/characters#mara
+[27] https://tailscale.com/
+[28] https://tailscale.com/kb/1081/magicdns/
+[29] https://tailscale.com/kb/1085/auth-keys/
+[30] https://login.tailscale.com/admin/settings/keys
+[31] https://xeiaso.net/characters#mara
+[32] https://tailscale.com/kb/1080/cli/#up
+[33] https://tailscale.com/kb/1103/exit-nodes/?q=exit%20node
+[34] https://etcher.balena.io/
+[35] https://xeiaso.net/characters#aoi
+[36] https://xeiaso.net/characters#cadey
+[37] https://github.com/gokrazy/breakglass
+[38] http://casa/
+[39] https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/gokrazy-ui.jpg
+[40] https://github.com/tailscale/golink
+[41] https://github.com/tailscale/tmemes
+[42] https://github.com/tailscale-dev/tclip
+[43] http://casa/status?path=%2fuser%2fgolink
+[44] https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/golink.jpg
+[45] http://go/
+[46] https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/golink-ui.jpg
+[47] https://www.buzzfeednews.com/article/reyhan/inside-googles-internal-meme-generator
+[48] https://github.com/tailscale/tmemes
+[49] https://cdn.xeiaso.net/file/christine-static/blog/2023/gokrazy/society-if-gokrazy.jpg
+[50] http://memegen/
+[51] https://github.com/tailscale/tmemes/blob/main/docs/api.md
+[52] https://tailscale.dev/blog/tclip
+[53] https://tailscale.dev/blog/tclip-updates-092023
+[54] http://paste/
+[55] https://paste.shark-harmonic.ts.net/paste/696b9b02-90ac-4adc-a33d-d749bb6f460f
+[56] https://xeiaso.net/characters#mara
+[57] https://github.com/Xe/waifud-gok-agent
+[59] https://patreon.com/cadey
+[60] https://xeiaso.net/patrons
+[61] https://github.com/Xe/site/commit/71d942d2664615d081d14037ad9930848f6a72b4
+[62] https://github.com/Xe/site