{"id":15642724,"url":"https://github.com/michael-simons/goodreads","last_synced_at":"2025-04-13T06:40:55.579Z","repository":{"id":40063459,"uuid":"72088649","full_name":"michael-simons/goodreads","owner":"michael-simons","description":"Articles, books, quotes and more, including software development, politics, and just prose.","archived":false,"fork":false,"pushed_at":"2025-03-29T13:17:17.000Z","size":243,"stargazers_count":66,"open_issues_count":0,"forks_count":7,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-04T22:43:01.885Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michael-simons.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-27T08:42:38.000Z","updated_at":"2025-03-29T13:17:20.000Z","dependencies_parsed_at":"2023-10-16T04:07:50.423Z","dependency_job_id":"613648af-605d-4d25-b0f8-386b0074f49f","html_url":"https://github.com/michael-simons/goodreads","commit_stats":{"total_commits":126,"total_committers":1,"mean_commits":126.0,"dds":0.0,"last_synced_commit":"05b447d36427e66f9c90fb15f0fa5b3121b9c36a"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael-simons%2Fgoodreads","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael-simons%2Fgoodreads/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael-simons%2Fgoodreads/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael-simons%2Fgoodreads/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michael-simons","download_url":"https://codeload.github.com/michael-simons/goodreads/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248675434,"owners_count":21143763,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-03T11:57:18.689Z","updated_at":"2025-04-13T06:40:55.560Z","avatar_url":"https://github.com/michael-simons.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Goodreads\n\n## Books\n\n* [97 Things Every Programmer Should Know (EN)](http://www.oreilly.com/pub/pr/2499)\n* [Kathrin Passig, Johannes Jander - Weniger schlecht programmieren (DE)](http://www.oreilly.de/book_details.php?masterid=120174)\n* [Peter Seibel - Coders At Work (EN)](http://www.apress.com/us/book/9781430219484)\n* [Bill Karwin - SQL Antipatterns (EN)](https://pragprog.com/book/bksqla/sql-antipatterns)\n* [Eric Evans - Domain-Driven Design, Tackling Complexity in the Heart of Software (EN)](http://dddcommunity.org/book/evans_2003/)\n* [Joshua Bloch - Effective Java, 3rd Edition](http://www.informit.com/store/effective-java-9780134685991)\n* [Rob Conery - The Imposter's Handbook: Essential CS Skills and Concepts for Self-Taught Programmers](https://bigmachine.io/products/the-imposters-handbook)\n* [Michael Nygard - Release It! Second Edition](https://pragprog.com/book/mnee2/release-it-second-edition)\n* [Kevin Behr, George Spafford, Gene Kim - The Phoenix Project](https://itrevolution.com/book/the-phoenix-project/)\n* [Martin Kleppmann - Designing Data-Intensive Applications](https://dataintensive.net/)\n* [Marianne Bellotti - Kill It With Fire](https://nostarch.com/kill-it-fire)\n* [DevOps Tools for Java Developers (Various authors)](https://www.oreilly.com/library/view/devops-tools-for/9781492084013/)\n* [Dan McQuillan - Resisting AI, An anti-fascist approach to artificial intelligence](https://bristoluniversitypress.co.uk/resisting-ai) (One of the most important books in the field of AI in 2023 and later)\n* [John Romero - DOOM Guy: Life in First Person ](https://romero.com/shop/p/doomguy) (Great insights into quite a different part of our industry than the one I am participating in. Great focus on positive aspects, reassuring that there are humble engineers still in the industry)\n* [James Stanier - Become an Effective Software Engineering Manager](https://pragprog.com/titles/jsengman/become-an-effective-software-engineering-manager/?ref=blog.pragmaticengineer.com) (See [commit as minireview](https://github.com/michael-simons/goodreads/commit/d6ddd24c212bf70003fcba01e2fe7219475e6eee))\n## Problemsolver\n\nI'd call those books \"Problemsolver\". You might not read them from front to back but as a reference for specific problems. \n\n* [Thorben Jansen - Hibernate Tips, More than 70 solutions to common Hibernate problems](https://www.thoughts-on-java.org/hibernate-tips-book/)\n* [Simon Harrer, Jörg Lenhard, Linus Dietz - Java by Comparison](https://pragprog.com/book/javacomp/java-by-comparison)\n\n## Non-IT\n\nThese are non IT specific books, but touch essential things in our business.\nEither the way we work together or address some common misconceptions, for example sleep being an optional aspect to live:\n\n* [Richard Sennett - Together.The Rituals, Pleasures and Politics of Cooperation](https://yalebooks.yale.edu/book/9780300188288/together)\n* [Matthew Walker - Why We Sleep](https://www.gatesnotes.com/Books/Why-We-Sleep)\n* [Robin DiAngelo - White Fragility](https://www.tolerance.org/magazine/summer-2019/whats-my-complicity-talking-white-fragility-with-robin-diangelo) (A recommended read for all white developers and a good starter to understand why we need to work actively against racism and not manifest structural racism in our software based solutions)\n* [Jonathan Taplin - The End of Reality: How Four Billionaires are Selling a Fantasy Future of the Metaverse, Mars, and Crypto](https://www.sandmanbooks.com/book/9781541703155) (Proper eye-opener, with a lot of history and a semi-optimistic outlook)\n* [Arnold Schwarzenegger - Be Useful: Sieben einfache Regeln für ein besseres Leben](https://beusefulbook.com)\n\n## Work in general\n\n* [Gavin Mueller - Breaking Things At Work: The Luddites Were Right About Why You Hate Your Job](https://archive.org/details/breaking-things-at-work-the-luddites-were-right-about-why-you-hate-your-job-by-gavin-mueller/mode/2up) (I don't hate my job, quite the contrary, but this book is both a good history whirlwind and a reassurance that I am not the only one who struggles to understand ongoing automation, enshittification and in general, making billionaires richer by making us all poorer and less autonomous)\n\n## Essays and other articles\n\n### Best practices\n\n* [Jonathan Giles - Java Best Practices](http://java.jonathangiles.net)\n* [Jon P Smith - What makes a good software library?](https://www.thereformedprogrammer.net/what-makes-a-good-software-library/)\n\n### Architecture\n\n* [Beate Ritterbach – Vererbung: für Objekte nützlich, für Werte gefährlich (DE)](http://www.heise.de/developer/artikel/Vererbung-fuer-Objekte-nuetzlich-fuer-Werte-gefaehrlich-3254433.html#mobile_detect_force_desktop)\n* [Oliver Gierke – Whoops! Where did my architecture go (EN)](http://olivergierke.de/2013/01/whoops-where-did-my-architecture-go/)\n* [Mark Seemann - Domain modelling with REST(EN)](http://blog.ploeh.dk/2016/12/07/domain-modelling-with-rest/)\n\n### Concepts\n\n* [John McClean - Trampolining: a practical guide for awesome Java Developers (EN)](https://medium.com/@johnmcclean/trampolining-a-practical-guide-for-awesome-java-developers-4b657d9c3076#.63mh5t4x9)\n\n### Philosophy\n\n* [Edsger W. Dijkstra – The Humble Programmer (EN)](https://www.cs.utexas.edu/~EWD/transcriptions/EWD03xx/EWD340.html)\n\n## My library\n\n`all.csv` contains an incomplete list of books in my library. The CSV file has 6 columns separated by `,`. \n\n| Name         | Description                                                   |\n|--------------|---------------------------------------------------------------|\n| Author       | One or more authors, `last name, first name` separated by `\u0026` |\n| Title        | Title of the book                                             |\n| Type         | R, S, C (Roman (Fiction), Sachbuch (Non-Fiction), Comic)      |\n| State        | R, U (Read, Unread)                                           |\n| Last read on | Last time I read the book                                     |\n| Emoji rating | My very subjective rating                                     |\n\n### Interacting with the CSV file\n\n#### Using SQLite to query the database\n\n```\nsqlite3 :memory: \\\n '.mode csv' \\\n '.separator ,' \\\n '.import \"|curl -s https://raw.githubusercontent.com/michael-simons/goodreads/master/all.csv\" books' \\\n \"SELECT title FROM books WHERE author like '%King%' ORDER by title\"\n```\n\n#### Using DuckDB\n\n[DuckDB](https://duckdb.org) is an incredible versatile, in-process SQL OLAP database management system and while most likely total overkill for the small dataset, it's fun. Install and start DuckDB:\n\n```sql\n-- Required to directly import the csv file from Github\nINSTALL httpfs;\n-- Just query the dataset\nSELECT DISTINCT author FROM read_csv('https://raw.githubusercontent.com/michael-simons/goodreads/master/all.csv', header=true, auto_detect=true);\n-- Create a table named books\nCREATE TABLE books AS SELECT * FROM read_csv('https://raw.githubusercontent.com/michael-simons/goodreads/master/all.csv', header=true, auto_detect=true);\n-- Query and manipulate as needed\n-- Save the result (overwriting all.csv and sorting it on the way)\nCOPY (SELECT * FROM books ORDER BY author COLLATE de ASC, title COLLATE de ASC) TO 'all.csv' WITH (header true);\n````\n\nOf course, a one shot query like the one above printing all books by Stephen King, is possible too:\n\n```\nduckdb --noheader --list -s \"\nSELECT title FROM read_csv('https://raw.githubusercontent.com/michael-simons/goodreads/master/all.csv', header=true, auto_detect=true)\nWHERE author like '%King%' ORDER by title\"\n```\n\n\u003e [!TIP]\n\u003e Shameless self-advertising: I wrote a book about DuckDB with a couple of friends, called DuckDB in Action and it's available at [Manning](https://www.manning.com/books/duckdb-in-action) or on [Amazon](https://www.amazon.de/Duckdb-Action-Mark-Needham/dp/1633437256/).\n\u003e If you like some nice SQL, Python and Java, have a look.\n\n\n#### Using Neo4j\n\nI used to run a browseable, interactive list of all books on Heroku using a free [Neo4j AuraDB instance](https://neo4j.com/cloud/platform/aura-graph-database/), but Heroku stopped offering a free service a while ago. The repository containing the application code (based on Quarkus) is still available:\n[neo4j-aura-quarkus-graphql project](https://github.com/michael-simons/neo4j-aura-quarkus-graphql). Follow the instruction in the README.\n\nThe essential query to import the CSV into Neo4j looks like this\n\n```cypher\nLOAD CSV WITH HEADERS FROM 'https://raw.githubusercontent.com/michael-simons/goodreads/master/all.csv' AS row FIELDTERMINATOR ',' \nMERGE (b:Book {\n  title: trim(row.Title)\n})\nSET b.type = row.Type, b.state = row.State\nWITH b, row\nUNWIND split(row.Author, '\u0026') AS author\nWITH b, split(author, ',') AS author\nWITH b, ((trim(coalesce(author[1], '')) + ' ') + trim(author[0])) AS author\nMERGE (a:Person {\n  name: trim(author)\n})\nMERGE (a)-[r:WROTE]-\u003e(b)\nWITH b, a\nWITH b, collect(a) AS authors\nRETURN id(b) AS id, b.title, b.state, authors\n```\n\n#### Using xsv\n\n[xsv](https://github.com/BurntSushi/xsv) is a powerful tool for manipulating CSV. Here's an example how to get a list of unique authors\n\n```bash\ncurl -s https://raw.githubusercontent.com/michael-simons/goodreads/master/all.csv | \\\n  xsv select -d \",\" Author |\\\n  uniq\n```\n\n#### Using the webui\n\nIf you have [JBang](https://www.jbang.dev) installed you can start an admin \"UI\" like this:\n\n```bash\njbang admin.java\n```\n\nAccess the page at [localhost:8080](http://localhost:8080).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichael-simons%2Fgoodreads","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichael-simons%2Fgoodreads","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichael-simons%2Fgoodreads/lists"}